커뮤니티

수식관련해서 질문 드립니다

프로필 이미지
ts윤
2016-09-28 16:14:15
1688
글번호 224001
답변완료
주문이 일부 체결된 경우 나머지 미체결주문만 취소하고자 수식을 짰는데 뭐가 문젠지 전략실행차트에서 실행했을때 "시작"만 뜨고 그이후로 주문은 계속 나가는데 아무 메세지가 뜨질 않습니다...뭐가 잘못된건지 모르겠네요... 밑에식은 수식입니다. 감사합니다 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); } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

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); } }