MFC에서 xingAPI DLL을 사용하기 위한 개발환경 구축에 대해 알아보겠습니다.
1. xingAPI DLL 로딩 설정하기
xingAPI 패키지를 설치하면 "C:\eBEST\xingAPI\" 경로에 DLL 파일과 공인인증서 라이브러리가 복사됩니다.
프로그램이 이 경로에 있는 DLL을 로딩하도록 설정해도 되지만, 저는 개발하는 소스트리의 바이너리파일(.EXE) 생성 경로에 라이브러리를 복사해 두고 이 라이브러리를 사용하는 것을 권장합니다. 향후 배포 시, 실행 PC의 DLL 버전차이에 따른 다른 동작을 피할 수 있습니다.
xingAPI가 배포된지 몇 년이 지난 시점에 매우 안정화되어 있을 라이브러리라고 기대하고 시작하였으나 바로 얼마 전까지 Visual Studio 6.0 기반이었고 2010 버전 기반으로 업데이트된 지 얼마 안 되어 자잘한 버그들이 지속적으로 리포트되고 있는 것으로 파악되었습니다. 생각보다 부실한 부분이 많으니 서로 다른 시점에 다른 버전의 DLL이 설치되어 있는 기본 설치 폴더의 DLL을 절대경로로 접근하여 로딩하지 말고 소스코드에 포함시킨 DLL을 사용하면서 개발과 테스트를 진행하는 것이 낫습니다.
"C:\eBEST\xingAPI\" 하위에는 Debug버전과 Release버전의 라이브러리 파일이 존재합니다. 프로젝트를 빌드 결과물은 각각 Debug와 Release 폴더에 생성되는데 이 폴더에 다시 "xingdlldbg", "xingdllrel"과 같은 이름의 라이브러리 폴더를 생성하고 그 하위에 라이브러리 파일들을 복사하면 됩니다.
"IXingAPI.h" 파일을 인클루드 하고 빌드하면 에러가 발생할 수 있습니다. 원인은 unsafe 함수 사용에 따른 에러입니다.
수정방법은 아래와 같이 "_s" 가 붙은 안전함수 사용입니다.
BEFORE: _stprintf( szCommLib, _T( "%s\\XingAPI.dll" ), szPath );
AFTER: _stprintf_s(szCommLib, MAX_PATH, _T("%s\\XingAPI.dll"), szPath);
DLL 로딩은 CApp 클래스의 InitInstance()에서 아래와 같이 호출하면 됩니다.
TCHAR szPath[MAX_PATH] = { 0, };
GetModuleDir(szPath, sizeof(szPath));
if (!m_xing.Init(szPath))
바이너리 생성 폴더 하위에 DLL을 상대적으로 위치시키고 로딩하는 것을 권장하므로 GetModuleDir() 내부에 아래와 같이 구문을 추가합니다.
#ifdef _DEBUG
lstrcat(szFilePath, _T("xingdlldbg"));
#else
lstrcat(szFilePath, _T("xingdllrel"));
#endif /* _DEBUG */
2. 버전관리 방법
git을 통한 소스코드 버전관리는 업데이트 이력 추적과 관리를 편리하게 해 주므로 사용하시길 추천합니다.
github.com 또는 bitbucket.com, gitlab.com 등에서 프라이빗 저장 공간을 무료로 제공해 줍니다.
간단한 사용법은 구글에 "git cheat sheet"로 검색해 보세요.
버전관리를 위해서 추가로 필요한 도구는 Compare Tool입니다. 보통 Ultra Compare를 많이 쓰는 것 같은데
저는 Beyond Compare를 추천합니다. 얼마 안 하니까 사서 쓰는 데는 무리가 없을 겁니다.
Compare Tool을 쓰냐 안 쓰냐에 따라 코딩 인생이 달라진다고 생각합니다.
저는 프로젝트명을 "noyecube"로 이름 지었고 그 하위에 "git" 폴더를 두고 이 폴더에서는 git pull, push 작업만 합니다.
실제 작업은 "work"폴더에서 합니다.
소스코드를 git에 반영하고 싶으면 현재 폴더 우클릭 후 "Select Left Folder for Compare"를
선택하고, git 폴더에 가서 우클릭을 하여 "Compare to <Selected Left Folder Name>"을 선택하세요.
그럼 아래와 같이 두 경로가 서로 비교되어 나옵니다. 변경 발생한 파일만 추려낼 수 있고 변경 파일 클릭하여
변경 내역 확인 및 변경 내용의 선택적인 반영이 가능합니다.
실수를 안 한다는 가정하에서는 "git status", "git add .", "git commit", "git push" 네 가지 명령어만 사용하시면 됩니다.
github를 사용하면 소스코드 반영이력이 있는 날을 달력에 표시해 줍니다. 잔디를 심는다고 표현하던데 열심히 심어 보세요.
3. 헤더파일 관리 방법
저는 키움증권의 Open API로 개발을 시작했다가 이베스트투자증권의 xingAPI로 넘어온 케이스입니다.(개발을 하다 보니 서로 장단점이 있어서 나중에는 섞어 써야 할 것 같습니다.)
DLL 방식의 개발을 하고 싶었던 것도 있지만 키움에서는 코드 타이핑 막일이 너무 심했습니다. 키움은 TR별로 헤더파일을 제공하지 않아서 변수명도 내가 하나하나 생각해서 정해줘야 했고 TR응답 하나에 저장해야 할 변숫값이 한두 개가 아닌데 변수명을 창작하랴, 타이핑하랴 너무 힘들었습니다. 결정적으로, 주식가격을 받아오는데 "1234"로 안 오고 "+1234"로 오는 문자열에서 '+'를 떼어내야 하는데, 어디엔 '+'가 붙어있고 또 어디엔 없고, 더러워서 때려치웠습니다. 키움이나 이베스트나 서버와의 데이터 교환을 문자열로만 하는 것도 맘에 안 드는데 일관성이 없는 응답값은 참을 수가 없네요.(그렇다고 이베스트가 일관성이 있다는 것은 아님)
이베스트투자증권에서는 CPP형태로 헤더파일을 제공합니다. 라이브러리에 같이 동봉해 주면 좋을 것 같은데 그렇게까지는 안 해주지만 DevCenter 프로그램에서 TR목록을 하나하나 클릭해 가면서 하나하나 다운로드할 수 있습니다. 그렇게 207개를 다운로드하였습니다. 보통은 자기 전략에 필요한 TR만 프로젝트에 추가해서 쓸 텐데 제 성격상 그게 안되어서 폴더명 "xinghdr"를 만들고 그 안에 207개의 모든 헤더파일을 넣었습니다. 그리고 "allxingheaders.h" 파일을 생성 후 거기서 모든 헤더파일을 include 하였는데 include 하는 것도 막일이라서 include 구문은 엑셀에서 생성하였습니다. 패턴이 있는 코드 작성은 엑셀활용 추천합니다. 아래에서 작성한 엑셀파일은 헤더파일 생성에만 사용하지 않고 TR 속성 테이블(헤더타입, 크기, TR문자열, 초당 전송 허용 수) 작성에도 요긴하게 사용하였습니다. 엑셀을 활용한 코드 생성은 따로 다뤄야겠네요.
이상으로 xingAPI DLL을 사용하기 위한 방법과 몇 가지 팁을 알아보았습니다.
'트레이딩 > 시스템트레이딩' 카테고리의 다른 글
[xingAPI][차트 데이터 수집기 만들기](4) 데이터 수집 설정 기능 (0) | 2021.10.12 |
---|---|
[xingAPI][차트 데이터 수집기 만들기](3) 로그인/로그아웃 (0) | 2021.10.04 |
[xingAPI][차트 데이터 수집기 만들기](2) 프로젝트 셋업 (2) | 2021.10.04 |
[xingAPI][차트 데이터 수집기 만들기](1) 프로젝트 생성 및 화면 만들기 (0) | 2021.10.01 |
[xingAPI][T1857] T1857 e종목검색(조건검색)(DLL버전) (5) | 2020.11.29 |