커뮤니티

yesspot으로 pair trading을 작성했는데 중복주문이 동시에 여러번 들어갑니다.

프로필 이미지
typeb
2024-11-14 20:33:57.0
371
글번호 226154
답변완료
MarketData1과 MarketData2 간에 호가차이가 8bp 이하면 entry해서 15bp 이상에서 exit하는 로직입니다. 그런데entry, exit시에 중복으로 3~5건 계약이 중복되고 주문시간이 같아서 Main.SetTimer(1,10000); 를 추가했지만 그래도 중복으로 들어갑니다. 검토 부탁드립니다.ㅠ.ㅜ var A1orderOfUnfills; //A1 미체결 주문 var A2orderOfUnfills; //A2 미체결 주문 var obsevationSpreadForBuy; var obsevationSpreadForSell; var obsevationSpreadForStopLoss; var buySpread = 0.08; var sellSpread = 0.15; function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { obsevationSpreadForBuy = MarketData2.Bid(1) - MarketData1.Ask(1); obsevationSpreadForSell = MarketData2.Ask(1) - MarketData1.Bid(1); obsevationSpreadForStopLoss = MarketData2.Ask(1) - MarketData1.Bid(1); // spread 0 이하인지 Account1.SetBalanceItem(MarketData1.code, 0); //nPosition 0: 구분없음, 1:매도, 2:매수 Account2.SetBalanceItem(MarketData2.code, 0); A1orderOfUnfills = Account1.GetTheNumberOfUnfills(); A2orderOfUnfills = Account2.GetTheNumberOfUnfills() if(Account1.Balance.count == 0 && Account2.Balance.count == 0 && A1orderOfUnfills == 0 && A2orderOfUnfills == 0) { if (obsevationSpreadForBuy <= buySpread) { Main.MessageLog("매수 신호 구간"); Main.MessageLog("MarketData1 Ask/"+ MarketData1.Ask(1)); Main.MessageLog("MarketData2 Bid/"+ MarketData2.Bid(2)); //MarketData1 2계약 매수1호가로 매도 Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Ask(1),2); //MarketData2 1계약 매도1호가로 매수 Account2.OrderBuy(Main.GetOrderCode(MarketData2.code), 1, MarketData2.Bid(1),2); Main.SetTimer(1,10000);//10초 지연. 미체결 주문 확인해도 중복 체결돼서 추가함 ---------------------------------------> 그래도 계속 중복 주문이 들어감 } } else if(Account1.Balance.count == 1 && Account2.Balance.count == 1 && A1orderOfUnfills == 0 && A2orderOfUnfills == 0) { //MarketData1(10년물) 매도1호가와 MarketData2(2년물) 매수1호가 간에 금리차이가 buySpread 이상이면 매수 if (obsevationSpreadForSell > sellSpread) { Main.MessageLog("obsevationSpreadForSell/" + obsevationSpreadForSell); Main.MessageLog("sellSpread/" + sellSpread); Main.MessageLog("청산 신호 구간"); Main.MessageLog("MarketData1 Ask/"+ MarketData1.Ask(1)); Main.MessageLog("MarketData2 Bid/"+ MarketData2.Bid(2)); //MarketData1 2계약 매도1호가로 매수 Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Bid(1),2); //MarketData2 1계약 매수1호가로 매도 Account2.OrderSell(Main.GetOrderCode(MarketData2.code), 1, MarketData2.Ask(1),2); Main.SetTimer(1,10000);//10초 지연. 미체결 주문 확인해도 중복 체결돼서 추가함 ---------------------------------------> 그래도 계속 중복 주문이 들어감 } } }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2024-12-09 17:41:32.0

안녕하세요 예스스탁입니다. 현재 시세 이벤트가 발생하고 조건만 만족하면 반복적으로 진입되게 되어 있습니다. 조건만족 이후에 주문후 접수이벤크 발생하기까지 시차가 있는데 그 사이에 시세가 발생하면 계속 진입이 발생되게 됩니다 아래와 같이 특정변수를 이용해 진입이 발생하면 추가적으로 발생을 막고 청산으로 진입되게 하셔야 합니다. var A1orderOfUnfills; //A1 미체결 주문 var A2orderOfUnfills; //A2 미체결 주문 var obsevationSpreadForBuy; var obsevationSpreadForSell; var obsevationSpreadForStopLoss; var buySpread = 0.08; var sellSpread = 0.15; var step = 0; function Main_OnStart() { step = 0; } function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { obsevationSpreadForBuy = MarketData2.Bid(1) - MarketData1.Ask(1); obsevationSpreadForSell = MarketData2.Ask(1) - MarketData1.Bid(1); obsevationSpreadForStopLoss = MarketData2.Ask(1) - MarketData1.Bid(1); // spread 0 이하인지 Account1.SetBalanceItem(MarketData1.code, 0); //nPosition 0: 구분없음, 1:매도, 2:매수 Account2.SetBalanceItem(MarketData2.code, 0); A1orderOfUnfills = Account1.GetTheNumberOfUnfills(); A2orderOfUnfills = Account2.GetTheNumberOfUnfills() if( step == 1 && Account1.Balance.count == 0 && Account2.Balance.count == 0 && A1orderOfUnfills == 0 && A2orderOfUnfills == 0) { if (obsevationSpreadForBuy <= buySpread) { Main.MessageLog("매수 신호 구간"); Main.MessageLog("MarketData1 Ask/"+ MarketData1.Ask(1)); Main.MessageLog("MarketData2 Bid/"+ MarketData2.Bid(2)); //MarketData1 2계약 매수1호가로 매도 Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Ask(1),2); //MarketData2 1계약 매도1호가로 매수 Account2.OrderBuy(Main.GetOrderCode(MarketData2.code), 1, MarketData2.Bid(1),2); step = 1; } } else if(step == 1 && Account1.Balance.count == 1 && Account2.Balance.count == 1 && A1orderOfUnfills == 0 && A2orderOfUnfills == 0) { //MarketData1(10년물) 매도1호가와 MarketData2(2년물) 매수1호가 간에 금리차이가 buySpread 이상이면 매수 if (obsevationSpreadForSell > sellSpread) { Main.MessageLog("obsevationSpreadForSell/" + obsevationSpreadForSell); Main.MessageLog("sellSpread/" + sellSpread); Main.MessageLog("청산 신호 구간"); Main.MessageLog("MarketData1 Ask/"+ MarketData1.Ask(1)); Main.MessageLog("MarketData2 Bid/"+ MarketData2.Bid(2)); //MarketData1 2계약 매도1호가로 매수 Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Bid(1),2); //MarketData2 1계약 매수1호가로 매도 Account2.OrderSell(Main.GetOrderCode(MarketData2.code), 1, MarketData2.Ask(1),2); Main.SetTimer(1,10000);//10초 지연. 미체결 주문 확인해도 중복 체결돼서 추가함 ---------------------------------------> 그래도 계속 중복 주문이 들어감 step = 0; } } } 즐거운 하루되세요 > typeb 님이 쓴 글입니다. > 제목 : yesspot으로 pair trading을 작성했는데 중복주문이 동시에 여러번 들어갑니다. > MarketData1과 MarketData2 간에 호가차이가 8bp 이하면 entry해서 15bp 이상에서 exit하는 로직입니다. 그런데entry, exit시에 중복으로 3~5건 계약이 중복되고 주문시간이 같아서 Main.SetTimer(1,10000); 를 추가했지만 그래도 중복으로 들어갑니다. 검토 부탁드립니다.ㅠ.ㅜ var A1orderOfUnfills; //A1 미체결 주문 var A2orderOfUnfills; //A2 미체결 주문 var obsevationSpreadForBuy; var obsevationSpreadForSell; var obsevationSpreadForStopLoss; var buySpread = 0.08; var sellSpread = 0.15; function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { obsevationSpreadForBuy = MarketData2.Bid(1) - MarketData1.Ask(1); obsevationSpreadForSell = MarketData2.Ask(1) - MarketData1.Bid(1); obsevationSpreadForStopLoss = MarketData2.Ask(1) - MarketData1.Bid(1); // spread 0 이하인지 Account1.SetBalanceItem(MarketData1.code, 0); //nPosition 0: 구분없음, 1:매도, 2:매수 Account2.SetBalanceItem(MarketData2.code, 0); A1orderOfUnfills = Account1.GetTheNumberOfUnfills(); A2orderOfUnfills = Account2.GetTheNumberOfUnfills() if(Account1.Balance.count == 0 && Account2.Balance.count == 0 && A1orderOfUnfills == 0 && A2orderOfUnfills == 0) { if (obsevationSpreadForBuy <= buySpread) { Main.MessageLog("매수 신호 구간"); Main.MessageLog("MarketData1 Ask/"+ MarketData1.Ask(1)); Main.MessageLog("MarketData2 Bid/"+ MarketData2.Bid(2)); //MarketData1 2계약 매수1호가로 매도 Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Ask(1),2); //MarketData2 1계약 매도1호가로 매수 Account2.OrderBuy(Main.GetOrderCode(MarketData2.code), 1, MarketData2.Bid(1),2); Main.SetTimer(1,10000);//10초 지연. 미체결 주문 확인해도 중복 체결돼서 추가함 ---------------------------------------> 그래도 계속 중복 주문이 들어감 } } else if(Account1.Balance.count == 1 && Account2.Balance.count == 1 && A1orderOfUnfills == 0 && A2orderOfUnfills == 0) { //MarketData1(10년물) 매도1호가와 MarketData2(2년물) 매수1호가 간에 금리차이가 buySpread 이상이면 매수 if (obsevationSpreadForSell > sellSpread) { Main.MessageLog("obsevationSpreadForSell/" + obsevationSpreadForSell); Main.MessageLog("sellSpread/" + sellSpread); Main.MessageLog("청산 신호 구간"); Main.MessageLog("MarketData1 Ask/"+ MarketData1.Ask(1)); Main.MessageLog("MarketData2 Bid/"+ MarketData2.Bid(2)); //MarketData1 2계약 매도1호가로 매수 Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.Bid(1),2); //MarketData2 1계약 매수1호가로 매도 Account2.OrderSell(Main.GetOrderCode(MarketData2.code), 1, MarketData2.Ask(1),2); Main.SetTimer(1,10000);//10초 지연. 미체결 주문 확인해도 중복 체결돼서 추가함 ---------------------------------------> 그래도 계속 중복 주문이 들어감 } } }
프로필 이미지

typeb

2024-12-16 11:03:26.0

typeb 님에 의해 삭제된 답변입니다.