커뮤니티

예스스팟 Q&A

답변완료

문의 드립니다.

모의투자 진행 중입니다. 오늘 차트에서 기본적인 청산 신호인 ExitShort("청산"); 발생하여 예스스팟에서 청산 로직이 실행이 되었습니다. 그런데 ExitShort("청산", AtStop, lowest(L, BarsSinceEntry+1) + atr(var1)*var2); 청산신호가 차트에서 뜨면 예스스팟의 Chart_OnRiseSignal(Signal) 까지는 타고 가는데 Signal.signalKind == 4 로직을 실행 시키지 못했습니다. (모의투자에서) AtStop 문제인가요? 아니면 다른 문제인가요? 28일 이전에는 AtStop 신호가 제대로 청산이 되었습니다.
프로필 이미지
달무드
2018-03-02
2527
글번호 224347
답변완료

봉의 시작시간

아래의 수식을 var T; function Main_OnStart() { T = 0; Main.MessageLog("시작"); OrderCode = Main.GetOrderCode(KP.code); } function C1_OnRiseIncompleteSignal(IncompleteSignal) { Main.MessageLog("미완성신호/"+IncompleteSignal.signalKind); A1.SetBalance(Main.GetOrderCode(IncompleteSignal.code)) 이하생략 } 매 영업일 09시 05분 이후부터 영업일 종료시간까지 발생하는 미완성신호만을 적용하고자 할 때의 수식으로 변경하여 주시면 감사하겠습니다.
프로필 이미지
너무조아
2018-03-03
2608
글번호 224346
답변완료

문의드립니다.

선물옵션 거래시 옵션 양매도를 할경우 가격교차지점에서 양매도 포지션을 진입하거나, 일정시간즉 매일 11시에 양매도 진입하고, 양합이 50틱 수익 발생시 일괄청산하거나, 매일 15에 일괄청산하는 수식을 부탁드려도 될까요?
프로필 이미지
하늘북
2018-03-01
2699
글번호 224345

달무드 님에 의해서 삭제되었습니다.

프로필 이미지
달무드
2018-02-23
15
글번호 224344
답변완료

질문입니다.

현재 선물 1계약을 운용하고 있습니다. 예스트레이더로 시스템을 작성하였고, 예스스팟으로 주문을 컨트롤하고 있습니다. 간단히 설명을 드리면 다음과 같습니다. 예스스팟 구동시 현재의 계좌상황을 파악하게됩니다. 현재 포지션이 없는지 있는지, 있다면 롱포지션인지 숏포지션인지 판단합니다. 그리고 예스트레이더에서 신호가 발생하면, 예스스팟으로 실행합니다. 만약 체결되지 않는다면 5초마다 정정거래를 발생시킵니다. 여기까지 적성되어 있습니다. 질문입니다. 예스트레이더 선물거래시스템을 3계약으로 늘릴려고합니다. 피라미딩으로 말이죠. 예를들어 1계약 매수진입 후 추가조건을 만족하면 1계약추가진입하고(총2계약), 또다시 추가조건진입을 만족하면 1계약추가진입합니다(총3계약). 매도쪽도 마찬가지입니다. 예스트레이더 시스템은 완성하였습니다. 이를 예스스팟으로 신호를 컨트롤하고자 합니다. 예스스팟 로직은 다음과 같이 구성하고 싶습니다. 처음 예스스팟 구동 시 현재 포지션의 상황을 파악합니다. 포지션이 없는지 있는지, 있다면 롱포지션인지 숏포지션인지, 그리고 추가사항이 현재포지션에서 진입한 계약수가 몇개인지 파악하고 싶습니다. 그리고 피라미딩 진입도 예스스팟으로 컨트롤하고 싶습니다. 예를들어 매수1계약 진입을 "Long1"으로 명명한다면, 추가1계약진입 시 "Long2"로 명명하고, 여기서 추가1계약진입 시 "Long3"로 명명하고 싶습니다. 매수청산도 각각 "Exit Long1", "Exit Long2", "Exit Long3"으로 명명하고 싶습니다. 매도쪽도 마찬가지입니다. 피라미딩 진입도 초기1계약진입과 마찬가지로 정정주문을 5초마다 현재가를 갱신하며 정정하고 싶습니다. 현재사용하고 있는 예스스팟을 올립니다. 아직 예스스팟에 익숙치못해 그러니, 상세한 주석과 함께 부탁드립니다. 감사합니다. 예스스팟 //yT7 var Position; var OrderCode; var BID, BXID, SID, SXID; var BNum, BXNum, SNum, SXNum; function Main_OnStart() { //"OnStart" 출력. //Main.MessageLog("Start"); //시스템을 연결선물에 적용. 따라서 주문용 종목코드를 리턴받아 OrderCode에 저장. OrderCode = Main.GetOrderCode(MarketData1.code); //OrderCode종목 잔고셋팅. Account1.SetBalance(OrderCode, 0); //현재 포지션이 매도나 매수가 아니라면, if (Account1.Balance.position != 1 && Account1.Balance.position != 2) { //Position에 0 대입. Position = 0; //"Current Zero" 출력. Main.MessageLog("Current Zero"); } //현재 포지션이 매도라면, if (Account1.Balance.position == 1) { //Position에 -1 대입. Position = -1; //"Current Short" 출력. Main.MessageLog("Current Short"); } //현재 포지션이 매수라면, if (Account1.Balance.position == 2) { //Position에 1 대입. Position = 1; //"Current Long" 출력. Main.MessageLog("Current Long"); } } function Chart1_OnRiseSignal(Signal) { //완성된 시그널 출력. //Main.MessageLog("Signal : "+Signal.signalKind); //Position가 0이고, 시그널 종류가 매수라면, if (Position == 0 && Signal.signalKind == 1) { //Position에 1 대입. Position = 1; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문, BID에 주문식별번호 저장. BID = Account1.OrderBuy(OrderCode, Signal.count, MarketData1.current, 0); //"Long" 출력 Main.MessageLog("Long"); } //Position이 1이고, 시그널 종류가 매수청산이라면, if (Position == 1 && Signal.signalKind == 2) { //Position에 0 대입. Position = 0; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문, BXID에 주문식별번호 저장. BXID = Account1.OrderSell(OrderCode, Signal.count, MarketData1.current, 0); //"ExitLong" 출력 Main.MessageLog("ExitLong"); } //Position이 0이고, 시그널 종류가 매도라면, if (Position == 0 && Signal.signalKind == 3) { //Position에 -1 대입. Position = -1; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Sell 주문, SID에 주문식별번호 저장. SID = Account1.OrderSell(OrderCode, Signal.count, MarketData1.current, 0); //"Short" 출력 Main.MessageLog("Short"); } //Position이 -1이고, 시그널 종류가 매도청산이라면, if (Position == -1 && Signal.signalKind == 4) { //Position에 0 대입 Position = 0; //주문형 종목코드로, 시스템에서 지정한 수량만큼, 현재가로 Buy 주문, SXID에 주문식별번호 저장. SXID = Account1.OrderBuy(OrderCode, Signal.count, MarketData1.current, 0); //"ExitShort" 출력 Main.MessageLog("ExigShort"); } } function Main_OnOrderResponse(OrderResponse) { //해당 주문응답이 Long신호에 대한 주문응답이라면, if (OrderResponse.orderID == BID) { //BNum에 주문응답객체의 주문번호를 저장하고, BNum = OrderResponse.orderNum; //1번 타이머 실행(5초 간격). Main.SetTimer(1, 5000); } //해당 주문응답이 ExitLong신호에 대한 주문응답이라면, if (OrderResponse.orderID == BXID) { //BXNum에 주문응답객체의 주문번호를 저장하고, BXNum = OrderResponse.orderNum; //2번 타이머 실행(5초 간격). Main.SetTimer(2, 5000); } //해당 주문응답이 Short신호에 대한 주문응답이라면, if (OrderResponse.orderID == SID) { //SNum에 주문응답객체의 주문번호를 저장하고, SNum = OrderResponse.orderNum; //3번 타이머 실행(5초 간격). Main.SetTimer(3, 5000); } //해당 주문응답이 ExitShort신호에 대한 주문응답이라면, if (OrderResponse.orderID == SXID) { //SXNum에 주문응답객체의 주문번호를 저장하고, SXNum = OrderResponse.orderNum; //4번 타이머 실행(5초 간격). Main.SetTimer(4, 5000); } } function Main_OnTimer(nEventID) { //1번 타이머 실행. if (nEventID == 1) { //1번 타이머 종료. Main.KillTimer(1); //BNum 주문번호의 미체결객체 셋팅. Account1.SetUnfillOrderNumber(BNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum 새로 갱신하고 타이머 재셋팅. BID = Account1.OrderReplacePrice(BNum, CC); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 1번 타이머 재셋팅. Main.SetTimer(1, 5000); } } //2번 타이머 실행. if (nEventID == 2) { //2번 타이머 종료. Main.KillTimer(2); //BXNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BXNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BXNum새로 갱신하고 타이머 재셋팅. BXID = Account1.OrderReplacePrice(BXNum, MarketData1.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 2번 타이머 재셋팅. Main.SetTimer(2, 5000); } } //3번 타이머 실행 if (nEventID == 3) { //3번 타이머 종료 Main.KillTimer(3); //SNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문후 주문응답시 SNum새로 갱신하고 타이머 재셋팅. SID = Account1.OrderReplacePrice(SNum, MarketData1.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 3번 타이머 재셋팅. Main.SetTimer(3, 5000); } } //4번 타이머 실행 if (nEventID == 4) { //4번 타이머 종료 Main.KillTimer(4); //SXNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SXNum); //현재가 저장 var CC = MarketData1.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 SXNum새로 갱신하고 타이머 재셋팅. SXID = Account1.OrderReplacePrice(SXNum, MarketData1.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 4번 타이머 재셋팅. Main.SetTimer(4, 10000); } } } function Main_OnNotifyFill(NotifyFill) { //"NotifyFill" 출력. //Main.MessageLog("NotifyFill"); //BNum 주문 체결되면, if (NotifyFill.orderNum == BNum) { //1번 타이머 종료. Main.KillTimer(1); //BNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Long" 출력. Main.MessageLog("N.Long"); } } //BXNum 주문 체결되면, if (NotifyFill.orderNum == BXNum) { //2번 타이머 종료. Main.KillTimer(2); //BXNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BXNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify ExitLong" 출력. Main.MessageLog("N.ExitLong"); } } //SNum 주문 체결되면, if (NotifyFill.orderNum == SNum) { //1번 타이머 종료. Main.KillTimer(3); //SNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Short" 출력. Main.MessageLog("N.Short"); } } //SXNum 주문 체결되면, if (NotifyFill.orderNum == SXNum) { //4번 타이머 종료. Main.KillTimer(4); //SXNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SXNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify ExitShort" 출력. Main.MessageLog("N.ExitShort"); } } }
프로필 이미지
yanartas
2018-02-20
2807
글번호 224341
답변완료

문의드립니다.

예제로 있는 수식보다가 궁금해졌는데요. 예스랭귀지 전략을 스팟에다 적용시키려면 이지랭귀지로 돼 있는 것을 다 자바스크립트 식으로 풀어서 작성해야 하나요? 비슷한 포맷인 웰스멘토도 마찬가지인가요? /*스크립트시작-----------------------------------------------------*/ var Start; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; } function C1_OnRiseSignal(Signal) { var dayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1,0); var dayma2 = C2.GetIndicatorData("이동평균 5_20_60", 2,0); var dayma3 = C2.GetIndicatorData("이동평균 5_20_60", 3,0); var predayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1,1); var slowK = C2.GetIndicatorData("Stochastics",1,0); if (Signal.signalKind == 1 && dayma1 > dayma2 && dayma2 > dayma3 && dayma1 > predayma1 && slowK <= 30) { A1.OrderBuy(Signal.code,Signal.count,SSE.Ask(2),0); Start = 1; } if (Signal.signalKind == 2 && Start == 1) { A1.OrderSell(Signal.code,Signal.count,SSE.Bid(2),0); } }
프로필 이미지
잡다백수
2018-02-11
2803
글번호 224340

파일럿 님에 의해서 삭제되었습니다.

프로필 이미지
파일럿
2018-02-11
3
글번호 224339

약쟁이 님에 의해서 삭제되었습니다.

프로필 이미지
약쟁이
2018-02-10
2
글번호 224338

약쟁이 님에 의해서 삭제되었습니다.

프로필 이미지
약쟁이
2018-02-10
0
글번호 224337
답변완료

오류 수정부탁드립니다.

항상 고맙습니다. 이번에 보내주신 답변 잘 받았습니다. 그런데 테스트를 해 보니 4개의 차트 중에서 3번째 차트에서만 신호가 발생합니다. 혹시나 해서 3번차트의 신호를 삭제했더니 1,2,4번 차트에 신호가 적용이 되어 있는데도 주문이 이루어 지지 않네요. 제가 적용을 잘 못한 것인지 아님 수식의 오류인지 판단할 능력이 부족하여 다시 올립니다. 한번 더 검토해 주셨으면 합니다. **************************************************************************** 안녕하세요 예스스탁입니다. 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); } } }
프로필 이미지
지킴이
2018-02-04
2845
글번호 224330