커뮤니티

주문체결 응답 이벤트

프로필 이미지
곰탈
2014-09-03 13:15:51
1116
글번호 223146
답변완료
선물 시스템은 예스랭귀지로 만들고, 예스랭귀지 시스템 신호를 받아서 예스스팟에서 매매를 진행합니다. 매수 진행 중에 매도 신호가 발생하여 리버스가 된 경우 스팟에서 OrderResponse 이벤트가 다소 불안정한 것 같아 문의 드립니다. 리버스 발생시 시그널(Signal.signalKind)은 매수청산(2) -> 매도(3) 순서로 발생되겠지요. 실제 상황에서는 거의 동시에 이뤄질 것입니다. 이때, 매수청산 이후 발생한 매도에 대해 주문접수>주문응답>체결응답을 확인하려고 하는데요. 매수 청산이 잘 이뤄지고 매도 신규 진입도 잘 이뤄졌으나 신규 진입한 매도에 대한 주문 응답이 동작하지 않는 경우가 있습니다. 항상 그런 것은 아닌 것 같고 되다 안되다 그러네요... 참고로, 현재 테스트를 위해 모의서버를 사용 중이며, 3개 이상의 시스템 신호를 하나의 스팟에서 동시에 처리합니다. 혹시, 이 문제가 매수청산에 대한 주문응답과 신규매도 주문응답이 거의 동시에 들어오게 되면서 주문응답 이벤트가 뒤에 들어온 신규매도 주문응답 이벤트를 놓치거나 스킵하게 될 수도 있는 건지요? 스팟 코드는 아래와 같습니다. 0) 전역 변수: var BuyOrderID = new Array(4); var ShortOrderID = new Array(4); var ExitOrderID = new Array(4); var BuyOrderNumber = new Array(4); var ShortOrderNumber = new Array(4); var ExitOrderNumber = new Array(4); 1) 시스템 시그널: function Chart1_OnRiseSignal(Signal) { MakeOrder(1, Signal.signalKind); } function Chart2_OnRiseSignal(Signal) { MakeOrder(2, Signal.signalKind); } function Chart3_OnRiseSignal(Signal) { MakeOrder(3, Signal.signalKind); } function MakeOrder(ChartNumber, ChartSignal) { if(ChartSignal == 1) { BuyOrderID[ChartNumber] = Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(5), 0); Start[ChartNumber] = 1; } if(ChartSignal == 2 && Start[ChartNumber] == 1) { ExitOrderID[ChartNumber] = Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(5), 0); } if(ChartSignal == 3) { ShortOrderID[ChartNumber] = Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(5), 0); Start[ChartNumber] = 1; } if(ChartSignal == 4 && Start[ChartNumber == 1) { ExitOrderID[ChartNumber] = Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(5), 0); } } 2) 주문 응답 function Main_OnOrderResponse(OrderResponse) { for(var i=1; i<=3; i++) { if(OrderResponse.orderID == BuyOrderID[i]) { BuyOrderNumber[i] = OrderResponse.orderNum; } if(OrderResponse.orderID == ShortOrderID[i]) { ShortOrderNumber[i] = OrderResponse.orderNum; } if(OrderResponse.orderID == ExitOrderID[i]) { ExitOrderNumber[i] = OrderResponse.orderNum; } } } 3) 주문 체결 응답 function Main_OnNotifyFill(NotifyFill) { for(var i=1; i<=3; i++) { if(NotifyFill.orderNum == BuyOrderNum[i]) { Main.MessageList("신규 매수 체결 응답"); } if(NotifyFill.orderNum == ShortOrderNum[i]) { Main.MessageList("신규 매도 체결 응답"); } if(NotifyFill.orderNum == ExitOrderNum[i]) { Main.MessageList("청산 주문 체결 응답"); } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-09-11 17:54:44

안녕하세요 예스스탁입니다. 현재 계속 테스트 중에 있습니다. 저희쪽에서 해당 상황이 아직 발생되고 있지 않습니다. 혹시 상황이 발생하시면 02-3453-1060으로 전화주시기 바랍니다. 즐거운 하루되세요 > 곰탈 님이 쓴 글입니다. > 제목 : 주문체결 응답 이벤트 > 선물 시스템은 예스랭귀지로 만들고, 예스랭귀지 시스템 신호를 받아서 예스스팟에서 매매를 진행합니다. 매수 진행 중에 매도 신호가 발생하여 리버스가 된 경우 스팟에서 OrderResponse 이벤트가 다소 불안정한 것 같아 문의 드립니다. 리버스 발생시 시그널(Signal.signalKind)은 매수청산(2) -> 매도(3) 순서로 발생되겠지요. 실제 상황에서는 거의 동시에 이뤄질 것입니다. 이때, 매수청산 이후 발생한 매도에 대해 주문접수>주문응답>체결응답을 확인하려고 하는데요. 매수 청산이 잘 이뤄지고 매도 신규 진입도 잘 이뤄졌으나 신규 진입한 매도에 대한 주문 응답이 동작하지 않는 경우가 있습니다. 항상 그런 것은 아닌 것 같고 되다 안되다 그러네요... 참고로, 현재 테스트를 위해 모의서버를 사용 중이며, 3개 이상의 시스템 신호를 하나의 스팟에서 동시에 처리합니다. 혹시, 이 문제가 매수청산에 대한 주문응답과 신규매도 주문응답이 거의 동시에 들어오게 되면서 주문응답 이벤트가 뒤에 들어온 신규매도 주문응답 이벤트를 놓치거나 스킵하게 될 수도 있는 건지요? 스팟 코드는 아래와 같습니다. 0) 전역 변수: var BuyOrderID = new Array(4); var ShortOrderID = new Array(4); var ExitOrderID = new Array(4); var BuyOrderNumber = new Array(4); var ShortOrderNumber = new Array(4); var ExitOrderNumber = new Array(4); 1) 시스템 시그널: function Chart1_OnRiseSignal(Signal) { MakeOrder(1, Signal.signalKind); } function Chart2_OnRiseSignal(Signal) { MakeOrder(2, Signal.signalKind); } function Chart3_OnRiseSignal(Signal) { MakeOrder(3, Signal.signalKind); } function MakeOrder(ChartNumber, ChartSignal) { if(ChartSignal == 1) { BuyOrderID[ChartNumber] = Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(5), 0); Start[ChartNumber] = 1; } if(ChartSignal == 2 && Start[ChartNumber] == 1) { ExitOrderID[ChartNumber] = Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(5), 0); } if(ChartSignal == 3) { ShortOrderID[ChartNumber] = Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(5), 0); Start[ChartNumber] = 1; } if(ChartSignal == 4 && Start[ChartNumber == 1) { ExitOrderID[ChartNumber] = Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(5), 0); } } 2) 주문 응답 function Main_OnOrderResponse(OrderResponse) { for(var i=1; i<=3; i++) { if(OrderResponse.orderID == BuyOrderID[i]) { BuyOrderNumber[i] = OrderResponse.orderNum; } if(OrderResponse.orderID == ShortOrderID[i]) { ShortOrderNumber[i] = OrderResponse.orderNum; } if(OrderResponse.orderID == ExitOrderID[i]) { ExitOrderNumber[i] = OrderResponse.orderNum; } } } 3) 주문 체결 응답 function Main_OnNotifyFill(NotifyFill) { for(var i=1; i<=3; i++) { if(NotifyFill.orderNum == BuyOrderNum[i]) { Main.MessageList("신규 매수 체결 응답"); } if(NotifyFill.orderNum == ShortOrderNum[i]) { Main.MessageList("신규 매도 체결 응답"); } if(NotifyFill.orderNum == ExitOrderNum[i]) { Main.MessageList("청산 주문 체결 응답"); } } }