커뮤니티

예스스팟 활용, 주문 미체결시 자동 정정주문 방법 문의

프로필 이미지
태산정복
2026-06-10 21:45:20
69
글번호 232358
답변완료

안녕하세요!


미니 KOSPI 200 선물연결을 거래할 떄, 호가가 널뛰듯이 움직여, 자동매매 셋팅하면서

현재가 +- 5로 진입 청산 설정할 경우, 주문체결이 안되는 경우가 발생하고 있습니다.

시장가 셋팅시에는 서킷브레이크 등 발동시 시장가 주문 자체가 들어가지를 않습니다.


예스스팟에서 기본적으로 현재가 +-5로 진입 및 청산주문 미체결시, 2초이내 동일하게 현재가 +-5로

정정 주문을 하는 스크립트 및 예스스팟 셋팅 방법을 문의드립니다.


감사합니다.



답변 4
프로필 이미지

예스스탁 예스스탁 답변

2026-06-15 16:37:11

안녕하세요 예스스탁입니다. 아래 내용 참고하시기 바랍니다. 차트에서 신호가 발생하면 현재가+-5호가로 주문이후 2초 뒤에 미체결이면 다시 현재가+-5호가로 정정주문을 하는 내용입니다. 단 정정시 기존주문가격과 동일하면 주문거부이므로 정정주문을 집행하지 않습니다. 정정주문시간과 정정횟수는 변수로 지정이 가능합니다. var 정정주문시간 = 2;//2초 var 정정횟수 = 1; var OC, MK; var BID,BXID,SID,SXID; var BNUM,BXNUM,SNUM,SXNUM; var Bcnt,BXcnt,Scnt,SXcnt; 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) { Main.MessageList("매수진입신호"); //현재가+5호가로 매수주문 집행 BID = Account1.OrderBuy(OC, Signal.count, MK.current + MK.GetTickSize()*5,0); //1번 타이머 셋팅 Main.SetTimer(1, 정정주문시간*1000); Bcnt = 0; } //매수청산 신호 발생 if (Signal.signalKind == 2) { Main.MessageList("매수청산신호"); //현재가-5호가로 매도주문 집행 BXID = Account1.OrderSell(OC, Signal.count, MK.current - MK.GetTickSize()*5, 0); //2번 타이머 셋팅 Main.SetTimer(2, 정정주문시간*1000); BXcnt = 0; } //매도진입신호 발생 if (Signal.signalKind == 3) { Main.MessageList("매도진입신호"); //현재가-5호가로 매도주문 집행 SID = Account1.OrderSell(OC, Signal.count,MK.current - MK.GetTickSize()*5,0); //3번 타이머 셋팅 Main.SetTimer(3, 정정주문시간*1000); Scnt = 0; } //매도청산 신호 발생 if (Signal.signalKind == 4) { Main.MessageList("매도청산신호"); //현재가+5호가로 매수주문 집행 SXID = Account1.OrderBuy(OC, Signal.count, MK.current + MK.GetTickSize()*5, 0); //4번 타이머 셋팅 Main.SetTimer(4, 정정주문시간*1000); SXcnt = 0; } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입주문에 대한 응답이 오면 if (OrderResponse.orderID == BID) { //주문번호 저장 BNUM = OrderResponse.orderNum; } //매수청산주문에 대한 응답이 오면 if (OrderResponse.orderID == BXID) { //주문번호 저장 BXNUM = OrderResponse.orderNum; } //매도진입주문에 대한 응답이 오면 if (OrderResponse.orderID == SID) { //주문번호 저장 SNUM = OrderResponse.orderNum; } //매도청산주문에 대한 응답이 오면 if (OrderResponse.orderID == SXID) { //주문번호 저장 SXNUM = OrderResponse.orderNum; } } //타이머 실행 function Main_OnTimer(nEventID) { //1번타이머 if (nEventID == 1) { Main.MessageList("매수진입주문 정정타이머 동작"); //카운트 1씩 증가 Bcnt = Bcnt+1; //정정횟수에 도달하면 타이머종료 if (Bcnt == 정정횟수) { //1번 타이머 종료 Main.KillTimer(1); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(BNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var BRP = MK.current + MK.GetTickSize()*5; if (BRP != Account1.Unfill.price) { Main.MessageList("매수진입주문 정정 :",BRP); Account1.OrderReplacePrice(BNUM,BRP); } else { Main.MessageList("매수진입주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매수진입주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(1); } } //2번타이머 if (nEventID == 2) { Main.MessageList("매수청산주문 정정타이머 동작"); //카운트 1씩 증가 BXcnt = BXcnt+1; //정정횟수에 도달하면 타이머종료 if (BXcnt == 정정횟수) { //2번 타이머 종료 Main.KillTimer(2); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(BXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var BXRP = MK.current - MK.GetTickSize()*5; if (BXRP != Account1.Unfill.price) { Main.MessageList("매수청산주문 정정 :",BXRP); Account1.OrderReplacePrice(BXNUM,BXRP); } else { Main.MessageList("매수청산주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매수청산주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(2); } } //3번타이머 if (nEventID == 3) { Main.MessageList("매도진입주문 정정타이머 동작"); //카운트 1씩 증가 Scnt = Scnt+1; //정정횟수에 도달하면 타이머종료 if (Scnt == 정정횟수) { //3번 타이머 종료 Main.KillTimer(3); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(SNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var SRP = MK.current - MK.GetTickSize()*5; if (SRP != Account1.Unfill.price) { Main.MessageList("매도진입주문 정정 :",SRP); Account1.OrderReplacePrice(SNUM,SRP); } else { Main.MessageList("매도진입주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매도진입주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(3); } } //4번타이머 if (nEventID == 4) { Main.MessageList("매도청산주문 정정타이머 동작"); //카운트 1씩 증가 SXcnt = SXcnt+1; //정정횟수에 도달하면 타이머종료 if (SXcnt == 정정횟수) { //3번 타이머 종료 Main.KillTimer(4); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(SXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var SXRP = MK.current + MK.GetTickSize()*5; if (SXRP != Account1.Unfill.price) { Main.MessageList("매도청산주문 정정 :",SXRP); Account1.OrderReplacePrice(SXNUM,SXRP); } else { Main.MessageList("매도청산주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매도청산주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(4); } } } 즐거운 하루되세요
프로필 이미지

예스스탁 예스스탁 답변

2026-06-17 10:48:33

안녕하세요 예스스탁입니다. 정정횟수 2회 이상일 경우 주문번호 갱신을 위해 내용을 일부 수정했습니다. var 정정주문시간 = 2;//2초 var 정정횟수 = 1; var OC, MK; var BID,BXID,SID,SXID; var BNUM,BXNUM,SNUM,SXNUM; var Bcnt,BXcnt,Scnt,SXcnt; 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) { Main.MessageList("매수진입신호"); //현재가+5호가로 매수주문 집행 BID = Account1.OrderBuy(OC, Signal.count, MK.current + MK.GetTickSize()*5,0); //1번 타이머 셋팅 Main.SetTimer(1, 정정주문시간*1000); Bcnt = 0; } //매수청산 신호 발생 if (Signal.signalKind == 2) { Main.MessageList("매수청산신호"); //현재가-5호가로 매도주문 집행 BXID = Account1.OrderSell(OC, Signal.count, MK.current - MK.GetTickSize()*5, 0); //2번 타이머 셋팅 Main.SetTimer(2, 정정주문시간*1000); BXcnt = 0; } //매도진입신호 발생 if (Signal.signalKind == 3) { Main.MessageList("매도진입신호"); //현재가-5호가로 매도주문 집행 SID = Account1.OrderSell(OC, Signal.count,MK.current - MK.GetTickSize()*5,0); //3번 타이머 셋팅 Main.SetTimer(3, 정정주문시간*1000); Scnt = 0; } //매도청산 신호 발생 if (Signal.signalKind == 4) { Main.MessageList("매도청산신호"); //현재가+5호가로 매수주문 집행 SXID = Account1.OrderBuy(OC, Signal.count, MK.current + MK.GetTickSize()*5, 0); //4번 타이머 셋팅 Main.SetTimer(4, 정정주문시간*1000); SXcnt = 0; } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입주문에 대한 응답이 오면 if (OrderResponse.orderID == BID) { //주문번호 저장 BNUM = OrderResponse.orderNum; } //매수청산주문에 대한 응답이 오면 if (OrderResponse.orderID == BXID) { //주문번호 저장 BXNUM = OrderResponse.orderNum; } //매도진입주문에 대한 응답이 오면 if (OrderResponse.orderID == SID) { //주문번호 저장 SNUM = OrderResponse.orderNum; } //매도청산주문에 대한 응답이 오면 if (OrderResponse.orderID == SXID) { //주문번호 저장 SXNUM = OrderResponse.orderNum; } } //타이머 실행 function Main_OnTimer(nEventID) { //1번타이머 if (nEventID == 1) { Main.MessageList("매수진입주문 정정타이머 동작"); //카운트 1씩 증가 Bcnt = Bcnt+1; //정정횟수에 도달하면 타이머종료 if (Bcnt == 정정횟수) { //1번 타이머 종료 Main.KillTimer(1); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(BNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var BRP = MK.current + MK.GetTickSize()*5; if (BRP != Account1.Unfill.price) { Main.MessageList("매수진입주문 정정 :",BRP); BID = Account1.OrderReplacePrice(BNUM,BRP); } else { Main.MessageList("매수진입주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매수진입주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(1); } } //2번타이머 if (nEventID == 2) { Main.MessageList("매수청산주문 정정타이머 동작"); //카운트 1씩 증가 BXcnt = BXcnt+1; //정정횟수에 도달하면 타이머종료 if (BXcnt == 정정횟수) { //2번 타이머 종료 Main.KillTimer(2); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(BXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var BXRP = MK.current - MK.GetTickSize()*5; if (BXRP != Account1.Unfill.price) { Main.MessageList("매수청산주문 정정 :",BXRP); BXID = Account1.OrderReplacePrice(BXNUM,BXRP); } else { Main.MessageList("매수청산주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매수청산주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(2); } } //3번타이머 if (nEventID == 3) { Main.MessageList("매도진입주문 정정타이머 동작"); //카운트 1씩 증가 Scnt = Scnt+1; //정정횟수에 도달하면 타이머종료 if (Scnt == 정정횟수) { //3번 타이머 종료 Main.KillTimer(3); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(SNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var SRP = MK.current - MK.GetTickSize()*5; if (SRP != Account1.Unfill.price) { Main.MessageList("매도진입주문 정정 :",SRP); SID = Account1.OrderReplacePrice(SNUM,SRP); } else { Main.MessageList("매도진입주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매도진입주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(3); } } //4번타이머 if (nEventID == 4) { Main.MessageList("매도청산주문 정정타이머 동작"); //카운트 1씩 증가 SXcnt = SXcnt+1; //정정횟수에 도달하면 타이머종료 if (SXcnt == 정정횟수) { //3번 타이머 종료 Main.KillTimer(4); } //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(SXNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { var SXRP = MK.current + MK.GetTickSize()*5; if (SXRP != Account1.Unfill.price) { Main.MessageList("매도청산주문 정정 :",SXRP); SXID = Account1.OrderReplacePrice(SXNUM,SXRP); } else { Main.MessageList("매도청산주문 정정안함 :정정가격이 기존주문가격과 같음"); } } else { Main.MessageList("매도청산주문 미체결내역 없음 -> 타이머 종료 "); Main.KillTimer(4); } } } 즐거운 하루되세요
프로필 이미지

태산정복

2026-06-19 09:30:32

안녕하세요!

하기 관련, 차트 객체 추가를 하지 않으니, Syntax Unexpected identifier 라고 뜨면서, 정상 가동이 안됩니다.
차트 객체 추가에서 차트 아이디 설정을 어떻게 하면 되는지요?
프로필 이미지

예스스탁 예스스탁 답변

2026-06-24 16:02:56

안녕하세요 예스스탁입니다. 차트 오른쪽 하단에 연필모양 아이콘 클릭하면 아이디 지정할 수 있습니다. 아래 도움말 참고하시기 바랍니다. https://help.yesstock.com/263d121b-e719-808f-a111-d2d1dee5b9ff 즐거운 하루되세요