일봉받아오기

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 되도 않는 데이터베이스 공부해보겠다고 설치다가 올리는 시간이 늦어졌네요... 분명 자체 HTS를 만들기 위해서는 DB를 구축하긴 해야할텐데, 어떻게 어디서부터 해야할지 모르겠어요 ㅜㅜ 혹시 아시는 분은 댓글로 남겨주세요 ㅎㅎ

  오늘은 일봉을 불러오는 법을 알아볼텐데요, 사실 전시간에 했던 주식 기본정보랑 방법은 거의 비슷해요. KOAstudio에서 나온 샘플처럼 하면 불러와집니다. 자 시작해볼까요!


  이번엔 탭을 추가했습니다. 탭 추가하는 방법은 전 시간에 나와있죠? 따라해보세요 ㅎㅎ


  첫번쨰 탭의 내부 모습입니다. 종목코드와, 기준일자를 받아와서 버튼을 누르면, 900일치의 일봉을 받아올꺼에요 


 우선, 첫번째 탭안에 있는 버튼에 위와 같은 코드를 작성해줍니다. GetDigItemText 함수는 EDIT_Control 에 넣은 사용자의 변수를 CString 자료형에 넣어주는 역할을 해줍니다. 그 이후의 함수들은 KOAStudioSA 에 있는 안내를 따라서 내용을 채워준거에요. 아래 참고 그림 추가해드립니다. 아, 그리고 CommRqData할때 중간에 0이 아니라 2인 이유는, 연속으로 주식 정보를 받기 위해서입니다. 일봉은 한번 불러올때 0~899까지 총 900일치 정보가 한번에 들어오는데, 만약 여기서 '2'로 설정하고 다시 불러온다면, 900~1799까지의 정보가 불러와지게 됩니다. 즉, 연속적으로 다음 데이터가 불러와진다는 것이지요! 하지만, 0이라면 다시 0~899정보가 불러와지겠죠?


  그다음에는 수신 이벤트가 발생하였을때, 처리해주는 코드를 작성해야겠지요? 예전에 주식기본정보를 요청했었던 그곳에 가서 위의 박스를 덧붙여 줍시다. 단, 여기서 out == 주식일봉차트조회 일때 발생하도록 조건문을 씌어주셔야되용~! 그리고, 안에 i를 0부터 899까지 증가시키는 이유는 우리가 불러오는 정보가 한번에 900일치이기 때문입니다. 더 적게 돌려도 상관은 없어요 ㅎㅎ


  이렇게 해서 위와 같은 프로그램이 만들어졌습니다. 삼성전자의 주식 정보가 일자별로 쭉 나오는걸 확인해볼 수 있네요.


이번에 생각나는건데, 거래량과 주식정보를 이용해서 단타를 할수있지 않을까요? 이번에 한번 시도해봐야겠어요. 그럼 모두들 화이팅 하세요!

----------------------------------------------------------------------------------------------------------------------------------------------------------------<요약>

- GetDigItemText 함수 사용법

- 연속적으로 일봉을 받아오는 법



MFC Tab 만들기

----------------------------------------------------------------------------------------------------------------------------------

MFC프로그램을 하다보면,

Tabcontrol을 만들어야 하는 경우가 생길 것이다.

그 탭컨트롤을 만드는 과정을 알아보자.

모든 프로그램은 Dialog based로 하는 것을 기준으로 한다.

 

우선 dialog based 프로젝트를 만든다.

다이어로그 베이스 프로젝트는 앞의 포스트에서 미리 설명을 하였다.

test라는 프로젝트 이름으로 만들었다.

만든 뒤에, TODO:…. 된 부분을 지우고,

그림에서 보듯 Toolbox에서 Tab Control을 드래그 해서 아래와 같이 화면에 붙여 넣어준다.

만약 Toolbox가 보이지 않는다면,

메뉴바의 view에서 toolbox를 찾을 수 있다.

 

 

이렇게 만들어진 Tab에 이름을 정해주자.

그림에서 보듯이 Add Variable을 클릭한다. (변수 추가)

새로 창이 뜨는데,

Access는 public, Variable type은 CTabCtrl인지를 확인하고,

Variable name에는 m_Tab이라고 적자. (대/소문자 구분을 하기 때문에 확실하게 적어야 된다.)

이제 Finish를 눌러주면 지금 만든 탭의 이름은 m_Tab가 된다.

 

이제는 프로그램 내용을 수정할 차례이다.

위의 그림처럼 CtestDlg.cpp 파일에서 OnInitDialog를 찾는다.

이 안의 내용을 수정할 것인데,

 

 

 

Code Snippet
  1. BOOL CtestDlg::OnInitDialog()
  2. {
  3.     CDialog::OnInitDialog();
  4.  
  5.     // Add "About..." menu item to system menu.
  6.  
  7.     // IDM_ABOUTBOX must be in the system command range.
  8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  9.     ASSERT(IDM_ABOUTBOX < 0xF000);
  10.  
  11.     CMenu* pSysMenu = GetSystemMenu(FALSE);
  12.     if (pSysMenu != NULL)
  13.     {
  14.         BOOL bNameValid;
  15.         CString strAboutMenu;
  16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  17.         ASSERT(bNameValid);
  18.         if (!strAboutMenu.IsEmpty())
  19.         {
  20.             pSysMenu->AppendMenu(MF_SEPARATOR);
  21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  22.         }
  23.     }
  24.  
  25.     // Set the icon for this dialog.  The framework does this automatically
  26.     //  when the application's main window is not a dialog
  27.     SetIcon(m_hIcon, TRUE);            // Set big icon
  28.     SetIcon(m_hIcon, FALSE);        // Set small icon
  29.  
  30.     // TODO: Add extra initialization here
  31.  
  32.     CString    strOne = _T("First");
  33.     CString    strTwo = _T("Second");
  34.     CString    strThree = _T("Third");
  35.     m_Tab.InsertItem(1, strOne);
  36.     m_Tab.InsertItem(2, strTwo);
  37.     m_Tab.InsertItem(3, strThree);
  38.  
  39.     return TRUE;  // return TRUE  unless you set the focus to a control
  40. }

그 안의 내용에서 위와 같이 추가를 한다.

추가 된 내용은 32번째 줄에서 37번째 줄인데,

32 - 34번째 줄은 탭컨트롤에서 탭의 제목으로 들어갈 내용 들이다.

35 - 37번재 줄은 몇 번째 탭에 어떤 이름이 들어갈 지에 대한 내용으로,

35번째 줄을 보면 (1, strOne)으로 되어있는데, 1번째 탭에 strOne에 들어있는 내용을 넣는 다는 말이다.

여기서 strOne에는 First라는 내용이 들어 있기 때문에

1번째 탭은 First라는 이름으로 들어간다.

여기까지 수정을 하고, 빌드를 해보자.

예상한 대로 1번째 탭의 이름은 First이고 나머지도 예상 대로 됬다.

이제 각각의 탭에 내용을 넣어줄 차례이다.

 

 

 

지금부터 하는 과정은 뒤에서 그만이라는 말이 나올때까지의 부분을 3번 반복해준다.

(탭이 3개일 경우에 3번으로 탭의 수에 맞춰서 해주면 된다.)

위의 그림처럼 Resource View를 클릭을 해서 Resource view를 열어주자.

Resource View의 화면이다.

여기서 오른쪽 버튼을 눌러서, 다이어로그를 추가해주자.

그러면 Dialog1이라는 다이어로그가 추가가 된 것을 볼 수있다.

이 다이어로그는 아까의 탭안에 들어갈 내용들을 넣어줄 다이어로그이다.

따라서 우리가 한 것처럼 탭이 3개가 있으면 3개의 다이어로그를 만들어 주어야 한다.

위의 그림처럼 IDD_Dialog1을 클릭한 뒤

메뉴의 view에서 Properties Window를 클릭해서 프로퍼티 창을 열어준다.

이러한 창을 볼 수 있는데, 여기서 ID를 자신이 원하는 ID로 바꾸어준다.

이 ID는 지금 새로 만드는 다이어로그의 이름으로서 나중에 탭컨트롤에서 쓸 것이다.

기본으로는 IDD_Dialog1으로 되어있을 것이다.

이 화면은 ID를 이미 바꾸어 놓은 것이다.

이 ID는 자신이 원하는 것도 괜찮지만, 우선은 똑같이 IDD_First로 해준다.

그런 뒤에 화면의 다이어로그를 클릭해준다.

그러면 프로퍼티 창이 바뀌는 것을 볼 수 있는데,

여기서 Border를 None으로,

Style을 Child로 바꾸어준다.

그러면 이 다이어로그가 바뀌는 것을 볼 수 있다.

border를 none으로 바꿈으로서 경계가 다 없어졌고,

style을 child로 바꿈으로서 다이어로그 안에 들어갈 수 있게 되었다.

 

이제 이 다이어로그의 구분을 해주기 위해,

static text를 추가해주자.

역시 tabcontrol처럼 드래그하면 된다.

막 드래그 한 상태이면 위의 그림처럼 선택이 되어있을 것이다.

이 상태에서 프로퍼티 윈도우를 보면 내용을 수정할 수 있다.

여기서 Caption을 수정해주면된다.

First라고 수정을 해주면,

바뀐 것을 알 수 있다.

이제 이 다이어로그에 이름을 붙여줄 차례이다.

다이어로그에서 오른쪽 버튼을 눌러서 Add Class를 눌러주고,

뜨는 창에서

그림과 같이 Class name을 정해준다.

여기선 CFirst로 정해주었다.

그리고 Base class 가 CDialog인지를 확인하고 finish를 눌러준다.

위에서부터 지금까지의 과정(새로운 다이어로그를 만들고 이름을 붙여주는 과정)을

3번 반복한다.

물론 각각의 이름을 다르게 해주어야 한다.

여기선 두번째, 세번째 다이어로그의 이름을 CSecond, CThird라고 해주었다.

여기까지의 과정이 완료가 되었다면 이제부터가 시작이다.

 

testDlg.h파일을 열어서 다음과 같이 수정한다.

Code Snippet
  1.  
  2. // testDlg.h : header file
  3. //
  4.  
  5. #pragma once
  6. #include "afxcmn.h"
  7. #include "First.h"
  8. #include "Second.h"
  9. #include "Third.h"
  10.  
  11.  
  12. // CtestDlg dialog
  13. class CtestDlg : public CDialog
  14. {
  15. // Construction
  16. public:
  17.     CtestDlg(CWnd* pParent = NULL);    // standard constructor
  18.  
  19. // Dialog Data
  20.     enum { IDD = IDD_TEST_DIALOG };
  21.     CFirst        m_First;
  22.     CSecond        m_Second;
  23.     CThird        m_Third;
  24.     CWnd*        m_pwndShow;
  25.  
  26.     protected:
  27.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  28.  
  29.  
  30. // Implementation
  31. protected:
  32.     HICON m_hIcon;
  33.  
  34.     // Generated message map functions
  35.     virtual BOOL OnInitDialog();
  36.     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  37.     afx_msg void OnPaint();
  38.     afx_msg HCURSOR OnQueryDragIcon();
  39.     DECLARE_MESSAGE_MAP()
  40. public:
  41.     CTabCtrl m_Tab;
  42. };

위의 내용을 보면

7, 8, 9번째 줄에 방금 만든 헤더파일을 추가 시켜줬음을 알 수 있다.

또한, 21, 22, 23, 24번째 줄에도 내용이 추가 되었다.

각각의 다이어로그의 이름에 맞춰서 그 다이어로그를 제어할 수 있는 부분을 추가해주었다.

이제 다시 testDlg.cpp파일을 열어서

CtestDlg를 찾아서 아래와 같이 수정을 해준다.

5번째 줄만 수정을 해주었다.

Code Snippet
  1. CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
  2.     : CDialog(CtestDlg::IDD, pParent)
  3. {
  4.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  5.     m_pwndShow = NULL;
  6. }

같은 파일(testDlg.cpp)에서

OnInitDialog에

Code Snippet
  1. // TODO: Add extra initialization here
  2.  
  3. CString    strOne = _T("First");
  4. CString    strTwo = _T("Second");
  5. CString    strThree = _T("Third");
  6. m_Tab.InsertItem(1, strOne);
  7. m_Tab.InsertItem(2, strTwo);
  8. m_Tab.InsertItem(3, strThree);
  9.  
  10. CRect Rect;
  11. m_Tab.GetClientRect(&Rect);
  12.  
  13. m_First.Create(IDD_First, &m_Tab);
  14. m_First.SetWindowPos(NULL, 5, 25,
  15.     Rect.Width() - 12, Rect.Height() - 33,
  16.     SWP_SHOWWINDOW | SWP_NOZORDER);
  17. m_pwndShow = &m_First;
  18.  
  19. m_Second.Create(IDD_Second, &m_Tab);
  20. m_Second.SetWindowPos(NULL, 5, 25,
  21.     Rect.Width() -12, Rect.Height() - 33,
  22.     SWP_NOZORDER);
  23.  
  24. m_Third.Create(IDD_Third, &m_Tab);
  25. m_Third.SetWindowPos(NULL, 5, 25,
  26.     Rect.Width() - 12, Rect.Height() - 33,
  27.     SWP_NOZORDER);
  28.  
  29. return TRUE;  // return TRUE  unless you set the focus to a control

아까 탭을 만들때 추가시켜준 부분 아래에 다음과 같이 추가를 해준다.

중요한 것은 16번째 줄의 내용은 한번만 추가해주는 것이다.

탭컨트롤을 만드는 것은 책에서 보고 따라한 것인데

아무생각없이 3번 복사했더니, 탭컨트롤이 똑바로 초기화가 안되어서

실행을 했을 때, 탭안의 내용이 바로 실행이 되어야 하는데,

다른 탭을 일일이 눌러주지 않으면 처음탭의 내용이 보이기만하고 실행이 안되는 경우가 생긴다.

 

다시 Resource view로 돌아와서,

그림에서 보이는 화면을 클릭해주고, (탭안을 클릭해야됨)

프로퍼티 창을 보면(위에 설명 해놨음)

이 화면에서 오른쪽의 번개마크를 누르면 아래와 같이 화면이 바뀌게 된다.

이 화면에서, 밑에서 두번째에 있는

TCN_SELCHANGE를 누르면 창이 뜨는데,

OnTcnSelchangeTab을 추가할 수 있게 된다.

추가를 하면 testDlg.cpp파일로 돌아오게 되는데,

Code Snippet
  1. void CtestDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.     // TODO: Add your control notification handler code here
  4.     *pResult = 0;
  5. }

이런 것이 생긴 것을 볼 수 있다.

 

Code Snippet
  1. void CtestDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.     // TODO: Add your control notification handler code here
  4.     if(m_pwndShow != NULL)
  5.     {
  6.         m_pwndShow->ShowWindow(SW_HIDE);
  7.         m_pwndShow = NULL;
  8.     }
  9.  
  10.     int nIndex = m_Tab.GetCurSel();
  11.     switch(nIndex)
  12.     {
  13.     case 0:
  14.         m_First.ShowWindow(SW_SHOW);
  15.         m_pwndShow = &m_First;
  16.         break;
  17.     case 1:
  18.         m_Second.ShowWindow(SW_SHOW);
  19.         m_pwndShow = &m_Second;
  20.         break;
  21.     case 2:
  22.         m_Third.ShowWindow(SW_SHOW);
  23.         m_pwndShow = &m_Third;
  24.         break;
  25.     }
  26.     *pResult = 0;
  27. }

위와 같이 수정을 해주면 탭컨트롤 추가가 끝이다.

이로서 완성이 되었다.

실행을 해보면,

위와 같이 잘 된 것을 볼 수 있다.^^


--------------------------------------------------------------------------------------------------------------------------------------------

<출처>

http://jaiyun.tistory.com/5 

버전처리 오류 해결하기

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 이번엔, 버전 처리 오류를 해결하는 방법을 알아 볼거에요. 그 과정은 가이드 북에 잘 나와 있는데요, 제가 느낌점을 좀더 추가해볼꼐요.


 위와 같이 버전처리 창이 뜰 경우, 처리 과정은 다음과 같습니다.

1. 현재 진행중인 프로젝트를 완전 종료해버린다.  (비주얼스튜디오)

2. KOA스튜디오를 킨다.

3. 로그인한다.

4. 위와 같은 버전처리 창이 뜨면, KOA 스튜디오를 종료하고, 확인을 누른다.

5. 성공적으로 해결 ㅎㅎ


모두들 성공하는 주식투자 하시기 바랄꼐요~


 주식 기본 정보 가져오기

----------------------------------------------------------------------------------------------------------------------------------------------------------

 주식 기본 정보 가져오는건 지난주에 다 해뒀는데 이번 주에 개인적으로 생각할 일들이 있어서 포스팅을 못했네요 ㅜㅜ

 그래두 앞으로는 짬을 내서 계속 올려야겠어요!! 우리 함께 화이팅 해용 ㅎㅎㅎ


 오늘은 주식 기본 정보를 가져오는걸 해볼꺼에요. HTS를 할때 해당 주식의 시가총액이라든가, 현재가, 시가, 종가 등등 기본적인 데이터를 가져오는걸 할 수 있다면 이제 어느정도 감을 잡았다는 거겠죠?? 주식 기본 정보를 가져오는 것도 생각보다 어렵지 않아요. 다만, 이벤트 처리 개념을 이해하셔야 합니다! 시작해봅시다~

 주식 기본 정보를 가져오기 위해서는 위와 같이 서버로부터 정보를 받아야 합니다. 그 흐름은 위와 같은데요, 이를 순서에 따라 정리해보면, 

     1. 원하는 걸 상자에 담습니다.

     2. 서버에 해달라고 보냅니다.

     3. 서버는 확인하고 처리해드렸다고 합니다.

     4. 상자를 받아서 풀어봅니다.

 이와 같이 되는데요, 이를 함수로 나타내면, 

     1. SetInputValue : 내가 얻고 싶은 아이템을 넣습니다. ex) 종목코드, 계좌번호 등등...

     2. CommRqData : 아이템의 어떤 정보를 얻고 싶은지를 설정해서 보냅니다.

     3. OnReceiveTrData : 서버가 처리했다는 이벤트를 감지합니다.

     4. GetCommData : 이벤트를 감지한 다음, 원하는 정보를 꺼냅니다.

여기서 3번 이벤트 부분은 기존 함수와는 다른 방법으로 설정하게 되는데요 밑의 과정을 따라해볼까요?

-----------------------------------------------------------<참고 함수>-----------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


 우선, 프로그래밍을 하기 이전에, 전에 보았던 KOA Studio를 켜서 확인해볼께 있어요. <TRcode>, <함수>, <화면목록>, <동작방식>, 인데요. 서버한테 요청할 때 필요한 것들이에요. CommRqData(sRQName, sTrCode, nPrevNext, sScreenNo) 함수 인자에 각각

  sRQName = TrCode 옆에 있는 말

  sTrCode = 어떤 TrCode 인지?

  nPrevNext = 보통 0 으로 설정 (0:조회, 2: 연속)

  sScreenNo = 화면번호 (==> 영웅문의 화면 번호를 이야기함, 위의 그림에서 탭을 변경하여 확인가능.)

이런 식으로 들어갑니다. 각각의 인자들을 어디서 얻을 수 있는지 알아두세요!!


 아, 그리고 인터페이스를 조금 바꿧는데요, 이젠 다 하실수 있죠? 그런데 제가 지난번에 까먹고 말씀 못드렸는데, List_box에서 속성 - Sort 부분을 False로 바꿔주세요. True면 자동으로 오름차순으로 정리해준답니다. 그러면 안되잖아요 ㅎㅎ


 이제 이벤트 처리를 해줄꺼에요. 맨 처음 도형에서 보았을 떄 처럼, 우리가 서버에게 요청을 했을 떄 서버가 요청을 했는지 알 수 있으려면 위와 같이 이벤트처리를 해줘야 합니다. openAPI 부분에서 마우스 우클릭을 하면, 이벤트 처리기 추가... 가 나오는데요, 이걸 누르고 위와 같이 OnReceiveTrData를 선택해주고  추가 및 편집 버튼을 눌러주세요. 그러면, 자동적으로 이벤트 처리에 필요한 코드들을 추가해줍니다. 이는 stock_ver_0.1Dlg.cpp와 헤더 파일에서 볼 수 있어요.


 위의 버튼을 누를 때 서버에게 요청을 하려고 하는데요, 일단 우리는 알려고하는 단계니, 미리 정보를 넣어 놓고 보내는 연습을 해볼꼐요. 인자는 위의 코드와 처음 부분의 함수 설명을 보세용, 저는 삼성전자의 정보를 요청했습니다.


  이 부분은 주식 기본 정보를 요청한 후 이에 대한 이벤트가 발생했을 때 들어가지는 함수 부분입니다. 우리는 이 부분에서 정보를 확인할 거에요. 정보 확인은 우선, 내가 원했던 이벤트가 맞는지? 확인을 한 후, 얻고 싶은 정보에 대한 인덱스를 입력해줍니다. 그러면, 자동으로 파싱되어서 정보가 return 되어 집니다. 그런데, 여기서 받아 지는 정보 앞 뒤로 쓸데없는 공백이 함께 파싱이 되요. 그래서 CString 함수에 넣어서 Trim()을 해서 앞 뒤의 공백을 제거해주는 겁니다. 그 뒤 위처럼 출력하거나, 다른 곳에서 사용하시면 됩니당.


짠! 결과 화면입니다. 깔꼬롬하게 나오는 걸 확인할 수 있어요. 저거 1주만이라두 가지고 싶네요 ㅎㅎ...

여러분 앞으로도 계속 올릴 예정이니 서로 으쌰으쌰해요~ 화이팅!

 로그인 정보 확인하기

---------------------------------------------------------------------------------------------------------------------------------------------------------

 네! 안녕하세요. 오늘은 로그인도 했으니 로그인 정보를 확인해보는 시간을 가져보겠습니다.

참고로 제 블로그의 내용은 환델 님의 블로그를 보고 수정해보고 배워가는 형식으로 작성하고 있습니다!

저 분 블로그는 C#인데 전 C++이니까 코드가 살짝달라요. 어쨋든 로그인 정보를 확인해봅시다!

 우리는 이 함수를 통해서 로그인 정보를 받아올 수 있어요! 이런 정보는 모두 지지난 시간에 말씀드린 다운 받는 곳의 Guide 파일에 있답니다.

kiwoom_openapi_plus_devguide_ver_1.1.pdf

혹시 몰라서 첨부해드려요 ㅎㅎ

저기 BSTR은 visual C에서 사용하는 파일 형식으로 우리는 _T(String a) 과 같은 형식으로 쉽게 사용할 수 있어요. 있다가 예제를 보면 이해가 갈꺼에요.


 지난 시간과는 인터페이스가 많이 달라졌죠? 아마 저기 생긴 박스가 뭔지 궁금하실거에요.


 도구상자에서 빨간색 박스 안의 Box를 가져와서 편집해놓은거에요. 하얀색 박스가 List Box로 우리가 원하는 정보를 넣을수도, 뺄수도있어요. Group Box는 그냥 고정해서 쓸겁니다.


 우리가 하얀색 박스인 List Box에 무언가를 넣기 위해서는 객체로 선언해서 넣아야 하는데요, List Box 에 마우스 오른쪽 클릭을 하고 변수추가 버튼을 누르면 위에 같은 창이 떠요. 그러면 변수 이름부분에 이름을 쓰시고 마침을 눌러줍시다!


 버튼이 눌릴때 Login 정보를 업로드를 하도록 할꺼에요. 그러기 위해서는 Login_Update 버튼 쪽에 List_box스트링 추가 함수를 넣어야 겠죠? 

User_infor.AddString(theApp.stock.GetLoginInfo(_T("ACCOUNT_CNT")));

  - User_infor ==> List 박스의 변수 이름

  - User_infor.AddString() ==> List 박스에 스트링을 추가한다.

  - theApp.stock.GetLoginInfo ==> Login정보를 불러온다. 

  - _T("ACCOUNT_CNT") ==> 전체 계좌 개수를 반환한다.

     => 이부분에서 왜 _T()를 넣으는 건가 궁금하시는 분들이 계실꺼에요. 이건 String 속성을 편리하게 BSTR로 바꿔준답니다. 꿀팁이니까 기억해주세요!

이런 방식으로 모든 정보를 다 추가해봅시다.


  이제 실행해서... 로그인하고~ (로그인에 성공하면 로그인 창은 사라져요) Login_Update 버튼을 누르면...


자 그러면 완성입니다! 모두들 자신의 로그인 정보를 확인해보세요 ㅎㅎ 이젠 주식 정보를 받아오는 걸 해봐야겠네요!

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

(참조)

 List_box 함수 보기


로그인 창 띄우기

---------------------------------------------------------------------------------------------------------------------------------------------------------

안녕하세요! 오늘은 키움증권 API를 이용하여 로그인 창을 띄어보는 것까지 해볼거에요. 아직까지는 쉬운것 같습니다. 그럼 그림을 보면서 알아볼까요!

 우선, 저희는 C++기반의 MFC 를 사용할꺼잖아요? C++에 있는 MFC 응용 프로그램을 선택해줍시다.


 그 다음 나오는 창에서 꼭 대화 상자 기반으로 선택하셔야되요~


 여기까지 하셨으면 이런 창이 뜨겠죠?


 여기서 버튼을 한번 만들어 줄꺼에요. 왼쪽의 도구상자 탭에서 버튼을 창으로 드래그 앤 드롭 하시면 버튼이 생깁니다. 간단하죠??


  버튼을 누르시고 오른쪽 하단의 속성 탭을 누르시면, 속성을 변경할 수 있어요. 우리는 버튼 이름만 바꿀꺼니까 캡션 부분에서 Start로 바꿔봅시다.


  여기가 가장 중요한데요, 이제 필요한 두 가지 기반작업을 할거에요. 첫번째로는 API를 다운 받을 것이고, 두번쨰로는 키움증권의 Active X를 활성화 시킬거에요. 

 일단, 우리에게 필요한 API를 다운 받겠습니다. 저는 지난 시간에 말씀드렸던 사이트 에서 다운받을 건데요, 어렵지 않아요. 밑의 그림을 따라가 봅시다.


 여기서 C++을 사용하고 있는 샘플을 다운받아서 압축을 풀면


  내부에 khopenapictrl1.h, khopenapictrl1.cpp 이 두파일이 있어요 이걸 프로젝트로 복사해주세요. 그리고 복사한다음에 프로젝트에도 포함시켜야겠죠? cpp확장자는 소스에, h 확장자는 헤더 파일에 넣어주세요~


 헤더를 추가할 시간입니다. stdafx.h 에 키움증권에서 제공하는 헤더를 include 해줄까요? #include "khopenapictrl1.h"

 

 키움증권에서 제공하는 Active X를 넣어 봅시다. 대화상자에서 오른쪽클릭을하면, Active X 컨트롤 삽입 항목이 있는데, 이걸 누르고 위의 KHOpenAPI Control을 선택해 주세요


 위의 그림처럼 나오면 성공이에요. 


 API를 추가 해주었으니 이걸 사용할려면 API의 객체를 선언해주어야 해요. 위와 같이 선언해줄까요? 이름은 뭐 상관없어요.


 아까 Start 버튼을 더블 클릭하면 자동적으로 

void Cstock_examDlg::OnBnClickedButton1() 함수 쪽으로 이동하게 되는데요, 여기서 위와 같이 소스를 추가해주세요. CommConnect() 하는 함수가 로그인을 하게 하는 함수이구요, return 값은 0이면 성공, 음수이면 실패입니다.


 그 다음에는 Active X와 우리가 선언한 객체를 연결해줄거에요. DDX_Control을 통해서 이걸 연결해주면됩니다.

 

 이제 실행시키면 위와 같은 창이 뜰텐데요, 여기서 Start 버튼을 눌러볼까요??


  이렇게 로그인 창이 뜨는걸 볼수 있습니다!! ㅎㅎ 이제 거이 뭐 전 되게 신기합니다.


하지만 로그인 하려고하면 다음과 같은 오류같은게 뜨는데요, 이건 다음 시간에 해결해보도록하겠습니다... 아 어떻게 해결하는거지... ㅜㅜ


어쨋든 이렇게 한발자국씩 나가다보면 언젠간 나만의 HTS를 구축할수있겠죠?? 그때까지 화이팅 해봅시다!! 화이팅 ㅎㅎ

---------------------------------------------------------------------------------------------------------------------------------------------------------

(참고)

DDX_Control

MFC Class

------------------------------------------------------------------------------------------------------------------------------------------------------------------  * 버전 처리 오류 해결! - 2016-07-02

버전 처리 오류는 그냥 키움 번개가 업그레이드 됨에 따라서 생기는 오류? 인것 같아요.

키움 번개만 실행시켜서 버전업그레이드를 시켜준다음에 실행시키면 오류는 사라집니다!

키움증권 API 입문

---------------------------------------------------------------------------------------------------------------------------------------------------------

 어떻게 하면 빈둥대면서 돈을 벌수있을까..?? 그 답은 자동 투자 프로그램에 있지 않을까요? ㅋㅋ 어쨋든 1년 휴학을 하게 되면서 그전에 소홀했던 경영학과 공부와 앞으로 업으로 삼을 전자공학의 중간선 상에서 이 프로젝트를 진행하려고 합니다!

 우선 키움 증권 API를 기반으로 HTS를 만드려고 해요~ 이는 키움증권 홈페이지에서 회원 가입을 한뒤 받을 수 있어요.

https://www3.kiwoom.com/ (키움증권 홈페이지)

 회원 가입 후 밑의 탭을 보면 빨간색으로 쳐진 대가 있는데 저길 누르면...


 로드맵이 나오는데 밑의 로드맵에 따라서 설치를 진행하면 되요! 단, Step2에서는 키움 Open API+ 모듈을 설치하기 이전에 번개(HTS)를 먼저 다운 받아야 합니다. 안그러면 에러가 뜨네요. 그리고 마지막 Step 4까지 진행하면 일단은 우리의 목표의 반은 한겁니다. 시작이 반이래잖아요?

 



아 그리고 전 C/C++ 로 프로그래밍을 할거에요. 아직 언어 하나를 완벽히 다루지 못해서 이번 기회에 C++을 마스터 해야겠습니다.




 이제 다 설치를 하셨으면 KDA Studio를 켜보세요. 그럼 밑의 창이 나오는데, 빨간색으로 쳐진 <Open API 접속> 버튼을 눌러서 로그인을 하세요.



 그러면, 비어있던 창에 여러가지 항목이 생겨요. 우리가 주목해야할 탭은 바로 TR목록입니다. TR 목록 탭에서 여러 항목을 누르면 해당 내용을 추출할 수 있는 함수들을 보여주는데요, 종목정보 탭에서 본 종목코드를 우측 상단에 입력해 넣으면 어떻게 output이 작동하는 지도 볼수가 있어요.



 전 게임빌의 종목코드를 쳐보았는데요 저기 빨간색으로 쳐진 부분들이 변한 게 보이시죠?? 저렇게 함수가 어떻게 작용하는지 하나하나 볼수가 있답니다. ㅎㅎ 이제 시작하는 저에게는 신기하기도 하고 유용할 것 같네요.




 오늘은 일단 키움증권 API를 설치하고 어떤 함수들이 있는지 확인하였는데요, 내일 부터는 직접 C++코딩을 어떻게 해야하는지 MFC 기반으로 살펴보도록하겠습니다~ 오늘도 즐거운 하루 되세요!





VS2013에서 MBCS(Multi-Byte Character Set)로 설정된 MFC 프로젝트를 컴파일하면 다음과 같은 에러 발생한다.

 

error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets 369 5 IOKF_Client

 

 

2013 부터는 MBCS용 MFC 라이브러리(DLL)가 제공되지 않는다.

디볼트인 유니코드를 사용 권장하기 때문... --;

 

 

아래 사이트에서 다운받고 설치하면 된다.

http://www.microsoft.com/ko-kr/download/details.aspx?id=40770


출처 : http://intra97.tistory.com/trackback/240

+ Recent posts