예스스탁
예스스탁 답변
2021-01-21 17:46:22
안녕하세요
예스스탁입니다.
죄송하지만 문의하신 내용은 사용자분께서 모의투자를 통해
테스트 해보시면서 수식을 수정보완해 주셔야 합니다.
저희가 업무상 스팟은 가이드정도만 해드리고 테스트를 수행해 드리기는 어렵습니다.
하이투자증권 예스트레이더 로그인하실 떄
접속설정에서 모의투자로 접속하시면 KQ150선물도 모의투자가 가능합니다.
테스트 중 문제 있으시거나 수정보완이 원활하지 않으시면
02-3453-1060으로 전화주시기 바랍니다.
즐거운 하루되세요
> songjs12 님이 쓴 글입니다.
> 제목 : 수식 검토 부탁드립니다. (주문변경, 일부미체결, 다중 챠트)
> 안녕하세요?
코스닥선물을 거래하고 있습니다. (하이투자)
챠트는 KQ20과 KQ100이름으로 두개의 챠트객체가 있고 (둘다 코스닥150연결선물)
종목객체는 코스닥150연결선물입니다. (Marketdata1)
각 챠트에서 5개의 진입수를 가지고 거래를 하고 있는데 진입 및 가격을 현재가로 하다보니 대부분 거래가 잘 되기는 하나 시장이 빨리 움직일 때는 진입이나 청산을 일부 못하는 경우가 발생하고 있습니다. 그래서 상대3~5호가로 진입및 청산주문을 하고 있는데 아무래도 수익률이 떨어지고 있습니다. 그래서 나름 예스스팟으로 수식을 작성하여 보았는데 하이투자는 모의거래가 없어 시험하기가 어려운 상황입니다. 우선 아래의 수식을 보시고 문제가 될 만한 부분이 있는지 검토를 부탁드리겠습니다.
*아래의 수식에서 청산신호가 아닌 스위칭신호(BUY신호인데 그전에 그 챠트에서 주문한 매도포지션이 있는 경우)가 발생했을 때도 잘 작동할 수 있을지 궁금합니다.
감사합니다.
-----------------------------------------------------------------------
KQ20챠트에서
5개의 매수/매도 신호발생(현재가 주문) - 5초 후 일부 미체결 가격 조정 - 10초후 일부 미체결 가격 조정 - 15초 후 미체결주문 모두 취소
청산 시 현재가 주문 - 5초후 가격조정 - 10초후 가격조정
KQ100챠트에서도 위와 동일한 방식으로 주문함
KQ20챠트와 KQ100챠트는 서로의 진입과 청산에 영향없이 각각 독립적으로 운영 (서로 영향없이)함.
---------------------------------------------------------------------------
var Position;
var BuyID;
var BuyOrderNum;
var SellID;
var SellOrderNum;
var Position100;
var BuyID100;
var BuyOrderNum100;
var SellID100;
var SellOrderNum100;
var KQ20num;
var IniKQ20num;
var KQ100num;
var IniKQ100num;
function Main_OnStart()
{
Position = 0;
IniKQ20num =0;
Position100 = 0;
IniKQ100num =0;
}
function KQ20_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Position = 1;
Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 2);
IniKQ20num = Account1.Balance.count;
BuyID = Account1.OrderBuy(Main.GetOrderCode(KQ20.GetCode(1)),Signal.count,MarketData1.current,0);
Main.SetTimer(1, 5000);
Main.SetTimer(2, 10000);
Main.SetTimer(3, 15000);
Main.SetTimer(4, 30000);
}
if (Signal.signalKind == 3)
{
Position = -1;
Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 1);
IniKQ20num = Account1.Balance.count;
SellID = Account1.OrderSell(Main.GetOrderCode(KQ20.GetCode(1)),Signal.count,MarketData1.current,0);
Main.SetTimer(1, 5000);
Main.SetTimer(2, 10000);
Main.SetTimer(3, 15000);
Main.SetTimer(4, 30000);
}
if (Signal.signalKind == 2)
{
Main.SetTimer(5, 5000);
Main.SetTimer(6, 10000);
ELID = Account1.OrderSell(Main.GetOrderCode(KQ20.GetCode(1)),KQ20num,MarketData1.current,0)
}
if (Signal.signalKind == 4)
{
Main.SetTimer(5, 5000);
Main.SetTimer(6, 10000);
ESID = Account1.OrderBuy(Main.GetOrderCode(KQ20.GetCode(1)),KQ20num,MarketData1.current,0)
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuyID)
{
BuyOrderNum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == SellID)
{
SellOrderNum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == ELID)
{
ELOrderNum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == ESID)
{
ESOrderNum = OrderResponse.orderNum;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1 && Position == 1)
{
Main.KillTimer(1);
Account1.SetUnfillOrderNumber(BuyOrderNum);
if (Account1.Unfill.count > 0)
{
BuyID = Account1.OrderReplacePrice(BuyOrderNum, MarketData1.Ask(1));
}
}
if (nEventID == 1 && Position == -1)
{
Main.KillTimer(1);
Account1.SetUnfillOrderNumber(SellOrderNum);
if (Account1.Unfill.count > 0)
{
SellID = Account1.OrderReplacePrice(SellOrderNum, MarketData1.Bid(1));
}
}
if (nEventID == 2 && Position == 1)
{
Main.KillTimer(2);
Account1.SetUnfillOrderNumber(BuyOrderNum);
if (Account1.Unfill.count > 0)
{
BuyID = Account1.OrderReplacePrice(BuyOrderNum, MarketData1.Ask(3));
}
}
if (nEventID == 2 && Position == -1)
{
Main.KillTimer(2);
Account1.SetUnfillOrderNumber(SellOrderNum);
if (Account1.Unfill.count > 0)
{
SellID = Account1.OrderReplacePrice(SellOrderNum, MarketData1.Bid(3));
}
}
if (nEventID == 3 && Position == 1)
{
Main.KillTimer(3);
EnterN = 0;
Account1.SetUnfillOrderNumber(BuyOrderNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyOrderNum);
}
}
if (nEventID == 3 && Position == -1)
{
Main.KillTimer(3);
EnterN = 0;
Account1.SetUnfillOrderNumber(SellOrderNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellOrderNum);
}
}
if (nEventID == 4 && Position == 1)
{
Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 2);
KQ20num = Account1.Balance.count - IniKQ20num ;
Main.KillTimer(4);
Main.MessageList("매수진입수:", KQ20num);
}
if (nEventID == 4 && Position == -1)
{
Account1.SetBalanceItem(Main.GetOrderCode(KQ20.GetCode(1)), 1);
KQ20num = Account1.Balance.count - IniKQ20num;
Main.KillTimer(4);
Main.MessageList("매도진입수:", KQ20num);
}
if (nEventID == 5 && Position == 1)
{
Main.KillTimer(5);
Account1.SetUnfillOrderNumber(ELOrderNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ELOrderNum, MarketData1.Bid(3));
}
}
if (nEventID == 5 && Position == -1)
{
Main.KillTimer(5);
Account1.SetUnfillOrderNumber(ESOrderNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ESOrderNum, MarketData1.Ask(3));
}
}
if (nEventID == 6 && Position == 1)
{
Main.KillTimer(6);
Account1.SetUnfillOrderNumber(ELOrderNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ELOrderNum, MarketData1.Bid(5));
}
}
if (nEventID == 6 && Position == -1)
{
Main.KillTimer(6);
Account1.SetUnfillOrderNumber(ESOrderNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ESOrderNum, MarketData1.Ask(5));
}
}
}
function KQ100_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
Position100 = 1;
Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 2);
IniKQ100num = Account1.Balance.count;
BuyID100 = Account1.OrderBuy(Main.GetOrderCode(KQ100.GetCode(1)),Signal.count,MarketData1.current,0);
Main.SetTimer(7, 5000);
Main.SetTimer(8, 10000);
Main.SetTimer(9, 15000);
Main.SetTimer(10, 30000);
}
if (Signal.signalKind == 3)
{
Position100 = -1;
Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 1);
IniKQ100num = Account1.Balance.count;
SellID100 = Account1.OrderSell(Main.GetOrderCode(KQ100.GetCode(1)),Signal.count,MarketData1.current,0);
Main.SetTimer(7, 5000);
Main.SetTimer(8, 10000);
Main.SetTimer(9, 15000);
Main.SetTimer(10, 30000);
}
if (Signal.signalKind == 2)
{
Main.SetTimer(11, 5000);
Main.SetTimer(12, 10000);
ELID100 = Account1.OrderSell(Main.GetOrderCode(KQ100.GetCode(1)),KQ100num,MarketData1.current,0)
}
if (Signal.signalKind == 4)
{
Main.SetTimer(5, 5000);
Main.SetTimer(6, 10000);
ESID100 = Account1.OrderBuy(Main.GetOrderCode(KQ100.GetCode(1)),KQ100num,MarketData1.current,0)
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuyID100)
{
BuyOrderNum100 = OrderResponse.orderNum;
}
if (OrderResponse.orderID == SellID100)
{
SellOrderNum100 = OrderResponse.orderNum;
}
if (OrderResponse.orderID == ELID100)
{
ELOrderNum100 = OrderResponse.orderNum;
}
if (OrderResponse.orderID == ESID100)
{
ESOrderNum100 = OrderResponse.orderNum;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 7&& Position100 == 1 )
{
Main.KillTimer(7);
Account1.SetUnfillOrderNumber(BuyOrderNum100);
if (Account1.Unfill.count > 0)
{
BuyID100 = Account1.OrderReplacePrice(BuyOrderNum100, MarketData1.Ask(1));
}
}
if (nEventID == 7 && Position100 == -1)
{
Main.KillTimer(7);
Account1.SetUnfillOrderNumber(SellOrderNum100);
if (Account1.Unfill.count > 0)
{
SellID100 = Account1.OrderReplacePrice(SellOrderNum100, MarketData1.Bid(1));
}
}
if (nEventID == 8 && Position100 == 1)
{
Main.KillTimer(8);
Account1.SetUnfillOrderNumber(BuyOrderNum100);
if (Account1.Unfill.count > 0)
{
BuyID100 = Account1.OrderReplacePrice(BuyOrderNum100, MarketData1.Ask(3));
}
}
if (nEventID == 8 && Position100 == -1)
{
Main.KillTimer(8);
Account1.SetUnfillOrderNumber(SellOrderNum100);
if (Account1.Unfill.count > 0)
{
SellID100 = Account1.OrderReplacePrice(SellOrderNum100, MarketData1.Bid(3));
}
}
if (nEventID == 9 && Position100 == 1)
{
Main.KillTimer(9);
EnterN = 0;
Account1.SetUnfillOrderNumber(BuyOrderNum100);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BuyOrderNum100);
}
}
if (nEventID == 9 && Position100 == -1)
{
Main.KillTimer(9);
EnterN = 0;
Account1.SetUnfillOrderNumber(SellOrderNum100);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellOrderNum100);
}
}
if (nEventID == 10 && Position100 == 1)
{
Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 2);
KQ20num = Account1.Balance.count - IniKQ100num ;
Main.KillTimer(10);
Main.MessageList("매수진입수:", KQ100num);
}
if (nEventID == 10 && Position100 == -1)
{
Account1.SetBalanceItem(Main.GetOrderCode(KQ100.GetCode(1)), 1);
KQ20num = Account1.Balance.count - IniKQ100num;
Main.KillTimer(10);
Main.MessageList("매도진입수:", KQ100num);
}
if (nEventID == 11 && Position100 == 1)
{
Main.KillTimer(11);
Account1.SetUnfillOrderNumber(ELOrderNum100);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ELOrderNum100, MarketData1.Bid(3));
}
}
if (nEventID == 11 && Position100 == -1)
{
Main.KillTimer(11);
Account1.SetUnfillOrderNumber(ESOrderNum100);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ESOrderNum100, MarketData1.Ask(3));
}
}
if (nEventID == 12 && Position100 == 1)
{
Main.KillTimer(12);
Account1.SetUnfillOrderNumber(ELOrderNum100);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ELOrderNum100, MarketData1.Bid(5));
}
}
if (nEventID == 12 && Position100 == -1)
{
Main.KillTimer(12);
Account1.SetUnfillOrderNumber(ESOrderNum100);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(ESOrderNum100, MarketData1.Ask(5));
}
}
}