Search
📝

예제5. 합성선물

예스스팟으로 합성선물전략을 구현해 보도록 하겠습니다. 기존 예스랭귀지로 구현되는 전략들 중에 선물의 움직임 참조하여 콜옵션과 풋옵션을 동시에 거래하는 전략들이 많이 있습니다. 예스랭귀지로 이를 구현할 때 어려움 중 하나는 차트에서는 주종목(data1)에 대해서만 주문이 가능하므로 하나의 차트에서는 복수 종목에 대해 주문을 발생할 수 없다는 것입니다. 그러므로 콜옵션이 주종목인 차트와 풋옵션이 주종목인 차트를 각각 만들어 각각 시스템을 적용해야 하는 어려움이 있습니다. 또한 원래 선물전략에서는 Atstop이나 Atlimit타입이나 혹은 강제청산 함수로 주문함수가 작성되어 있어 봉 미완성시에 신호가 발생하는데 선물이 참조데이터가 되어 참조데이터에서 조건을 판단해야 하므로 모두 봉 완성시로 판단하게 변경 작성될 수 밖에 없는 문제도 있습니다. 예스스팟을 이용하면 선물전략은 변경없이 그대로 차트에 적용하고 차트에서 신호만 받아와 콜옵션과 풋옵션에 동시에 주문을 집행하여 합성전략 구현을 할 수 있습니다.
1.
전략내용
선물차트에서 매수신호가 발생하면 콜매수+풋매도
선물차트에서 매수청산신호가 발생하면 매수신호시 주문종목 청산
선물차트에서 매도신호가 발생하면 콜매도+풋매수
선물차트에서 매도청산신호가 발생하면 매도신호시 주문종목 청산
2.
스크립트 객체화면 설정
a.
옵션객체
옵션 종목에 주문을 내므로 옵션정보를 알 수 있는 옵션객체가 필요합니다.
객체명은 Option, 상품은 코스피200지수옵션으로 지정합니다.
b.
계좌객체
주문을 발생해야 하므로 계좌객체를 추가한 후 계좌를 지정합니다. 객체명은 A1로 지정하고 주문 낼 계좌번호를 지정합니다.
c.
차트객체
차트에 적용된 시스템 신호정보를 알아야 하므로 차트객체가 필요합니다. 예제에서는 객체명을 C1으로 하고 차트아이디는 System으로 합니다.
선물시스템이 적용된 차트에 아이디를 System으로 지정합니다.
d.
외부변수
주문수량을 전략 실행시에 변경할 수 있게 외부변수를 추가합니다.
3.
전략작성전략
a.
스팟전략이 최초 실행될 때 [예스스팟 스튜디오]의 디버깅창에 시작이라는 텍스트를 출력합니다.
또한 스팟전략 실행 후에 차트에서 최초 신호가 청산신호 일 수 있습니다. 스팟전략 실행 후에 차트에서 발생하는 최초의 진입신호부터 주문을 하기 위한 처리가 필요하므로 전역변수(Start)를 만들어 우선 기초값을 0으로 셋팅합니다.
b.
차트 신호와 연계된 전략이므로 차트객체(C1)의 OnRiseSignal 이벤트를 사용합니다.
OnRiseSignal은 연결된 차트에서 완성신호가 발생했을 때 호출되는 이벤트이고 완성신호 정보는완성신호객체(Signal)가 제공합니다. 메시지로그 함수로 완성신호 이벤트가 발생하면 신호완성이라는 텍스트를 함께 신호종류를 디버깅창과 [예스스팟모니터]에 출력합니다. 완성신호의 종류(Signal.signalKind)는 1~4까지 정수로 리턴됩니다. Buy : 1,  Exitlong : 2, Sell : 3, Exitshort : 4
c.
완성신호 이벤트 발생할 때 신호종류만 확인하고 주문을 발생하면 되므로 이하는 모두완성신호 이벤트 안에 기술합니다.
Buy 완성신호가 발생했을 경우
if (Signal.signalKind == 1) 조건은 완성신호의 종류가 buy라는 내용입니다. ①. 변수(Start)에 1을 저장합니다.
※ 차트에서 최초로 진입신호가 발생한 후부터 주문을 집행하기 위한 용도입니다.
②. 변수(BuyCallCode)에 현재 시점의 ATM 등가격 콜옵션의 종목코드를 저장합니다
※ Buy신호시 저장된 콜옵션 종목코드는 현재 주문에서 주문종목코드로 이용하고 이후
Exitlong신호 발생할 때 콜옵션을 청산하기 위한 주문종목코드로 이용합니다.
저장된 값이 다음 Exitlong신호시에 사용되어야 하므로 해당 변수들은 전역변수로 선언합니다.
③. 변수(BuyPutCode)에 현재 시점의 ATM 등가격 풋옵션의 종목코드를 저장합니다.
※ Buy신호시 저장된 풋옵션 종목코드는 현재 주문에서 주문종목코드로 이용하고 이후
Exitlong신호 발생할 때 풋옵션을 청산하기 위한 주문종목코드로 이용합니다.
저장된 값이 다음 Exitlong신호시에도 사용되어야 하므로 해당 변수들은 전역변수로 선언합니다.
④. 변수(BuyCallPrice)에 현재 시점의 ATM 등가격 콜옵션의 매도2호가를 저장합니다.
※ 콜옵션 매수주문시 주문가격으로 이용하기 위한 용도입니다.
buy신호 발생할 때만 사용되므로 지역변수로 선언해서 사용합니다.
⑤. 변수(BuyPutPrice)에 현재 시점의 ATM 등가격 풋옵션의 매수2호가를 저장합니다.
※ 풋옵션 매도주문시 주문가격으로 이용하기 위한 용도입니다.
buy신호 발생할 때만 사용되므로 지역변수로 선언해서 사용합니다.
⑥. ATM 등가격 콜옵션을 매도2호가로 5계약 매수주문합니다.
※ 종목코드는 BuyCallCode, 수량은 외부변수, 지정가로 BuyCallPrice가 주문가격입니다.
⑦. ATM 등가격 풋옵션을 매수2호가로 5계약 매도주문합니다.
※ 종목코드는 BuyPutcode, 수량은 외부변수, 지정가로 BuyPutPrice가 주문가격입니다.
⑧. 메시지로그 함수를 이용해 합성선물매수라는 텍스트를 출력합니다.
Buy 완성신호가 발생했을 경우로 완성신호 이벤트 안에 기술하는 내용입니다.
ExitLong 완성신호가 발생 했을 경우
if (Start == 1 and Signal.signalKind == 2) 조건은 완성신호의 종류가 ExitLong이고 Start에 1이 이미 저장된 상태라는 내용입니다. 스팟전략 적용하고 Buy나 Sell신호가 발생해서 Start가 1값을 가진 이후에 발생하게 한 내용입니다.
①. 변수(BxCallPrice)에 Buy신호시 매수 주문한 콜옵션 종목의 매수2호가를 저장합니다.
②. 변수(BXPallPrice)에 Buy신호시 매도 주문한 풋옵션 종목의 매도2호가를 저장합니다.
③. ATM 등가격 콜옵션을 매수2호가로 5계약 매도주문합니다.
※ 종목코드는 BuyCallcode, 수량은 외부변수, 주문가격은 지정가로 BxCallPrice가 주문가격입니다.
④. ATM 등가격 풋옵션을 매도2호가로 5계약 매수주문합니다.
※ 종목코드는 BuyPutcode, 수량은 외부변수, 주문가격은 지정가로 BxPutprice가 주문가격입니다.
⑤. 메시지로그 함수를 이용해 합성선물매수청산이라는 텍스트를 출력합니다.
Sell 완성신호가 발생했을 경우
if (Signal.signalKind == 3) 조건은 완성신호의 종류가 Sell이라는 내용입니다.
①. 변수(Start)에 1을 저장합니다.
※ 차트에서 최초로 진입신호가 발생한 후부터 주문을 집행하기 위한 용도입니다.
②. 변수(SellCallCode)에 현재 시점의 ATM 등가격 콜옵션의 종목코드를 저장합니다
※ Sell신호시 저장된 콜옵션 종목코드는 현재 주문에서 주문종목코드로 이용하고 이후ExitShort신호 발생할 때 콜옵션을 청산하기 위한 주문종목코드로 이용합니다. 저장된 값이 다음 Exitlong신호시에 사용되어야 하므로 해당 변수들은 전역변수로 선언합니다.
③. 변수(SellPutCode)에 현재 시점의 ATM 등가격 풋옵션의 종목코드를 저장합니다.
※ Sell신호시 저장된 풋옵션 종목코드는 현재 주문에서 주문종목코드로 이용하고 이후ExitShort신호 발생할 때 풋옵션을 청산하기 위한 주문종목코드로 이용합니다. 저장된 값이 다음 Exitlong신호시에도 사용되어야 하므로 해당 변수들은 전역변수로 선언합니다.
④. 변수(SellCallPrice)에 현재 시점의 ATM 등가격 콜옵션의 매수2호가를 저장합니다.
※ 콜옵션 매도주문시 주문가격으로 이용하기 위한 용도입니다. Sell신호 발생할 때만 사용되므로 지역변수로 선언해서 사용합니다.
⑤. 변수(SellPutPrice)에 현재 시점의 ATM 등가격 풋옵션의 매도2호가를 저장합니다.
※ 풋옵션 매수주문시 주문가격으로 이용하기 위한 용도입니다. Sell신호 발생할 때만 사용되므로 지역변수로 선언해서 사용합니다.
⑥. ATM 등가격 콜옵션을 매수2호가로 5계약 매도주문합니다.
※ 종목코드는 SellCallCode, 수량은 외부변수, 지정가로 SellCallPrice가 주문가격입니다.
⑦. ATM 등가격 풋옵션을 매도2호가로 5계약 매수주문합니다.
※ 종목코드는 SellPutCode, 수량은 외부변수, 지정가로 SellCallPrice가 주문가격입니다.
⑧. 메시지로그 함수를 이용해 합성선물매도라는 텍스트를 출력합니다.
ExitShort 완성신호가 발생 했을 경우
f (Start == 1 and Signal.signalKind == 4) 조건은 완성신호의 종류가 Exitshort이고 Start에 1이 이미 저장된 상태라는 내용입니다. 스팟전략 적용하고 Buy나 Sell신호가 발생해서 Start가 1값을 가진 이후에 발생하게 한 내용입니다.
①. 변수(SxCallPrice)에 Sell신호시 매도 주문한 콜옵션 종목의 매도2호가를 저장합니다.
②. 변수(SXPutPrice)에 Sell신호시 매수 주문한 풋옵션 종목의 매수2호가를 저장합니다.
③. ATM 등가격 콜옵션을 매도2호가로 5계약 매수주문합니다.
※ 종목코드는 SellCallCode, 수량은 외부변수, 주문가격은 지정가로 SxCallPrice가 주문가격입니다.
④. ATM 등가격 풋옵션을 매수2호가로 5계약 매도주문합니다.
※ 종목코드는 SellPutCode, 수량은 외부변수, 주문가격은 지정가로 SxPutPrice가 주문가격입니다.
⑤. 메시지로그 함수를 이용해 합성선물매도청산이라는 텍스트를 출력합니다.
4.
스팟수식
var Start; var BuyCallCode; var BuyPutCode; var SellCallCode; var SellPutCode; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; } function C1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); if (Signal.signalKind == 1 ) { Start = 1; BuyCallCode = Option.GetATMCallRecent(0); BuyPutCode = Option.GetATMPutRecent(0); var BuyCallPrice = Option.GetAskByCode(BuyCallCode,2); var BuyPutPrice = Option.GetBidByCode(BuyPutCode,2); A1.OrderBuy(BuyCallCode, Vol, BuyCallPrice, 0); A1.OrderSell(BuyPutCode, Vol, BuyPutPrice, 0); Main.MessageLog("합성선물매수"); } if (Start == 1 && Signal.signalKind == 2 ) { var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2); var BxPutPrice = Option.GetAskByCode(BuyPutCode, 2); A1.OrderSell(BuyCallCode, Vol, BxCallPrice, 0); A1.OrderBuy(BuyPutCode, Vol, BxPutPrice, 0); Main.MessageLog("합성선물매수청산"); } if (Signal.signalKind == 3 ) { Start = 1; SellCallCode = Option.GetATMCallRecent(0); SellPutCode = Option.GetATMPutRecent(0); var SellCallPrice = Option.GetBidByCode(SellCallCode,2); var SellPutPrice = Option.GetAskByCode(SellPutCode,2); A1.OrderSell(SellCallCode, Vol, SellCallPrice , 0); A1.OrderBuy(SellPutCode, Vol, SellPutPrice, 0); Main.MessageLog("합성선물매도"); } if (Start == 1 && Signal.signalKind == 4 ) { var SxCallPrice = Option.GetAskByCode(SellCallCode, 2); var SxPutPrice = Option.GetBidByCode(SellPutCode, 2); A1.OrderBuy(SellCallCode, Vol, SxCallPrice, 0); A1.OrderSell(SellPutCode, Vol, SxPutPrice, 0); Main.MessageLog("합성선물매도청산"); } }
JavaScript
복사