예스스탁
예스스탁 답변
2025-10-14 17:40:50.0
안녕하세요
예스스탁입니다.
1
예스랭귀지에는 별도로 취소주문 등의 기능이 없습니다.
차트기반인 예스랭귀지는 신호만 발생하고 자동매매시 주문까지만 집행합니다.
체결/미체결을 랭귀지에서 알지 못해 해당 내용은 예스랭귀지로 구현이 불가합니다.
2
해당 내용을 해결하시려면 예스스팟과 결합하셔야 합니다.
스팟에서 차트에서 신호가 발생하면 주문을 내고
진입신호에 대한 주문 후 일정시간 이후에 미체결이면 취소를 하게 구현하셔야 하고
진입주문에 대해 취소했다면 다음 청산신호에는 주문을 내지 않게 구현해서
운용하셔야 합니다.
아래 스팟수식 내용 참고하시기 바랍니다.
스크립트 객체화면 설정
차트객체 : 객체명 Chart1 → 속성에서 차트와 동일 아이디 지정
계좌객체 : 객체명 Account1 → 속성에서 계좌번호 선택
var OC, MK, pst;
var BID, SID, BNUM, SNUM;
var 취소주문시간 = 300;//300초
function Main_OnStart()
{
Main.MessageList("Start");
//차트종목 종목코드
OC = Main.GetOrderCode(Chart1.GetCode(1));
//종목객체 요청
Main.ReqMarketData(OC);
pst = 0;
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OC)
{
MK = MarketData;
}
}
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
//신호수량 저장
BV = Signal.count;
//매수주문 집행(신호수량, 현재가 지정가)
BID = Account1.OrderBuy(OC, BV, MK.current,2);
//포지션은 1
pst = 1;
//1번 300초 타이머 셋팅
Main.SetTimer(1, 취소주문시간*1000);
Main.MessageList("매수진입신호:",BV);
}
//스팟에서 매수진입 이후에 매수청산 신호 발생
if (pst == 1 && Signal.signalKind == 2)
{
//1번 타이머 종료
Main.KillTimer(1);
//진입매수주문 미체결 객체 셋팅
Account1.SetUnfillOrderNumber(BNUM);
//미체결이 있으면
if ( Account1.Unfill.count > 0 )
{
//진입수량에서 미체결수량 차감
BV = BV-Account1.Unfill.count;
//미체결 주문 취소
Account1.OrderCancel(BNUM);
}
Main.MessageList("매수청산:",BV);
//매수진입수량에서 미체결수량 차감후 0이 아니면(진입전량 체결이나 일부체결)
if (BV > 0)
{
//청산을 위해 매도주문 집행(수량은 BV, 매수5호가 지정가)
Account1.OrderSell(OC, BV, MK.Bid(5), 2);
}
}
//매도진입신호 발생
if (Signal.signalKind == 3)
{
//신호수량 저장
SV = Signal.count;
//매도주문 집행(신호수량, 현재가 지정가)
SID = Account1.OrderSell(OC, SV,MK.current,2);
//포지션은 -1
pst = -1;
//3번 300초 타이머 셋팅
Main.SetTimer(3, 취소주문시간*1000);
Main.MessageList("매도진입신호:",SV);
}
//스팟에서 매도진입 이후에 매도청산 신호 발생
if (pst == -1 && Signal.signalKind == 4)
{
//3번 타이머 종료
Main.KillTimer(3);
//진입매도주문 미체결 객체 셋팅
Account1.SetUnfillOrderNumber(SNUM);
//미체결이 있으면
if ( Account1.Unfill.count > 0 )
{
//진입수량에서 미체결수량 차감
SV = SV-Account1.Unfill.count;
//미체결 주문 취소
Account1.OrderCancel(SNUM);
}
Main.MessageList("매도청산:",SV);
//매도진입수량에서 미체결수량 차감후 0이 아니면(진입전량 체결이나 일부체결)
if (SV > 0)
{
//청산을 위해 매수주문 집행(수량은 SV, 매도5호가 지정가)
Account1.OrderBuy(OC, SV, MK.Ask(5), 2);
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//매수진입주문에 대한 응답이 오면
if (OrderResponse.orderID == BID)
{
//주문번호 저장
BNUM = OrderResponse.orderNum;
}
//매도진입주문에 대한 응답이 오면
if (OrderResponse.orderID == SID)
{
//주문번호 저장
SNUM = OrderResponse.orderNum;
}
}
//타이머 실행
function Main_OnTimer(nEventID)
{
//1번타이머
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(1);
//매수진입주문에 대해 미체결 셋팅
Account1.SetUnfillOrderNumber(BNUM);
//미체결이 있으면
if (Account1.Unfill.count > 0)
{
//매수진입수량에서 미체결수량 차감
BV = BV-Account1.Unfill.count;
Main.MessageList("매수진입취소:",BV);
//미체결주문 취소
Account1.OrderCancel(BNUM);
}
}
//3번타이머
if (nEventID == 3)
{
//타이머 종료
Main.KillTimer(3);
//매도진입주문에 대해 미체결 셋팅
Account1.SetUnfillOrderNumber(SNUM);
//미체결이 있으면
if (Account1.Unfill.count > 0)
{
//매수진입수량에서 미체결수량 차감
SV = SV-Account1.Unfill.count;
Main.MessageList("매도진입취소:",SV);
//미체결주문 취소
Account1.OrderCancel(SNUM);
}
}
}
즐거운 하루되세요
> 스오어스 님이 쓴 글입니다.
> 제목 : 답변 감사합니다. 궁금한게 있습니다.
> 답변 감사합니다.
근데요. 궁금한게요.
조건 만족 후 진입 체결 못해서 진입 못하면 진입 위해 걸어둔 것을 무효화 하거나 치우는 방법이 있을까요?
미체결으로 계속 남는 것을 봤고요.
청산도 마찬가지 입니다. 이것은 옵션창에서 현재가 +-5 하면 해결 되겠지만요..
진입 못해서 미체결으로 남긴 것을 5분 후에 취소할 수 있는 코드가 뭘까요?