선물 시스템은 예스랭귀지로 만들고, 예스랭귀지 시스템 신호를 받아서 예스스팟에서 매매를 진행합니다.
매수 진행 중에 매도 신호가 발생하여 리버스가 된 경우 스팟에서 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("청산 주문 체결 응답");
}
}
}