본문 바로가기
트레이딩

Open API-W 활용. 실시간 시세의 0시 직후 일자,시각정보 부실, 해결책.

by 리치굿맨 2016. 9. 26.

 

개요

 

Open API-W 이용하여 실시간 시세(체결, 호가)로 전달되는 데이터중 일자정보와 시각정보를 중요하게 활용하는 로직인 경우, 0시 직후 시점의 호가정보 시각처리 오류 발생할 위험성이 있으며, 본 글에서는 구체적으로 어떤 지점이 위험한지 보이며, 해결책 정리.

 


 

 

상세

 

문제지점. - 아래 4.

1. Open API-W 에서 제공되는 체결정보, 호가정보 모두 매번의 시세데이터에는 시분초 형식(예 : 230311)의 시각정보를 제공해준다.

2. 상기1의 시각정보에는 일자(예: 20160926)정보는 없으며 일자정보는 체결이벤트로만 제공되고, 호가정보에는 일자 정보 제공되지 않는다.

3. 만일 코딩하는것의 로직이 상기 체결정보로 전달된 일자기반으로 시각 처리하는 루틴이 있다고 하자.
예를들어,9월 26일 24시 이전 체결정보로 전달된 일자 9월 26일과 호가정보 수신시 확보된 시각(예 23시 50분 55초)2개 모두 동시에 활용하여 현재 수신된 호가 데이터는 "2016년 9월 26일 23시 50분 55초" 시점의 데이터 임을 표식하고 있다고 하자.

4.상기3의 예와 같은 코드로직인 경우, 0시 직후(즉, 9월 26일에서 9월 27일로 넘어가는 초기 시점) 체결데이터보다 호가 데이터가 먼저 수신된 경우의 모든 호가 데이터의 발생시각 처리에 오류 생긴다. 즉, 일자 정보는 체결데이터로만 전달되고 있기 때문에 0시 직후 호가가 먼저 수신되었다면 여전히 프로그램에서는 9월 26일로 처리 중인 상태이며 9월 27일 0시 0분 1초에 발생한 호가 데이터로 처리되어야 정상이나, 9월 26일 0시0분1초에 발생한 호가데이터인 것으로 오류 처리된다.

 


 

 

해결책.

 

1. 상기 상세 3의 예처럼 OpenAPI-W에서 체결정보로 전송되는 일자 정보에만 종속되는 로직 구현하지 말것.

2. 실시간 시세 수신처리부에서 수신된 시각정보 시분초 중  시 부분이 23 -> 0 으로 변경되는 것 검출하여 일자 1일 증가 처리 이뤄지게 할 것.

구현예.
상기 문제는 실시간체결데이터에서는 문제 일으키지 않고, 실시간 호가 데이터에서만 문제 위험 있으므로,
아래 구현예는 실시간 호가 부분처리부에서만 구현되었다.

1. 실시간 호가데이터 수신 데이터 저장하는 구조체 ST_MARKETDATA_QUOTE 의 멤버변수로 아래와 같은 2개의 멤버변수 정의.


typedef struct _MarketDataQuote
{
 wchar_t strHMS_UTC9[10];   // 호가 시각. 형식 : 230813. 한국시 UTC+9. API에서 실시간 제공됨.
 wchar_t strYMD_UTC9[10];   // 호가 발생일자. 형식 : 20160927 한국시 UTC+9. API에서 실시간 제공안됨.
...
}ST_MARKETDATA_QUOTE,*LPST_MARKETDATA_QUOTE;


2. 실시간 호가 수신처리부에서는 시간데이터 확보부.

호가 일자는 API에서 제공되지 않으므로, 별도 정의된 변수 cstYMD_Local_Today 값을 대입하고 있다.
변수 cstYMD_Local_Today 는 프로그램 구동시 당일 일자 (형식 20160927) 로 값이 셋팅된다.
아래 상태에서 Q버퍼에 기록처리되며 이후 시간관련 정리 처리는 아래 3의 단계에서 이뤄진다.

void CCyDevice2_Market_UITDlg::OnReceiveRealData(LPCTSTR sJongmokCode, LPCTSTR sRealType, LPCTSTR sRealData)
{


  wcscpy_s(m_stMDTQuote_RealRcv.strYMD_UTC9, cstYMD_Local_Today); // 호가 일자. 한국시 기준.     

  wcscpy_s(m_stMDTQuote_RealRcv.strHMS_UTC9, m_pKFOpenAPI->GetCommRealData(sJongmokCode, 21)); // 호가시각. 한국시.


...

}


변수 cstYMD_Local_Today 는 실시간 호가 데이터로 수신된 시각의 시 부분이 23 -> 0 으로 되는 지점에서 +1일 처리되며

아래와 같은 호가데이터 처리부에서 수행된다.

참고 : 호가처리부는 Q버퍼 에서 1엘리먼트 읽은 이후 시점에 처리되며 해당 엘리먼트가 아래 코드에서 구조체 변수 m_stQBuf_MarketData_QBufRead  임.


3. 변수 cstYMD_UTC9_ProgramStart +1일 처리부.
- 실시간 호가로 수신된 시간 정보기반으로 +1일 처리해야 정보 무결성 보장됨.




 



///986.

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT