예스스탁
예스스탁 답변
2016-10-17 18:36:24
안녕하세요
예스스탁입니다.
작성하신 의도가
청산신호시 진입주문 미체결은 취소하고
체결된 수량만큼만 청산주문을 하려고 작성하신것 같습니다.
아래 간단한 내용으로 수정했습니다.
수식 중간에 주석 참고하시기 바랍니다.
var Position;
var OrdCode;
var BID;
var ASK;
var BuyFill;
var SellFill;
var BNum;
var SNum;
var CumOrdFill;
var PreOrdPrcA, PreOrdPrcB;
var Time;
function Main_OnStart()
{
Main.MessageList("시작");
Position = 0;
OrdCode = Main.GetOrderCode(F1.code);
}
function C1_OnRiseSignal(Signal)
{
var d = new Date();
Time = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageList(Time,"신호발생",Signal.signalKind);
if(Signal.signalKind == 1) //매수신호
{
Position = 1;
BuyFill = 0;
BID = A1.OrderBuy(OrdCode, Vol, F1.current, 0);
Main.MessageList(Time , "매수주문진입" , "종목코드명:",F1.code, "매수주문식별번호:",BID);
}
if(Position == 1 && Signal.signalKind == 2) //매수청산신호
{
Position = 0;
//매수진입주문 BNum주문번호에 대해 미체결객체 셋팅
Account1.SetUnfill(BNum);
// 미체결이 있으면 취소
if (Account1.Unfill.count > 0);
{
Account1.OrderCancel(BNum);
}
//OrdCode에 대해 잔고셋팅
Account1.SetBalance(OrdCode,0)
//잔고에 OrdCode종목이 매수포지션으로 수량이 있으면
if (Account1.Balance.position == 2 && Account1.Balance.count > 0);
{
//전량 매수청산
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,F1.Bid(2),0);
}
}
if(Signal.signalKind == 3) //매도신호
{
Position = -1;
SellFill = 0;
ASK = A1.OrderSell(OrdCode, Vol, F1.current, 0);
Main.MessageList(Time , "매도주문진입" , "종목코드명:" + F1.code, "매수주문식별번호:",ASK);
}
if(Position = -1 && Signal.signalKind == 4) //매도청산신호
{
Position = 0;
//매도진입주문 SNum주문번호에 대해 미체결객체 셋팅
Account1.SetUnfill(SNum);
// 미체결이 있으면 취소
if (Account1.Unfill.count > 0);
{
Account1.OrderCancel(SNum);
}
//OrdCode에 대해 잔고셋팅
Account1.SetBalance(OrdCode,0)
//잔고에 OrdCode종목이 매도포지션으로 수량이 있으면
if (Account1.Balance.position == 1 && Account1.Balance.count > 0);
{
//전량 매도청산
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,F1.Ask(2),0);
}
}
}
function Main_OnOrderResponse(OrderResponse) //주문응답신호
{
var d = new Date();
Time = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
Main.MessageList(Time,"OrderResponse","종목코드명:", F1.code , "주문번호:",BNum);
}
if (Position == -1 && OrderResponse.orderID == ASK)
{
SNum = OrderResponse.orderNum;
Main.MessageList(Time,"OrderResponse","종목코드명:"+F1.code, "주문번호:",SNum);
}
}
즐거운 하루되세요
> ts윤 님이 쓴 글입니다.
> 제목 : 수식관련해서 질문 드립니다
> 주문이 일부 체결된 경우 나머지 미체결주문만 취소하고자 수식을 짰는데 뭐가 문젠지
전략실행차트에서 실행했을때 "시작"만 뜨고 그이후로 주문은 계속 나가는데 아무 메세지가 뜨질 않습니다...뭐가 잘못된건지 모르겠네요... 밑에식은 수식입니다. 감사합니다
var Position;
var OrdCode;
var BID;
var ASK;
var BuyFill;
var SellFill;
var BNum;
var SNum;
var CumOrdFill;
var PreOrdPrcA, PreOrdPrcB;
var Time;
function Main_OnStart()
{
Main.MessageList("시작");
Position = 0;
OrdCode = Main.GetOrderCode(F1.code);
}
function C1_OnRiseSignal(Signal)
{
Main.MessageList("신호발생" + Signal.signalKind);
Main.MessageList(Signal);
if(Signal.signalKind == 1) //매수신호
{
Position = 1;
BuyFill = 0;
Time = getHHMMSS();
BID = A1.OrderBuy(OrdCode, Vol, F1.current, 0);
Main.MessageList(Time , "매수주문진입" , "종목코드명:" + F1.code, "매수주문식별번호:"+ BID);
}
if(Position == 1 && Signal.signalKind == 2) //매수청산신호
{
if(BuyFill == 1)
{
Time = getHHMMSS();
A1.OrderSell(OrdCode, Vol, F1.Bid(2), 0);
Main.MessageList(Time, "매수청산실행");
}
else if(BuyFill == 0)
{
PreOrdPrcB = NotifyFill.fillCount
Main.SetTimer(1,10000);
}
}
if(Signal.signalKind == 3) //매도신호
{
Position = -1;
SellFill = 0;
Time = getHHMMSS();
ASK = A1.OrderSell(OrdCode, Vol, F1.current, 0);
Main.MessageList(Time , "매도주문진입" , "종목코드명:" + F1.code, "매수주문식별번호:"+ ASK);
}
if(Position = -1 && Signal.signalKind == 4) //매도청산신호
{
if(SellFill == 1)
{
Time = getHHMMSS();
A1.OrderBuy(OrdCode, Vol, F1.Ask(2), 0);
Main.MessageList(Time, "매도청산실행");
}
else if(SellFill == 0)
{
PreOrdPrcA = NotifyFill.fillCount
Main.SetTimer(2,10000);
}
}
}
function Main_OnOrderResponse(OrderResponse) //주문응답신호
{
if(Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
Time = getHHMMSS();
Main.MessageList(Time,"OrderResponse","종목코드명:"+F1.code , "주문번호:"+ BNum);
}
else if(Position == -1 && OrderResponse.orderID == ASK)
{
SNum = OrderResponse.orderNum;
Time = getHHMMSS();
Main.MessageList(Time,"OrderResponse","종목코드명:"+F1.code , "주문번호:"+ SNum);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
if(PreOrdPrcB != Vol)
{
A1.SetUnfillOrderNumber(BNum);
if (A1.Unfill.count > 0)
{
Time = getHHMMSS();
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageList(Time,"매수취소주문" + "매수취소주문수량"+A1.Unfill.count);
}
}
}
if (nEventID == 2)
{
if(PreOrdPrcA != Vol)
{
A1.SetUnfillOrderNumber(SNum);
if (A1.Unfill.count > 0)
{
Time = getHHMMSS();
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageList( Time ,"매도취소주문" +"매도취소주문수량"+A1.Unfill.count);
}
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
if(Position == 1 && NotifyFill.orderNum == BNum)
{
BuyFill = 1;
Main.KillTimer(1);
}
else if(Position == -1 && NotifyFill.orderNum == SNum)
{
SellFill = 1;
Main.KillTimer(2);
}
}