Search
📝

예제4. 취소주문

예스랭귀지로 작성된 시스템은 조건이 만족하면 주문만을 담당하고 계좌와 연계되지 않아 미체결 여부를 알 수가 없습니다. 그러므로 Buy신호가 발생해서 매수1계약을 주문하고 현재 미체결된 상태에서 ExitLong신호가 발생하면 잔고에 매수포지션이 없으므로 청산주문이 체결이 되면 매도1계약을 가지게 됩니다. 아래 예제는 청산신호 발생시 진입주문이 미체결이면 진입주문을 취소하고 체결이 되어 있으면 청산주문도 발생하게 하는 내용입니다.
1.
전략내용
a.
Buy진입주문이 미체결이면 ExitLong신호 발생할 때 Buy신호주문을 취소하고 청산주문을 내지 않고체결되었으면 정상적으로 주문을 집행합니다.
b.
Sell진입주문이 미체결이면 ExitShort신호 발생할 때 Sell신호주문을 취소하고 청산주문을 내지 않고체결되었으면 정상적으로 주문을 집행합니다.
2.
스크립트 객체화면 설정
a.
차트객체
차트에 적용된 시스템 신호정보를 알아야 하므로 차트객체가 필요합니다. 예제에서는 객체명을 C1으로 하고 차트아이디는 System으로 합니다.
선물시스템이 적용된 차트에 아이디를 System으로 지정합니다.
b.
계좌객체
주문을 발생해야 하므로 계좌객체를 추가한 후 계좌를 지정합니다. 객체명은 A1로 지정하고 주문 낼 계좌번호를 지정합니다.
c.
종목객체
주문시 호가등을 알기 위해 차트의 종목과 동일 종목으로 종목객체를 설정합니다.
3.
전략작성전략
a.
스팟전략이 최초 실행될 때.
① [예스스팟 스튜디오]의 디버깅창과 [예스스팟 모니터]에 시작이라는 텍스트를 출력합니다. ② 스팟전략 실행 후에 차트에서 발생하는 최초의 진입신호부터 주문을 하기 위한 처리가 필요하므로 변수(Position)를 만들어 우선 기초값을 0으로 셋팅합니다. 전역변수로 선언합니다. ③ 종목객체의 종목코드를 주문용 종목코드로 리턴받아 변수(OderCode)에 저장합니다. OrderCode는 전역변수로 선언합니다.
※ Main객체의 GetOrderCode함수는 입력한 종목코드를 주문용 종목코드로 리턴해 주는 함수입니다.일반적으로 차트등에서 많이 사용하는 연결선물지수는 선물근월물을 연결한 데이터이므로 종목코드인 00000000은 실제 존재하는 종목의 코드가 아니라 데이터 구분용 코드로 보시면 됩니다. 이런 종목코드를 주문함수에 이용하면 에러가 발생하므로 연결선물지수나 ATM연결콜풋과 같은 데이터를 종목객체나 차트의 종목으로 사용한다면 주문용 종목코드로 변경해서 주문함수에서 이용해야 합니다.
b.
차트 신호와 연계된 전략이므로 차트객체(C1)의 OnRiseSignal 이벤트를 사용합니다.
OnRiseSignal은 연결된 차트에서 완성신호가 발생했을 때 호출되는 이벤트이고 완성신호 정보는완성신호객체(Signal)가 제공합니다. 메시지로그 함수로 완성신호 이벤트가 발생하면 신호완성이라는 텍스트를 함께 신호종류를 디버깅창에 출력합니다. 완성신호 이벤트 발생할 때 신호종류를 확인하고 주문을 발생하거나 취소주문을 발생합니다.
c.
Buy 완성신호가 발생했을 경우로 완성신호 이벤트 안에 기술하는 내용입니다.
① Position에 1값을 저장합니다.
※ 변수(Position)은 2가지 용도로 사용하기 위해 만든 변수입니다. 첫번째는 스팟전략 실행 후 최초로 발생하는 진입주문부터 주문을 발생하기 위한 용도이며 두번째는 주문응답이벤트나 체결통보이벤트 발생 시 최근 주문의 상태를 확인하는 용도입니다. 전역변수로 선언하고 사용합니다.
② 현재가로 매수주문을 발생하고 주문식별번호는 BID변수에 저장합니다.
※ OrderCode를 주문종목으로 지정 ※ 주문수량으로 지정한 Signal.count는 차트시스템에서 설정된 수량입니다. ※ 저장된 주문식별번호는 주문응답 이벤트 발생 시 현재 주문의 응답인지 확인하기 위해 사용됩니다.
③ 매수진입이라는 텍스트를 디버깅창과 [예스스팟모니터]에 출력합니다.
④ BuyFill에 0을 할당합니다.
※ 변수(BuyFill)은 Buy신호시 발생한 매수주문이 체결되면 1로 변경됩니다.
d.
ExitLong 완성신호 발생했을 경우로 완성신호 이벤트 발생시 기술하는 내용입니다.
if (Position== 1 and Signal.signalKind == 2) 조건은 완성신호의 종류가 ExitLong이고 Position에 1이 이미 저장된 상태라는 내용입니다. 스팟전략 적용하고 Buy나 Sell신호가 발생해서 Position가 1값을 가진 이후에 발생하게 한 내용입니다. ExitLong신호가 발생할 때는 진입주문이 미체결된 경우와 체결된 경우로 나누어 조건문을 만듭니다. ①. BuyFill은 매수진입주문 시에 0으로 셋팅되고 체결통보를 받으면 1로 변경이 됩니다. 그러므로 BuyFill이 1이라는 의미는 매수진입주문이 체결된 상태를 나타냅니다.
②. 매수청산을 위해 매도주문을 집행합니다.
※ OrderCode를 주문종목으로 지정 ※ 주문수량으로 지정한 Signal.count는 차트시스템에서 설정된 수량입니다. ※ 매수2호가로 지정가 매도주문합니다.
③. 매수청산실행이라는 텍스트를 디버깅창과 [예스스팟모니터]에 출력합니다.
④. BuyFill이 0이라는 의미는 매수진입이 미체결된 상태를 나타냅니다.
⑤. 매수진입주문이 체결되지 않았으므로 매수청산을 위한 매도주문은 생략하고 미체결된 매수진입주문에 대해 취소주문을 집행합니다.
※ 주문번호는 주문응답 이벤트 발생 대 저장한 Bnum입니다.
⑥. 매수청산취소라는 텍스트를 디버깅창과 [예스스팟모니터]에 출력합니다.
e.
Sell 완성신호 발생했을 경우로 완성신호 이벤트 발생시 기술하는 내용입니다.
① Position에 -1값을 저장합니다.
※ 변수(Position)은 2가지 용도로 사용하기 위해 만든 변수입니다. 첫번째는 스팟전략 실행 후 최초로 발생하는 진입주문부터 주문을 발생하기 위한 용도이며 두번째는 주문응답이벤트나 체결통보이벤트 발생 시 최근 주문의 상태를 확인하는 용도입니다. 전역변수로 선언하고 사용합니다.
② 현재가로 매도주문을 발생하고 주문식별번호는 SID변수에 저장합니다.
※ OrderCode를 주문종목으로 지정 ※ 주문수량으로 지정한 Signal.count는 차트시스템에서 설정된 수량입니다. ※ 저장된 주문식별번호는 주문응답 발생 시 현재 주문의 응답인지 확인하기 위해 사용됩니다.
③ 매도진입이라는 텍스트를 디버깅창과 [예스스팟모니터]에 출력합니다.
④ SellFill에 0을 할당합니다.
※ 변수(SellFill)은 Sell신호시 발생한 매도주문이 체결되면 1로 변경됩니다.
f.
ExitShort 완성신호 발생했을 경우로 완성신호 이벤트 발생시 기술하는 내용입니다.
if (Position== -1 and Signal.signalKind == 4) 조건은 완성신호의 종류가 ExitLong이고 Position에 1이 이미 저장된 상태라는 내용입니다. 스팟전략 적용하고 Buy나 Sell신호가 발생해서 Position가 1값을 가진 이후에 발생하게 한 내용입니다.
ExitShort신호가 발생할 때는 진입주문이 미체결된 경우와 체결된 경우로 나누어 조건문을 만듭니다.
①. SellFill은 매도진입주문 시에 0으로 셋팅되고 체결통보를 받으면 1로 변경이 됩니다. 그러므로 SellFill이 1이라는 의미는 매도진입주문이 체결된 상태를 나타냅니다.
②. 매도진입주문이 체결된 상태이므로 매도청산을 위해 매수주문을 실행합니다.
※ OrderCode를 주문종목으로 지정 ※ 주문수량으로 지정한 Signal.count는 차트시스템에서 설정된 수량입니다. ※ 매도2호가로 지정가 매수주문합니다.
③. 매도청산실행이라는 텍스트를 디버깅창과 [예스스팟모니터]에 출력합니다.
④. SellFill이 0이라는 의미는 매도진입주문이 미체결된 상태를 나타냅니다.
⑤. 매도진입주문이 체결되지 않았으므로 매도청산을 위한 매도주문은 생략하고 미체결된 매도진입주문에 대해 취소주문을 실행합니다.
※ 주문번호는 주문응답 이벤트 발생 대 저장한 Snum입니다.
⑥. 매도청산취소라는 텍스트를 디버깅창과 [예스스팟모니터]에 출력합니다.
g.
주문응답 이벤트 발생
Main객체의 OnOrderResponse 이벤트는 주문응답이 발생하면 호출되는 이벤트입니다. OnOrderResponse 이벤트는 스팟전략에서 발생된 주문에 대한 응답이 발생했을 때만 호출됩니다. 다른 주문화면에서 발생된 주문에 대한 응답에 대해서는 호출되지 않습니다. 발생한 주문응답에 대한 정보는 주문응답객체(OrderResponse)로 확인합니다.
① 최근 buy신호가 발생했고 주문응답의 주문식별번호가 매수진입주문 시 저장한 주문식별번호와 같으면 ② 주문번호를 Bnum변수에 저장합니다.
③ 최근 Sell신호가 발생했고 주문응답의 주문식별번호가 매도진입주문 시 저장한 주문식별번호와 같으면 ④ 주문번호를 Snum변수에 저장합니다.
※ 완성신호 이벤트 안에 Buy신호 발생하면 Position은 1이고 Sell신호 발생하면 Position은 -1을 가지도록 작성되어 있습니다.
h.
H. 체결통보 이벤트 발생
Main객체의 OnNotifyFill이벤트는 체결통보가 발생하면 호출되는 이벤트입니다. OnNotifyFill이벤트는 전체 주문화면에서 발생한 모든 주문에 대한 체결통보에 대해 호출됩니다. 발생한 체결통보에 대한 정보는 체결통보객체(NotifyFill)로 확인합니다. 주문응답객체가 제공하는 정보는 아래와 같습니다.
① 최근 buy신호가 발생했고 주문번호가 주문응답이벤트 발생할 때 저장한 주문번호와 같으면 ② BuyFill에 1을 저장합니다. ③ 최근 Sell신호가 발생했고 주문번호가 주문응답이벤트 발생할 때 저장한 주문번호와 같으면 ④ SellFill에 1을 저장합니다.
4.
스팟수식
var Position; var OrdeCode; var BID; var SID; var Snum; var Bnum; var BuyFill; var SellFill; function Main_OnStart() { Main.MessageLog("시작"); Position = 0; OrdeCode = Main.GetOrderCode(F1.code); } function C1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); if (Signal.signalKind == 1 ) { Position = 1; BID = A1.OrderBuy(OrdeCode, Signal.count,F1.current, 0); Main.MessageLog("매수진입"); BuyFill = 0; } if (Position == 1 && Signal.signalKind == 2 ) { if (BuyFill == 1) { A1.OrderSell(OrdeCode, Vol,F1.Bid(2), 0); Main.MessageLog("매수청산실행"); } if (BuyFill == 0) { A1.OrderCancel(BNum); Main.MessageLog("매수청산취소"); } } if (Signal.signalKind == 3 ) { Position = -1; SellFill = 0; SID = A1.OrderSell(OrdeCode, Signal.count,F1.current, 0); Main.MessageLog("매도진입"); } if (Position == -1 && Signal.signalKind == 4 ) { if (SellFill == 1) { A1.OrderBuy(OrdeCode, Vol,F1.Ask(2), 0); Main.MessageLog("매도청산"); } if (SellFill == 0) { A1.OrderCancel(SNum); Main.MessageLog("매도청산취소"); } } } function Main_OnOrderResponse(OrderResponse) { if (Position == 1 && OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; } if (Position == -1 && OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; } } function Main_OnNotifyFill(NotifyFill) { if (Position == 1 && NotifyFill.orderNum == BNum) { BuyFill = 1; } if (Position == -1 && NotifyFill.orderNum == SNum) { SellFill = 1; } }
JavaScript
복사