커뮤니티

수정 부탁드립니다.

프로필 이미지
지킴이
2018-01-09 10:11:58
2726
글번호 224302
답변완료
수식 문의 드립니다. 하이투자 이용하고 있고 예스트레이더에서 신호를 받아와서 예스스팟을 이용해 주문 하고 있습니다. 설정은 예스트레이더 차트 4개에서 가각의 신호를 받아서 코스피 선물 거래하고 있습니다. 하지만, 오류가 계속 발생해서 제대로 적용하지 못하고 있습니다. 현재는 예스스팟은 모의 투자로만 돌리면서 테스트 하고 있고요. 아래의 조건에 맞게 수식을 보완해 주시면 감사 하겠습니다. 1. 4개중의 하나의 차트에서 신호가 발생하면 신규 진입한다. 2. 진입시 계약 수 설정할 수 있었으면 합니다.(예 5계약 주문) 3, 하나의 차트에서 신호가 나와서 체결이 되었으면 즉, 포지션이 있으면 다른차트에서의 신규 진입은 무시한다. 4, 1번 차트에서 신호가 나와서 미체결 상태로 남아 있고 2번 차트에서 신호가 나왔다면 미체결 취소하고 2번차트 신호로 신규진입한다. 5, 청산신호가 나와서 포지션이 청산되고 3분뒤에 포지션을 확인해서 포지션이 남아 있으면 모두 시장가로 청산한다. 이 때, 모든 미체결도 모두 취소한다. 6, 아래식에서 정정취소가 제대로 안되는 것 같습니다. 또 청산이 제대로 안되어 포지션이 남아 있는 경우가 많습니다. 수정부탁드립니다. (모의투자에서 적용시) 아래 식에서 위 의 조건대로 고쳐 주시면 감사하겠습니다. 나름대로 열심히 만들고는 있는데 너무 모자라네요. 또, 마지막 잔고청산은 15시 06분으로 청산하라고 작성했는데 확인결과 15시 26분에 일괄청산이 되네요. 왜 그런건지도 알려주면 고맙겠습니다. 원래는 4개의 차트를 이용하는데 너무 길어서 두 개만 올립니다. var BID,BXID,SID,SXID; var BID1,BXID1,SID1,SXID1; var BNum,BXNum,SNum,SXNum; var BNum1,BXNum1,SNum1,SXNum1; function Chart1_OnRiseSignal(Signal) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //buy신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 1) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitlong신호 발생 if (Signal.signalKind == 2) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.current, 0); } } //Sell신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 3) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitshort신호 발생 if (Signal.signalKind == 4) { //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current, 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입 최초주문 if (OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; Main.SetTimer(1,30000); //1번 타이머셋팅 30초 } //매수진입 30초후 정정주문 if (OrderResponse.orderID == BID1) { BNum1 = OrderResponse.orderNum; Main.SetTimer(11,180000); //11번 타이머셋팅 180초 } //매수청산 최초주문 if (OrderResponse.orderID == BXID) { BXNum = OrderResponse.orderNum; Main.SetTimer(2,20000); //2번 타이머셋팅 20초 } //매수청산 취소주문 후 시장가 청산 if (OrderResponse.orderID == BXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입 최초주문 if (OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; Main.SetTimer(3,30000); //3번 타이머셋팅 30초 } //매도진입 30초 후 정정주문 if (OrderResponse.orderID == SID1) { SNum1 = OrderResponse.orderNum; Main.SetTimer(33,180000); //33번 타이머셋팅 180초 } //매도청산 최초주문 if (OrderResponse.orderID == SXID) { SXNum = OrderResponse.orderNum; Main.SetTimer(4,20000); //4번 타이머셋팅 20초 } //매도청산 취소주문 후 시장가로 청산 if (OrderResponse.orderID == SXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Ask(2), 0); } } } function Main_OnTimer(nEventID) { //매수진입주문 타이머 동작 if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BNum); if (Account1.Unfill.count > 0) { BID1 = Account1.OrderCancel(BNum); } } //매수청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 2) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BID2 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입주문 타이머 동작 if (nEventID == 3) { Main.KillTimer(3); Account1.SetUnfill(SNum); if (Account1.Unfill.count > 0) { SID1 = Account1.OrderCancel(SNum); } } //매도청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 4) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,Ask(2), 0); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { //전체 보유 종목 수 Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); //전체 보유 종목을 하나씩 불러와 for(var i = 0; i < num; i++) { //잔고객체를 셋팅하고 Account1.SetBalanceIndex(i); // 해당 잔고가 매도이면 보유수량만큼 매수주문 if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Ask(2), 0); } //해당 잔고가 매수이면 보유수량만큼 매도주문 if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Bid(2), 0); } } } } //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ function Chart2_OnRiseSignal(Signal) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //buy신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 1) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitlong신호 발생 if (Signal.signalKind == 2) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.current, 0); } } //Sell신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 3) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitshort신호 발생 if (Signal.signalKind == 4) { //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current, 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입 최초주문 if (OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; Main.SetTimer(1,30000); //1번 타이머셋팅 30초 } //매수진입 30초후 정정주문 if (OrderResponse.orderID == BID1) { BNum1 = OrderResponse.orderNum; Main.SetTimer(11,180000); //11번 타이머셋팅 180초 } //매수청산 최초주문 if (OrderResponse.orderID == BXID) { BXNum = OrderResponse.orderNum; Main.SetTimer(2,20000); //2번 타이머셋팅 20초 } //매수청산 취소주문 후 시장가 청산 if (OrderResponse.orderID == BXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입 최초주문 if (OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; Main.SetTimer(3,30000); //3번 타이머셋팅 30초 } //매도진입 30초 후 정정주문 if (OrderResponse.orderID == SID1) { SNum1 = OrderResponse.orderNum; Main.SetTimer(33,180000); //33번 타이머셋팅 180초 } //매도청산 최초주문 if (OrderResponse.orderID == SXID) { SXNum = OrderResponse.orderNum; Main.SetTimer(4,20000); //4번 타이머셋팅 20초 } //매도청산 취소주문 후 시장가로 청산 if (OrderResponse.orderID == SXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Ask(2), 0); } } } function Main_OnTimer(nEventID) { //매수진입주문 타이머 동작 if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BNum); if (Account1.Unfill.count > 0) { BID1 = Account1.OrderCancel(BNum); } } //매수청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 2) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BID2 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입주문 타이머 동작 if (nEventID == 3) { Main.KillTimer(3); Account1.SetUnfill(SNum); if (Account1.Unfill.count > 0) { SID1 = Account1.OrderCancel(SNum); } } //매도청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 4) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,Ask(2), 0); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { //전체 보유 종목 수 Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); //전체 보유 종목을 하나씩 불러와 for(var i = 0; i < num; i++) { //잔고객체를 셋팅하고 Account1.SetBalanceIndex(i); // 해당 잔고가 매도이면 보유수량만큼 매수주문 if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Ask(2), 0); } //해당 잔고가 매수이면 보유수량만큼 매도주문 if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Bid(2), 0); } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2018-01-30 17:29:43

안녕하세요 예스스탁입니다. 1. 4개중의 하나의 차트에서 신호가 발생하면 신규 진입한다. 2. 진입시 계약 수 설정할 수 있었으면 합니다.(예 5계약 주문) 3, 하나의 차트에서 신호가 나와서 체결이 되었으면 즉, 포지션이 있으면 다른차트에서의 신규 진입은 무시한다. 4, 1번 차트에서 신호가 나와서 미체결 상태로 남아 있고 2번 차트에서 신호가 나왔다면 미체결 취소하고 2번차트 신호로 신규진입한다. 5, 청산신호가 나와서 포지션이 청산되고 3분뒤에 포지션을 확인해서 포지션이 남아 있으면 모두 시장가로 청산한다. 이 때, 모든 미체결도 모두 취소한다. 6, 아래식에서 정정취소가 제대로 안되는 것 같습니다. 또 청산이 제대로 안되어 포지션이 남아 있는 경우가 많습니다. 수정부탁드립니다. (모의투자에서 적용시) 올려주신 스팟수식으로는 분석이 어려워 위 내용으로 새로 작성해 드립니다. 모의투자는 시장가주문을 제공하지 않습니다 또한 지정가 주문후 바로 시장가로 정정주문은 가능하지 않습니다.' 주문취소 후 새로 시장가로 주문발생시켜야 합니다. 예스스팟은 수식 답변이 단순한 가이드 입니다. 저희가 완전 테스트해서 식을 올려드리지는 않습니다. 수식에 주석을 붙여드립니다. 아래 내용 참고하셔서 수정보완해서 사용하시기 바랍니다. var vol = 5;//진입수량 var OrderCode,pst; var BID,BXID,SID,SXID,BXCID,SXCID; var BEN,BXN,SEN,SXN; //스팟시작 function Main_OnStart() { //주문종목코드 OrderCode = Main.GetOrderCode(MarketData1.code); //차트포지션 신호종류 저장할 변수 pst = 0; //1번타이머 (150600 청산용) Main.SetTimer(1,30000); } //차트1 신호발생 function Chart1_OnRiseSignal(Signal) { //잔고셋팅 Account1.SetBalance(OrderCode, 0); //잔고가 0이고 pst변수도 0일때 매수신호이면 if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { //pst는 1(차트1에서 매수발생의미) pst = 1; //매도1호가로 매수주문 BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } //pst가 1일때 매수포지션 청산신호 발생 if (pst == 1 && Signal.signalKind == 2) { //pst는 0 pst = 0; //매수진입신호 미체결객체 셋팅 Account1.SetUnfill(BEN); //미체결 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } //잔고에 매수수량이 있고 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수1호가로 잔고수량만큼만 매&#49710;주문 BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); //타이머2번 설정, 3분 Main.SetTimer(2,180000); } } //잔고가 0이고 pst도 0이고 매도진입신호 발생 if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 3) { //pst는 -1 (차트1에서 매도발생 의미) pst = -1; //매수1호가로 매도주문 SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } //pst가 -1일&#46468; 매도포지션 청산시호 발생 if (pst == -1 && Signal.signalKind == 4) { //pst는 0 pst = 0; //매도진입 미체결객체 셋팅 Account1.SetUnfill(SEN); //미체결 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } //잔고에 매도수량이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //매도1호가로 잔고수량만큼 매수주문 SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); //3번 타이머셋팅 3분 Main.SetTimer(3,180000); } } } //Chart2,Chart3,Chart4의 내용은 Char1과 같음 //pst값만 어떤 차트에서 나온신호인지 구분하기 위해 다른 값이 저장되어 있음 //Chat2는 매수진입 2,매도진입-2 //Chat3는 매수진입 3,매도진입-3 //Chat4는 매수진입 4,매도진입-4 function Chart2_OnRiseSignal(Signal) { Account1.SetBalance(OrderCode, 0); if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { pst = 2; BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } if (pst == 2 && Signal.signalKind == 2) { pst = 0; Account1.SetUnfill(BEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); Main.SetTimer(2,180000); } } if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 3) { pst = -2; SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } if (pst == -2 && Signal.signalKind == 4) { pst = 0; Account1.SetUnfill(SEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); Main.SetTimer(3,180000); } } } function Chart3_OnRiseSignal(Signal) { Account1.SetBalance(OrderCode, 0); if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { pst = 3; BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } if (pst == 3 && Signal.signalKind == 2) { pst = 0; Account1.SetUnfill(BEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } if (Account1.Balance.count == 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); Main.SetTimer(2,180000); } } if (Account1.Balance.count > 0 && pst == 0 && Signal.signalKind == 3) { pst = -3; SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } if (pst == -3 && Signal.signalKind == 4) { pst = 0; Account1.SetUnfill(SEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); Main.SetTimer(3,180000); } } } function Chart4_OnRiseSignal(Signal) { Account1.SetBalance(OrderCode, 0); if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 1) { pst = 4; BID = Account1.OrderBuy(OrderCode, vol, MarketData1.Ask(1), 0); } if (pst == 4 && Signal.signalKind == 2) { pst = 0; Account1.SetUnfill(BEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(OrderCode, Account1.Balance.count, MarketData1.Bid(1), 0); Main.SetTimer(2,180000); } } if (Account1.Balance.count == 0 && pst == 0 && Signal.signalKind == 3) { pst = -4; SID = Account1.OrderSell(OrderCode, vol, MarketData1.Bid(1), 0); } if (pst == -4 && Signal.signalKind == 4) { pst = 0; Account1.SetUnfill(SEN); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEN); } if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(OrderCode, Account1.Balance.count, MarketData1.Ask(1), 0); Main.SetTimer(3,180000); } } } //주문응답수신 function Main_OnOrderResponse(OrderResponse) { //매수진입주문에 대한 응답이면 if (OrderResponse.orderID == BID) { //BEN에 주문번호 저장 BEN = OrderResponse.orderNum; } //매수청산주문에 대한 응답이면 if (OrderResponse.orderID == BXID) { //BXN에 주문번호 저장 BXN = OrderResponse.orderNum; } //매도진입주문에 대한 응답이면 if (OrderResponse.orderID == SID) { //SEN에 주문번호 저장 SEN = OrderResponse.orderNum; } //매도청산주문에 대한 응답이면 if (OrderResponse.orderID == SXID) { //SXN에 주문번호 저장 SXN = OrderResponse.orderNum; } //매수청산주문에 대한 취소주문이면 if (OrderResponse.orderID == BXCID) { //잔고셋팅하고 Account1.SetBalance(OrderCode, 0); //매수잔고에 대해 전량으시장가매도주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(OrderCode, Account1.Balance.count, 0, 1); } } //매도청산주문에 대한 취소주문이면 if (OrderResponse.orderID == SXCID) { //잔고셋팅하고 Account1.SetBalance(OrderCode, 0); //매도잔고에 대해 전량으시장가매도주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(OrderCode, Account1.Balance.count, 0, 1); } } } //타이머동작 function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //2번 타이머(매수청산주문후 3분경과) if (nEventID == 2) { //타이머 종료 Main.KillTimer(2); //매수청산주문에 대한 미체결객체 셋팅 Account1.SetUnfill(BXN); //미체결이 있으면 if (Account1.Unfill.count > 0) { //취소주문 BXCID = Account1.OrderCancel(BXN); } } //3번 타이머(매도청산주문후 3분경과) if (nEventID == 3) { //타이머종료 Main.KillTimer(3); //매도청산주문에 대한 미체결객체 셋팅 Account1.SetUnfill(SXN); //미체결이 있으면 if (Account1.Unfill.count > 0) { //취수주 SXCID = Account1.OrderCancel(SXN); } } //1번타이머 동작되고 15시 6분 이후이면 if (nEventID == 1 && HHMMDD >= 150600) { //타이머 종료 Main.KillTimer(1); //OrderCode로 남아있는 모든 미체결 주문 취소 var num = Account1.GetTheNumberOfUnfills() for(var i = 0; i < num; i++) { Account1.SetUnfill(i); if (Account1.Unfill.count > 0 && Account1.Unfill.code == OrderCode) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //OrderCode 잔고셋팅 Account1.SetBalance(OrderCode,0); //OrderCode로 보유잔고 있으면 시장가로 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(OrderCode, Account1.Balance.count, 0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderBuy(OrderCode, Account1.Balance.count,0,1); } } } 즐거운 하루되세요 > 지킴이 님이 쓴 글입니다. > 제목 : 수정 부탁드립니다. > 수식 문의 드립니다. 하이투자 이용하고 있고 예스트레이더에서 신호를 받아와서 예스스팟을 이용해 주문 하고 있습니다. 설정은 예스트레이더 차트 4개에서 가각의 신호를 받아서 코스피 선물 거래하고 있습니다. 하지만, 오류가 계속 발생해서 제대로 적용하지 못하고 있습니다. 현재는 예스스팟은 모의 투자로만 돌리면서 테스트 하고 있고요. 아래의 조건에 맞게 수식을 보완해 주시면 감사 하겠습니다. 1. 4개중의 하나의 차트에서 신호가 발생하면 신규 진입한다. 2. 진입시 계약 수 설정할 수 있었으면 합니다.(예 5계약 주문) 3, 하나의 차트에서 신호가 나와서 체결이 되었으면 즉, 포지션이 있으면 다른차트에서의 신규 진입은 무시한다. 4, 1번 차트에서 신호가 나와서 미체결 상태로 남아 있고 2번 차트에서 신호가 나왔다면 미체결 취소하고 2번차트 신호로 신규진입한다. 5, 청산신호가 나와서 포지션이 청산되고 3분뒤에 포지션을 확인해서 포지션이 남아 있으면 모두 시장가로 청산한다. 이 때, 모든 미체결도 모두 취소한다. 6, 아래식에서 정정취소가 제대로 안되는 것 같습니다. 또 청산이 제대로 안되어 포지션이 남아 있는 경우가 많습니다. 수정부탁드립니다. (모의투자에서 적용시) 아래 식에서 위 의 조건대로 고쳐 주시면 감사하겠습니다. 나름대로 열심히 만들고는 있는데 너무 모자라네요. 또, 마지막 잔고청산은 15시 06분으로 청산하라고 작성했는데 확인결과 15시 26분에 일괄청산이 되네요. 왜 그런건지도 알려주면 고맙겠습니다. 원래는 4개의 차트를 이용하는데 너무 길어서 두 개만 올립니다. var BID,BXID,SID,SXID; var BID1,BXID1,SID1,SXID1; var BNum,BXNum,SNum,SXNum; var BNum1,BXNum1,SNum1,SXNum1; function Chart1_OnRiseSignal(Signal) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //buy신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 1) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitlong신호 발생 if (Signal.signalKind == 2) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.current, 0); } } //Sell신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 3) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitshort신호 발생 if (Signal.signalKind == 4) { //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current, 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입 최초주문 if (OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; Main.SetTimer(1,30000); //1번 타이머셋팅 30초 } //매수진입 30초후 정정주문 if (OrderResponse.orderID == BID1) { BNum1 = OrderResponse.orderNum; Main.SetTimer(11,180000); //11번 타이머셋팅 180초 } //매수청산 최초주문 if (OrderResponse.orderID == BXID) { BXNum = OrderResponse.orderNum; Main.SetTimer(2,20000); //2번 타이머셋팅 20초 } //매수청산 취소주문 후 시장가 청산 if (OrderResponse.orderID == BXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입 최초주문 if (OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; Main.SetTimer(3,30000); //3번 타이머셋팅 30초 } //매도진입 30초 후 정정주문 if (OrderResponse.orderID == SID1) { SNum1 = OrderResponse.orderNum; Main.SetTimer(33,180000); //33번 타이머셋팅 180초 } //매도청산 최초주문 if (OrderResponse.orderID == SXID) { SXNum = OrderResponse.orderNum; Main.SetTimer(4,20000); //4번 타이머셋팅 20초 } //매도청산 취소주문 후 시장가로 청산 if (OrderResponse.orderID == SXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Ask(2), 0); } } } function Main_OnTimer(nEventID) { //매수진입주문 타이머 동작 if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BNum); if (Account1.Unfill.count > 0) { BID1 = Account1.OrderCancel(BNum); } } //매수청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 2) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BID2 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입주문 타이머 동작 if (nEventID == 3) { Main.KillTimer(3); Account1.SetUnfill(SNum); if (Account1.Unfill.count > 0) { SID1 = Account1.OrderCancel(SNum); } } //매도청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 4) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,Ask(2), 0); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { //전체 보유 종목 수 Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); //전체 보유 종목을 하나씩 불러와 for(var i = 0; i < num; i++) { //잔고객체를 셋팅하고 Account1.SetBalanceIndex(i); // 해당 잔고가 매도이면 보유수량만큼 매수주문 if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Ask(2), 0); } //해당 잔고가 매수이면 보유수량만큼 매도주문 if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Bid(2), 0); } } } } //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ function Chart2_OnRiseSignal(Signal) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //buy신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 1) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitlong신호 발생 if (Signal.signalKind == 2) { //기존타이머는 모두 종료 Main.KillTimer(1); Main.KillTimer(2); //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.current, 0); } } //Sell신호 발생 if (Account1.Balance.count == 0 && Signal.signalKind == 3) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.current, 0); } //Exitshort신호 발생 if (Signal.signalKind == 4) { //MarketData1종목 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //보유중인 수량만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current, 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입 최초주문 if (OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; Main.SetTimer(1,30000); //1번 타이머셋팅 30초 } //매수진입 30초후 정정주문 if (OrderResponse.orderID == BID1) { BNum1 = OrderResponse.orderNum; Main.SetTimer(11,180000); //11번 타이머셋팅 180초 } //매수청산 최초주문 if (OrderResponse.orderID == BXID) { BXNum = OrderResponse.orderNum; Main.SetTimer(2,20000); //2번 타이머셋팅 20초 } //매수청산 취소주문 후 시장가 청산 if (OrderResponse.orderID == BXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입 최초주문 if (OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; Main.SetTimer(3,30000); //3번 타이머셋팅 30초 } //매도진입 30초 후 정정주문 if (OrderResponse.orderID == SID1) { SNum1 = OrderResponse.orderNum; Main.SetTimer(33,180000); //33번 타이머셋팅 180초 } //매도청산 최초주문 if (OrderResponse.orderID == SXID) { SXNum = OrderResponse.orderNum; Main.SetTimer(4,20000); //4번 타이머셋팅 20초 } //매도청산 취소주문 후 시장가로 청산 if (OrderResponse.orderID == SXID1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Ask(2), 0); } } } function Main_OnTimer(nEventID) { //매수진입주문 타이머 동작 if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BNum); if (Account1.Unfill.count > 0) { BID1 = Account1.OrderCancel(BNum); } } //매수청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 2) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BID2 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, Bid(2), 0); } } //매도진입주문 타이머 동작 if (nEventID == 3) { Main.KillTimer(3); Account1.SetUnfill(SNum); if (Account1.Unfill.count > 0) { SID1 = Account1.OrderCancel(SNum); } } //매도청산주문 타이머 동작 //20초 후 미체결은 취소(최수주문에 응답들어오면 시장가로 청산주문) if (nEventID == 4) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,Ask(2), 0); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { //전체 보유 종목 수 Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); //전체 보유 종목을 하나씩 불러와 for(var i = 0; i < num; i++) { //잔고객체를 셋팅하고 Account1.SetBalanceIndex(i); // 해당 잔고가 매도이면 보유수량만큼 매수주문 if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Ask(2), 0); } //해당 잔고가 매수이면 보유수량만큼 매도주문 if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Bid(2), 0); } } } }