커뮤니티
예스스팟 활용, 주문 미체결시 자동 정정주문 방법 문의
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
즐거운 하루되세요
다음글