예스스탁
예스스탁 답변
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초 지연. 미체결 주문 확인해도 중복 체결돼서 추가함 ---------------------------------------> 그래도 계속 중복 주문이 들어감
}
}
}