커뮤니티

답변 감사합니다. 궁금한게 있습니다.

프로필 이미지
스오어스
2025-10-14 14:06:04.0
33
글번호 194632
답변완료
답변 감사합니다. 근데요. 궁금한게요. 조건 만족 후 진입 체결 못해서 진입 못하면 진입 위해 걸어둔 것을 무효화 하거나 치우는 방법이 있을까요? 미체결으로 계속 남는 것을 봤고요. 청산도 마찬가지 입니다. 이것은 옵션창에서 현재가 +-5 하면 해결 되겠지만요.. 진입 못해서 미체결으로 남긴 것을 5분 후에 취소할 수 있는 코드가 뭘까요?
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

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분 후에 취소할 수 있는 코드가 뭘까요?