Search
📝

예제29. 신호발생시 지정가 주문 후 일정시간 경과 후 미체결이 있으면 취소하고 시장가로 주문

지정가 주문 후 미체결 시 취소하고 시장가로 재주문하는 예제입니다. 기본 주문은 차트에서 신호발생시 주문을 내는 수식입니다.
1.
전략내용 차트에서 신호가 발생하면 현재가로 주문하고 5초 후에 미체결이 있으면 상대 3호가로 정정하고 다시 5초 후에 미체결이 있으면 주문 취소 후 시장가로 주문 상대호가는 매수주문의 경우 매도호가, 매도주문은 매수호가를 의미합니다.
2.
스크립트 객체화면 설정 차트객체 : 객체명 Chart1 → 속성에서 차트와 동일 아이디 지정 계좌객체 : 객체명 Account1 → 속성에서 계좌번호 선택
3.
스팟수식
var 정정주문시간 = 5;//5초 var OC, MK; var BID,BXID,SID,SXID; var BIDC,BXIDC,SIDC,SXIDC; var BNUM,BXNUM,SNUM,SXNUM; var Bcnt,BXcnt,Scnt,SXcnt; var BV,SV,BVC,SVC; function Main_OnStart() { Main.MessageList("Start"); //차트종목 종목코드 OC = Main.GetOrderCode(Chart1.GetCode(1)); //종목객체 요청 Main.ReqMarketData(OC); } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OC) { MK = MarketData; } } function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1) { //신호수량 저장 BV = Signal.count; Main.MessageList("매수진입신호:",BV); //현재가로 매수주문 집행 //주문 아이디는 BID에 저장 BID = Account1.OrderBuy(OC, BV, MK.current,0); //1번 타이머 셋팅 Main.SetTimer(1, 정정주문시간*1000); //매수진입주문 정정 카운트 Bcnt = 0; } //매수청산 신호 발생 if (Signal.signalKind == 2) { //매수진입주문 미체결 객체 셋팅 Account1.SetUnfill(BNUM); //미체결이 있으면 if ( Account1.Unfill.count > 0 ) { //진입수량에서 미체결수량 차감 BV = BV-Account1.Unfill.count; //미체결 주문 취소 Account1.OrderCancel(BNUM); } Main.MessageList("매수청산신호:",BV); //매수진입주문이 체결이 있는 경우만 동작 if (BV > 0) { //현재가로 매도주문 집행 //주문 아이디는 BXID에 저장 BXID = Account1.OrderSell(OC, BV, MK.current, 0); //2번 타이머 셋팅 Main.SetTimer(2, 정정주문시간*1000); //매수청산 주문 정정카운트 BXcnt = 0; } else { Main.MessageList("매수진입주문 체결이 없음"); } } //매도진입신호 발생 if (Signal.signalKind == 3) { //신호수량 저장 SV = Signal.count; Main.MessageList("매도진입신호:",SV); //현재가로 매도주문 집행 SID = Account1.OrderSell(OC, SV, MK.current,0); //3번 타이머 셋팅 Main.SetTimer(3, 정정주문시간*1000); //매도진입주문 정정 카운트 Scnt = 0; } //매도청산 신호 발생 if (Signal.signalKind == 4) { //매도진입주문 미체결 객체 셋팅 Account1.SetUnfill(SNUM); //미체결이 있으면 if ( Account1.Unfill.count > 0 ) { //진입수량에서 미체결수량 차감 SV = SV-Account1.Unfill.count; //미체결 주문 취소 Account1.OrderCancel(SNUM); } Main.MessageList("매도청산신호:",SV); //매도진입주문이 체결이 있는 경우만 동작 if (SV > 0) { //현재가+5호가로 매수주문 집행 SXID = Account1.OrderBuy(OC, SV, MK.current, 0); //4번 타이머 셋팅 Main.SetTimer(4, 정정주문시간*1000); //매도청산주문 정정 카운트 SXcnt = 0; } else { Main.MessageList("매도진입주문 체결이 없음"); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입주문에 대한 응답이 오면 if (OrderResponse.orderID == BID) { //주문번호 저장 BNUM = OrderResponse.orderNum; } //매수진입주문에 대한 취소주문 응답이 오면 if (OrderResponse.orderID == BIDC) { //시장가로 매수주문 집행 //주문 아이디는 BID에 저장 BID = Account1.OrderBuy(OC ,BVC, 0, 1); Main.MessageList("매수진입주문 시장가 주문:",BVC); } //매수청산주문에 대한 응답이 오면 if (OrderResponse.orderID == BXID) { //주문번호 저장 BXNUM = OrderResponse.orderNum; } //매수청산주문에 대한 취소주문 응답이 오면 if (OrderResponse.orderID == BXIDC) { //시장가로 매도주문 집행 //주문 아이디는 BXID에 저장 BXID = Account1.OrderSell(OC ,BXVC, 0, 1); Main.MessageList("매수청산주문 시장가 주문:",BXVC); } //매도진입주문에 대한 응답이 오면 if (OrderResponse.orderID == SID) { //주문번호 저장 SNUM = OrderResponse.orderNum; } //매도진입주문에 대한 취소주문 응답이 오면 if (OrderResponse.orderID == SIDC) { //시장로 매도주문 집행 //주문 아이디는 SID에 저장 SID = Account1.OrderSell(OC ,SVC, 0, 1); Main.MessageList("매도진입주문 시장가 주문:",SVC); } //매도청산주문에 대한 응답이 오면 if (OrderResponse.orderID == SXID) { //주문번호 저장 SXNUM = OrderResponse.orderNum; } //매도청산주문에 대한 취소주문 응답이 오면 if (OrderResponse.orderID == SXIDC) { //시장가로 매수주문 집행 //주문 아이디는 SXID에 저장 SXID = Account1.OrderBuy(OC ,SXVC, 0, 1); Main.MessageList("매수청산주문 시장가 주문:",SXVC); } } //타이머 실행 function Main_OnTimer(nEventID) { //1번타이머 if (nEventID == 1) { Main.MessageList("매수진입주문 정정타이머 동작"); //카운트 1씩 증가 Bcnt = Bcnt+1; if (Bcnt == 1) { //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfill(BNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var BRP = MK.Ask(3); if (BRP != Account1.Unfill.price) { Main.MessageList("매수진입주문 정정 :",BRP); BID = Account1.OrderReplacePrice(BNUM,BRP); } else { Main.MessageList("매수진입주문 정정안함 : 정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매수진입주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(1); } } if (Bcnt == 2) { //1번 타이머 종료 Main.KillTimer(1); //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfill(BNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { BVC = Account1.Unfill.count; BIDC = Account1.OrderCancel(BNUM); Main.MessageList("매수진입주문 취소"); } else { Main.MessageList("매수진입주문 미체결내역 없음"); } } } //2번타이머 if (nEventID == 2) { Main.MessageList("매수청산주문 정정타이머 동작"); //카운트 1씩 증가 BXcnt = BXcnt+1; if (BXcnt == 1) { //매수청산주문에 대해 미체결 셋팅 Account1.SetUnfill(BXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var BXRP = MK.Bid(3); if (BXRP != Account1.Unfill.price) { Main.MessageList("매수청산주문 정정 :",BXRP); BXID = Account1.OrderReplacePrice(BXNUM,BXRP); } else { Main.MessageList("매수청산주문 정정안함 : 정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매수청산주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(2); } } if (BXcnt == 2) { //2번 타이머 종료 Main.KillTimer(2); //매수청산주문에 대해 미체결 셋팅 Account1.SetUnfill(BXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { BXVC = Account1.Unfill.count; BXIDC = Account1.OrderCancel(BXNUM); Main.MessageList("매수청산주문 취소"); } else { Main.MessageList("매수청산주문 미체결내역 없음"); } } } //3번타이머 if (nEventID == 3) { Main.MessageList("매도진입주문 정정타이머 동작"); //카운트 1씩 증가 Scnt = Scnt+1; if (Scnt == 1) { //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfill(SNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var SRP = MK.Bid(3); if (SRP != Account1.Unfill.price) { Main.MessageList("매도진입주문 정정 :",SRP); SID = Account1.OrderReplacePrice(SNUM,SRP); } else { Main.MessageList("매도진입주문 정정안함 : 정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매도진입주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(3); } } if (Scnt == 2) { //3번 타이머 종료 Main.KillTimer(3); //매도진입주문에 대해 미체결 셋팅 Account1.SetUnfill(SNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { SVC = Account1.Unfill.count; SIDC = Account1.OrderCancel(SNUM); Main.MessageList("매도진입주문 취소"); } else { Main.MessageList("매도진입주문 미체결내역 없음"); } } } //4번타이머 if (nEventID == 4) { Main.MessageList("매도청산주문 정정타이머 동작"); //카운트 1씩 증가 SXcnt = SXcnt+1; if (SXcnt == 1) { //매수청산주문에 대해 미체결 셋팅 Account1.SetUnfill(SXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var SXRP = MK.Ask(3); if (SXRP != Account1.Unfill.price) { Main.MessageList("매도청산주문 정정 :",SXRP); SXID = Account1.OrderReplacePrice(SXNUM,SXRP); } else { Main.MessageList("매도청산주문 정정안함 : 정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매도청산주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(4); } } if (SXcnt == 2) { //4번 타이머 종료 Main.KillTimer(4); //매도청산주문에 대해 미체결 셋팅 Account1.SetUnfill(SXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { SXVC = Account1.Unfill.count; SXIDC = Account1.OrderCancel(SXNUM); Main.MessageList("매도청산주문 취소"); } else { Main.MessageList("매도청산주문 미체결내역 없음"); } } } }
JavaScript
복사