커뮤니티

스팟전략문의

프로필 이미지
착한이
2014-08-19 15:56:35
1079
글번호 223133
답변완료
수고많으십니다. 예스트레이더 선물 신호를 이용하여 옵션매수전략을 개발하고 있는데요. 신규로 예스랭귀지에 Piramiding 전략을 추가하였고, 개념은 아래와 같습니다. 선물매수신호 -> 콜매수 선물매수신호 -> 콜매수 -> 선물매수청산신호 -> 콜매수청산 선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 -> 선물피라미딩매수분청산신호 -> 콜매수청산 선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 -> 선물매수청산신호 -> 콜매수청산 선물매도신호 -> 풋매수 선물매도신호 -> 풋매수 -> 선물매도청산신호 -> 풋매수청산 선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 -> 선물피라미딩매도분청산신호 -> 풋매수청산 선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 -> 선물매도청산신호 -> 풋매수청산 아래의 스팟수식을 위와같은 Piramiding 신호에 대응할 수 있도록 수정부탁드립니다. //선물매수신호시 콜매수 신호 발생시키기 if (Signal.signalKind == 1) { BuySignalCode = CallOrderCode; CallOrderPrice = Option.GetCurrentByCode(BuySignalCode); BuyID = Account1.OrderBuy(BuySignalCode, Signal.count, Option.GetAskByCode(BuySignalCode, 5), 0); Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",CallOrderPrice); BuyFill = 0; } //선물매수신호후 청산신호가 나오면 청산실행 if (Signal.signalKind == 2) { CallOrderPrice = Option.GetCurrentByCode(BuySignalCode); if (BuyFill == 1) { Account1.OrderSell(BuySignalCode, Signal.count, Option.GetBidByCode(BuySignalCode, 5), 0) Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",CallOrderPrice); } else { Account1.OrderCancel(BuyNum); Main.MessageLog("매수주문취소"); } } //선물매도신호시 풋매수 신호 발생시키기 if (Signal.signalKind == 3) { BuySignalCode = PutOrderCode; PutOrderPrice = Option.GetCurrentByCode(BuySignalCode); Account1.OrderBuy(BuySignalCode, Signal.count, Option.GetAskByCode(BuySignalCode, 5), 0); Main.MessageList("풋종목코드 : ",BuySignalCode," 풋현재가 : ",PutOrderPrice); BuyFill = 0; } //선물매도신호후 청산신호가 나오면 청산실행 if (Signal.signalKind == 4) { PutOrderPrice = Option.GetCurrentByCode(BuySignalCode); if (BuyFill == 1) { Account1.OrderSell(BuySignalCode, Signal.count, Option.GetBidByCode(BuySignalCode, 5), 0); Main.MessageList("풋종목코드 : ",BuySignalCode," 풋현재가 : ",PutOrderPrice); } else { Account1.OrderCancel(BuyNum); Main.MessageLog("매수주문취소"); } } //주문응답 이벤트 function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID) { BuyNum = OrderResponse.orderNum; } } //체결통보 이벤트 function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.orderNum == BuyNum) { BuyFill = 1; } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-08-27 10:27:54

안녕하세요 예스스탁입니다. 문의하신 부분은 피라미딩시에 포지션의 첫진입신호와 같은 종목으로 진입을 해야 하므로 수식에 해당 부분에 대한 내용만 추가하시면 됩니다. 청산시에는 진입신호발생시 주문분에 대해 미체결이 있으면 모두 취소하고 체결분만 청산하도록 했습니다. 주석 참고하셔서 수정보완해 사용하시기 바랍니다. 스크립트 객체설정 옵션객체 추가 계좌객체 추가 : Account1 차트객체 추가 : Chart1 종목객체 추가 : MarketData1,차트와 같은 종목으로 설정 영문업데이트가 게시판 금칙어이므로 중간에 *이 삽입되어 있습니다. 삭제하시기 바랍니다. 진입종목은 확실치 않아 ATM콜/풋으로 지정되어 있습니다. 원하시는 종목으로 변경하시기 바랍니다. var pre = 0; var pst = 0; var BuySignalCode; var SellSignalCode; function Main_OnStart() { Start = 0; } //포지션 변화인식 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { if (sItemCode == MarketData1.code) { pre = pst; pst = Chart1.GetOpenContracts(); } } function Chart1_OnRiseSignal(Signal) { //선물매수신호시 콜매수 신호 발생시키기 if (Signal.signalKind == 1) { Start = 1; //매수 첫진입신호에서만 종목코드 저장 if (Pst > 0 && pre <= 0) { BuySignalCode = Option.GetATMCallRecent(0, 0); } BuyID = Account1.OrderBuy(BuySignalCode, Signal.count, Option.GetAskByCode(BuySignalCode, 5), 0); Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",Option.GetCurrentByCode(BuySignalCode)); } //선물매수신호후 청산신호가 나오면 청산실행 if (Signal.signalKind == 2 && Start == 1) { //BuySignalCode의 매수주문 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.count > 0 && Account1.Unfill.code == BuySignalCode && Account1.Unfill.orderKind == 2 ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //BuySignalCode 종목 잔고셋팅 Account1.SetBalanceItem(BuySignalCode, 0); //BuySignalCode 종목의 매수잔고가 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고수량과 신호수량 중 작은 수량으로 청산 Account1.OrderSell(BuySignalCode,Math.min(Account1.Balance.count, Signal.count), Option.GetBidByCode(BuySignalCode, 5), 0) Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",CallOrderPrice); } } //선물매도신호시 풋매수 신호 발생시키기 if (Signal.signalKind == 3) { Start = 1; //매도 첫진입신호에서만 종목코드 저장 if (Pst < 0 && pre <= 0) { SellSignalCode = Option.GetATMPutRecent(0, 0); } Account1.OrderBuy(SellSignalCode, Signal.count, Option.GetAskByCode(SellSignalCode, 5), 0); Main.MessageList("풋종목코드 : ",SellSignalCode," 풋현재가 : ",Option.GetCurrentByCode(SellSignalCode)); } //선물매도신호후 청산신호가 나오면 청산실행 if (Signal.signalKind == 4 && Start == 1) { //SellSignalCode의 매수주문 모두 취소 var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.count > 0 && Account1.Unfill.code == SellSignalCode && Account1.Unfill.orderKind == 2 ) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //SellSignalCode 종목 잔고셋팅 Account1.SetBalanceItem(SellSignalCode, 0); //SellSignalCode 종목의 매수잔고가 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(SellSignalCode, Math.min(Account1.Balance.count, Signal.count), Option.GetBidByCode(SellSignalCode, 5), 0); Main.MessageList("풋종목코드 : ",SellSignalCode," 풋현재가 : ",Option.GetCurrentByCode(SellSignalCode)); } } } 즐거운 하루되세요 > 착한이 님이 쓴 글입니다. > 제목 : 스팟전략문의 > 수고많으십니다. 예스트레이더 선물 신호를 이용하여 옵션매수전략을 개발하고 있는데요. 신규로 예스랭귀지에 Piramiding 전략을 추가하였고, 개념은 아래와 같습니다. 선물매수신호 -> 콜매수 선물매수신호 -> 콜매수 -> 선물매수청산신호 -> 콜매수청산 선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 -> 선물피라미딩매수분청산신호 -> 콜매수청산 선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 -> 선물매수청산신호 -> 콜매수청산 선물매도신호 -> 풋매수 선물매도신호 -> 풋매수 -> 선물매도청산신호 -> 풋매수청산 선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 -> 선물피라미딩매도분청산신호 -> 풋매수청산 선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 -> 선물매도청산신호 -> 풋매수청산 아래의 스팟수식을 위와같은 Piramiding 신호에 대응할 수 있도록 수정부탁드립니다. //선물매수신호시 콜매수 신호 발생시키기 if (Signal.signalKind == 1) { BuySignalCode = CallOrderCode; CallOrderPrice = Option.GetCurrentByCode(BuySignalCode); BuyID = Account1.OrderBuy(BuySignalCode, Signal.count, Option.GetAskByCode(BuySignalCode, 5), 0); Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",CallOrderPrice); BuyFill = 0; } //선물매수신호후 청산신호가 나오면 청산실행 if (Signal.signalKind == 2) { CallOrderPrice = Option.GetCurrentByCode(BuySignalCode); if (BuyFill == 1) { Account1.OrderSell(BuySignalCode, Signal.count, Option.GetBidByCode(BuySignalCode, 5), 0) Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",CallOrderPrice); } else { Account1.OrderCancel(BuyNum); Main.MessageLog("매수주문취소"); } } //선물매도신호시 풋매수 신호 발생시키기 if (Signal.signalKind == 3) { BuySignalCode = PutOrderCode; PutOrderPrice = Option.GetCurrentByCode(BuySignalCode); Account1.OrderBuy(BuySignalCode, Signal.count, Option.GetAskByCode(BuySignalCode, 5), 0); Main.MessageList("풋종목코드 : ",BuySignalCode," 풋현재가 : ",PutOrderPrice); BuyFill = 0; } //선물매도신호후 청산신호가 나오면 청산실행 if (Signal.signalKind == 4) { PutOrderPrice = Option.GetCurrentByCode(BuySignalCode); if (BuyFill == 1) { Account1.OrderSell(BuySignalCode, Signal.count, Option.GetBidByCode(BuySignalCode, 5), 0); Main.MessageList("풋종목코드 : ",BuySignalCode," 풋현재가 : ",PutOrderPrice); } else { Account1.OrderCancel(BuyNum); Main.MessageLog("매수주문취소"); } } //주문응답 이벤트 function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID) { BuyNum = OrderResponse.orderNum; } } //체결통보 이벤트 function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.orderNum == BuyNum) { BuyFill = 1; } }