Trading2016. 1. 12. 02:00


 

개요.

 
문제정의.

CyFinAPI 체계에서, CyOrderModify 와 CyOrderCancel 의 타겟이 되는 CyOrderNew 에는 아래와 같은 2가지 관리기능이 필수요구된다.
1. CyOrderModify/Cancel 명령 적용 가능여부를 CyOrderNew에서 제공해야한다.
2. 1개의 CyOrderNew 에 1개 이상의 CyOrderModify/Cancel 프로세스 중복 불허하는 수단이 CyOrderNew에서 제공되어야 한다.
즉, CyOrderModify/Cancel (모두 CyOrderNew를 수정하는 기능임) 은 1개의 CyOrderNew 개체에 1개의 수정프로세스만 진행가능하며, 진행중인 수정프로세스가 종료된 이후에만 추가의 수정프로세스가 CyOrderNew에 접근가능하다.

상기의 수단이 없는 경우, 발생할 수 있는 오류는 자명하다. 예. CyOrderNew 를 타겟으로 하는 CyOrderModify 가 시작되었는데 CyOrderModify 가 아직 거래소 전송중이고 최종 적용여부가 결정나지도 않은 시점에 프로그램에서 또다른 CyOrderModify 혹은 CyOrderCancel 을 적용하였다고 프로그램적으로 적용은 되고 해당 정정/취소주문도 전송은 가능하다. 중간에 Broker(증권사)서버등에서 오류가 있는 주문인 경우에는 오류 통보를 해주기는 하나, 프로그램 출발점부터 오류가 자명한 것은 첨부터 진행하지 않는것이 중요하다.

문제해결 방향.
상기1 을 판단함에 분명히 사용될 정보 중에는 CyOrderNew 자체의 상태정보인 주문전송상태, 미체결수량 상태등이 활용될 것이다.
상기2 를 판단함에 분명히 사용될 정보 중에는 현재 CyOrderNew에 현재 수정프로세스 진행여부가 필수로 사용되며, 해당 프로세스의 실시간 갱신 처리 필수요구된다.
Thread Safety 는 당연 만족해야함. - 구현하다가 스레드안전 문제가 발생할 소지가 있는 경우 구현함.

상기1, 2의 기능은 CyOrderModify/Cancel 을 적용하려는 입장에서는 CyOrderNew 에 "수정프로세스 적용가능 여부 정보"라는 점에서는 동일하나, CyOrderNew 에서의 해당 기능들을 구현하는 입장에서는 CyOrderNew 가 수정프로세스가 진행중이라는 상태 설정과 CyOrderNew자체의 상태 (주문전송상태, 미체결수량 상태) 라는 것으로 분리된 기능이므로 CyOrderNew측에서의 구현에서 논리적으로 분리되어 구현되도록 한다.

 


 

 

구현

 

CyOrderNew에 상태변수 정의.

상태변수명 : emCyOdStateMCT
변수명 의미 : CyOrder State Modify Cancel Targeted.

변수 초기화 : CyOrderNew 개체 생성시 초기화 값은 emMTNon으로 설정된다.
변수값이 셋되는 시점 : CyOrderNew 를 타겟으로 하는 CyOrderModify/CyOrderCancel 적용시작하는 시점에 emCyOdStateMCT 변수값이 emMTModify (CyOrderModify 적용하는 경우)또는 emMTCancel (CyOrderCancel 적용하는 경우) 로 설정된다.
변수값 릴리스 되는시점 : 해당 수정프로세스가 종료되는 시점에 emMTNon 으로 변경된다. 

CyOrderNew에 함수 정의1. - 수정처리 진입시 점검함수.
함수명 : GetState_CanBeTarget_ModifyCancel()
CyOrderModify, CyOrderCancel 을 적용하려고 할 때는 이 함수를 먼저 호출해서 가능한 경우에만 CyOrderModify/Cancel 진행시작한다.


CyOrderNew에 함수 정의2. - 수정처리 시작/종료시 상태설정함수.

CyOrderModify, CyOrderCancel 프로세스가 시작된 시점과 종료된 시점에 알릴 수단으로 CyOrderNew의 멤버 함수를 정의한다. 

함수명 : SetState_ByMCProcess(bool start_stop, ExchAcpt 개체포인터 = nullptr);  // 수정처리 중의 CyOrderNew 상태 설정이란 의미.
인자.
bool start_stop : true = 수정프로세스 시작됨. false = 수정 프로세스 종료됨.
ExchAcpt : 수정프로세스 종료시점에 이 값이 nullptr이 전달되지 않은 것은 ExchArriveFail 에 의한 것이며, null이 아닌 것이 전달되면 확정된 정보들(Accept, Reject . Accept 인 경우 확정된 수량,가격등 )을 확보할 수 있다.

수정프로세스 시작시점 - 1개 지점만 있음.
- "주문신규"를 타겟으로 하는 주문정정/취소 개체 생성된 시점.
수정프로세스 종료시점 - 2개 지점 있음.
1. ExchArriveFail : 수정 명령이 Exchange에 도착실패함. 해당 수정적용안됨 확정상태.
2. ExchAcpt 수신된 지점. - 이 시점의 정보들. Accept(수정적용 확정된 수량 정보 확보됨.), Reject(수정적용안되었음. )

 


 

///543.


Posted by 리치굿맨

댓글을 달아 주세요