커뮤니티

옵션매매 추가문의

프로필 이미지
착한이
2014-01-07 18:01:35
1023
글번호 222764
답변완료
수고하십니다. 아래 791번에 질문올렸는데요. 답변감사드리며 2가지 질문 더 드립니다. 1. 답변주신 내용에 1,2번 Timer설정시 if (BT == 1 && Replace1 == 0)이라는 조건문이 왜 들어가는지 궁금합니다. 3, 4번 Timer는 그런 조건문을 안 넣으셨는데요. 2. 아래식에서 현재는 선물청산신호시 모든 옵션도 같이 청산되도록 되어 있는데요. 선물에 손절청산신호(예를 들어 신호명이 LS_Long, LS_Short)가 나오면 옵션은 이후 Trailing Stop으로(옵션은 수익이므로) 수익청산 되도록 로직을 수정시키고 싶습니다. 만약 선물에 Trailing Stop으로 익절신호(예를 들어 신호명이 TS_Long, TS_Short)가 나오면 기존처럼 모든 옵션이 동시에 청산되어야 합니다. 간단히 말씀드리자면 선물손절시 옵션은 T/Stop으로, 선물익절이면 옵션동시청산입니다. 또한 옵션 T/Stop을 YT처럼 ATR T/Stop으로 만들수 있나요? 그게 안되면 최대수익대비하락폭 으로 수정부탁드립니다. 감사합니다. -------------------------------------- 안녕하세요 예스스탁입니다. 아래식 참고하시기 바랍니다. var Start; var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; var BT; var ST; var BuySignalCode; var SellSignalCode; var BuySignalID; var SellSignalID; var BuySignalNum; var SellSignalNum; var Replace1; var Replace2; function Main_OnStart() { Start = 0; } function Chart1_OnRiseSignal(Signal) { UNum = Option.uppersATM; LNum = Option.lowersATM; CallCode = new Array(UNum+LNum+1); PutCode = new Array(UNum+LNum+1); CallPrice = new Array(UNum+LNum+1); PutPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) < 3.0 ) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)); CallCode[i+LNum] = Option.GetATMCallRecent(i); } else { CallPrice[i+LNum] = -1; CallCode[i+LNum] = -1; } } CC = -1; CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum] } } for (var ii = -UNum; ii <= LNum; ii++) { if (Option.GetCurrent(1, ii) < 3.0) { PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)); PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } else { PutPrice[ii+UNum] = -1; PutCode[ii+UNum] = -1; } } PP = -1; PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } if (Signal.signalKind == 1) { Start = 1; if (CC >= PP && CC > -1 && PP > -1) { BT = 1; Replace1 = 0; BuySignalCode = CallOrderCode; BuySignalID = Account1.OrderSell(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0); } else{ BT = -1; Replace1 = 0; BuySignalCode = PutOrderCode; BuySignalID = Account1.OrderBuy(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0); } } if (Start == 1 && Signal.signalKind == 2) { if (BT == 1) { Account1.OrderBuy(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0); } if (BT == -1) { Account1.OrderSell(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0); } } if (Signal.signalKind == 3) { Start = 1; if (CC >= PP && CC > -1 && PP > -1) { ST = 1; Replace2 = 0; SellSignalCode = CallOrderCode; SellSignalID = Account1.OrderBuy(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0); } else{ ST = -1; Replace2 = 0; SellSignalCode = PutOrderCode; SellSignalID = Account1.OrderSell(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0); } } if (Start == 1 && Signal.signalKind == 4) { if (ST == 1) { Account1.OrderSell(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0); } if (ST == -1) { Account1.OrderBuy(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0); } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuySignalID) { BuySignalNum = OrderResponse.orderNum; if (BT == 1 && Replace1 == 0) { Main.SetTimer(1, 1000); Main.SetTimer(2, 3000); } } if (OrderResponse.orderID == SellSignalID) { SellSignalNum = OrderResponse.orderNum; Main.SetTimer(3, 1000); Main.SetTimer(4, 3000); } } function Main_OnTimer(nEventID) { if (nEventID == 1 && Replace1 == 0) { Replace1 = 1; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && BT == 1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,1)); } if (Account1.Unfill.count > 0 && BT == -1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,1)); } } if (nEventID == 2 && Replace1 == 1 ) { Replace1 = 2; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && BT == 1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,3)); } if (Account1.Unfill.count > 0 && BT == -1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,3)); } } if (nEventID == 3 && Replace2 == 0) { Replace2 = 1; Account1.SetUnfillOrderNumber(SellSignalNum); if (Account1.Unfill.count > 0 && ST == 1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,1)); } if (Account1.Unfill.count > 0 && ST == -1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,1)); } } if (nEventID == 4 && Replace2 == 1 ) { Replace2 = 2; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && ST == 1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,3)); } if (Account1.Unfill.count > 0 && ST == -1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,3)); } } } 즐거운 하루되세요 > 착한이 님이 쓴 글입니다. > 제목 : 옵션매수문의 > 수고하십니다. 아래의 내용에 맞게 YesSpot 수식 작성부탁드립니다. 또한 2번 같은 경우 본문의 라인이 길어질 수 있어 사용자함수로 만들어서 사용코자 하는데 가능할지요. 1. 예스트레이더의 선물 진입시 헷지를 위하여 옵션 매수 2. 3.0 이하의 콜옵션과 풋옵션중에 3.0 에 가장 근접하는 콜/풋 종목을 찾고 3. 선물매수신호 -> 그 종목이 콜이면 콜매도, 풋이면 풋매수, 선물매수청산신호 -> 옵션청산 4. 선물매도신호 -> 그 종목이 콜이면 콜매수, 풋이면 풋매도, 선물매도청산신호 -> 옵션청산 5. 옵션매수는 매수1호가에 지정가주문, 미체결시 1초후 매도1호가주문, 미체결시 3초후 매도3호가 주문 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-01-15 18:16:48

안녕하세요 예스스탁입니다. 1. 해당 내용 문의하신 내용 중 5번 내용 처리인데 일부 누락이 되었습니다. 5. 옵션매수는 매수1호가에 지정가주문, 미체결시 1초후 매도1호가주문, 미체결시 3초후 매도3호가 주문 아래식에 수정했습니다. ATR은 봉의 과거값이 모두 필요하고 작성이 어려워 옵션매수는 진입이후 최고가 대비-5% 옵션매도는 진입이후 최저가 대비+5%로 작성했습니다. 아래식 참고하시기 바랍니다. 예스스팟 식은 가이드라인이므로 충분히 테스트하시고 수정보완해 사용하셔야 합니다. 2. var Start; var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; var BuySignalCode; var SellSignalCode; var BuySignalID; var SellSignalID; var BuySignalNum; var SellSignalNum; var Replace1; var Replace2; var EntrySinceHigh; var EntrySinceLow; function Main_OnStart() { Start = 0; } function Chart1_OnRiseSignal(Signal) { UNum = Option.uppersATM; LNum = Option.lowersATM; CallCode = new Array(UNum+LNum+1); PutCode = new Array(UNum+LNum+1); CallPrice = new Array(UNum+LNum+1); PutPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) < 3.0 ) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)); CallCode[i+LNum] = Option.GetATMCallRecent(i); } else { CallPrice[i+LNum] = -1; CallCode[i+LNum] = -1; } } CC = -1; CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum] } } for (var ii = -UNum; ii <= LNum; ii++) { if (Option.GetCurrent(1, ii) < 3.0) { PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)); PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } else { PutPrice[ii+UNum] = -1; PutCode[ii+UNum] = -1; } } PP = -1; PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } if (Start == 0 && Signal.signalKind == 1) { if (CC >= PP && CC > -1 && PP > -1) { Start = 2;//매수신호 발생 콜매도 2 BX = 0; Replace1 = 0; BuySignalCode = CallOrderCode; BuySignalID = Account1.OrderSell(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0); Main.SetTimer(10,500); EntrySinceHigh = 0; EntrySinceLow = 99999999; } else{ Start = 1; //매수신호 발생 풋 매수 1 BX = 0; Replace1 = 0; BuySignalCode = PutOrderCode; BuySignalID = Account1.OrderBuy(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0); Account1.SetBalanceItem(BuySignalCode,0); Main.SetTimer(10,500); EntrySinceHigh = 0; EntrySinceLow = 99999999; } } // 매수신호 후 LS_Long 청산이 나오면 BX는 0 --> 1 if (Start >= 1 && Signal.signalKind == 2 && Signal.name == "LS_Long") { BX = 1; } // 매수신호 후 TS_Long 청산이 나오면 청산실행 if (Start >= 1 && Signal.signalKind == 2 && Signal.name == "TS_Long") { if (Start == 2) { Account1.OrderBuy(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0); Start = 0; } if (Start == 1) { Account1.OrderSell(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0); Start = 0; } } if (Start == 0 && Signal.signalKind == 3) { if (CC >= PP && CC > -1 && PP > -1) { Start = -1; //매도신호발생 콜매수 -1 SX = 0; Replace2 = 0; SellSignalCode = CallOrderCode; SellSignalID = Account1.OrderBuy(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0); Account1.SetBalanceItem(SellSignalCode,0); Main.SetTimer(10,500); EntrySinceHigh = 0; EntrySinceLow = 99999999; } else{ Start = -2; //매도신호발생 풋매도 -2 SX = 0; Replace2 = 0; SellSignalCode = PutOrderCode; SellSignalID = Account1.OrderSell(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0); Account1.SetBalanceItem(SellSignalCode,0); Main.SetTimer(10,500); EntrySinceHigh = 0; EntrySinceLow = 99999999; } } //매도신호 후 LS_Short청산 발생하면 SX는 0 --> 1 if (Start <= -1 && Signal.signalKind == 4 && Signal.name == "LS_Short") { SX = 1; } //매도신호 후 TS_Short청산 발생하면 청산실행 if (Start <= -1 && Signal.signalKind == 4 && Signal.name == "TS_Short") { if (Start == -1) { Account1.OrderSell(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0); Start = 0; } if (Start == -2) { Account1.OrderBuy(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0); Start = 0; } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuySignalID) { BuySignalNum = OrderResponse.orderNum; if (Start == 1 && Replace1 == 0) { Main.SetTimer(1, 1000); Main.SetTimer(2, 3000); } } if (OrderResponse.orderID == SellSignalID) { SellSignalNum = OrderResponse.orderNum; if (Start == -1 && Replace1 == 0) { Main.SetTimer(3, 1000); Main.SetTimer(4, 3000); } } } function Main_OnTimer(nEventID) { if (nEventID == 1 && Replace1 == 0) { Replace1 = 1; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && Start == 2) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,1)); Main.KillTimer(1); } if (Account1.Unfill.count > 0 && Start == 1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,1)); Main.KillTimer(1); } } if (nEventID == 2 && Replace1 == 1 ) { Replace1 = 2; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && Start == 2) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,3)); Main.KillTimer(2); } if (Account1.Unfill.count > 0 && Start == 1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,3)); Main.KillTimer(2); } } if (nEventID == 3 && Replace2 == 0) { Replace2 = 1; Account1.SetUnfillOrderNumber(SellSignalNum); if (Account1.Unfill.count > 0 && Start == -1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,1)); Main.KillTimer(3); } if (Account1.Unfill.count > 0 && Start == -2) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,1)); Main.KillTimer(3); } } if (nEventID == 4 && Replace2 == 1 ) { Replace2 = 2; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && Start == -1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,3)); Main.KillTimer(4); } if (Account1.Unfill.count > 0 && Start == -2) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,3)); Main.KillTimer(4); } } //진입신호 후 0.5초 간격으로 잔고를 셋팅해 진입이후 최고가와 최저가 계산 if (nEventID == 10) { if (Start >= 1) //매수신호 발생 이후 { Account1.SetBalanceItem(BuySignalCode) if (Account1.Balance.count > 0 ) { if (Account1.Balance.current > EntrySinceHigh) { EntrySinceHigh = Account1.Balance.current; } if (Account1.Balance.current < EntrySinceLow) { EntrySinceLow = Account1.Balance.current; } //풋매수이면 현재가가 진입이후 최고가 대비 5% 하락시 청산 if (Start == 1 && Account1.Balance.current >= EntrySinceHigh*0.95 && EntrySinceHigh > 0 ) { Account1.OrderSell(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0); Start = 0; Main.KillTimer(10); } //콜매도이면 현재가가 진입이후 최저가 대비 5% 상승시 청산 if (Start == 2 && Account1.Balance.current >= EntrySinceLow*1.05 && EntrySinceLow < 99999999) { Account1.OrderBuy(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0); Start = 0; Main.KillTimer(10); } } } if (Start == -1) //매도신호 발생 이후 { Account1.SetBalanceItem(SellSignalCode) if (Account1.Balance.count > 0) { if (Account1.Balance.current > EntrySinceHigh) { EntrySinceHigh = Account1.Balance.current; } if (Account1.Balance.current < EntrySinceLow) { EntrySinceLow = Account1.Balance.current; } //콜매수이면 현재가가 진입이후 최고가 대비 5% 하락시 청산 if (Start == -1 && Bx == 1 && Account1.Balance.current <= EntrySinceHigh*0.95 && EntrySinceHigh > 0) { Account1.OrderSell(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0); Start = 0; Main.KillTimer(10); } //풋매도이면 현재가가 진입이후 최저가 대비 5% 상승시 청산 if (Start == -2 && Sx == 1 && Account1.Balance.current >= EntrySinceLow*1.05 && EntrySinceLow < 99999999) { Account1.OrderBuy(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0); Start = 0; Main.KillTimer(10); } } } } } 즐거운 하루되세요 > 착한이 님이 쓴 글입니다. > 제목 : 옵션매매 추가문의 > 수고하십니다. 아래 791번에 질문올렸는데요. 답변감사드리며 2가지 질문 더 드립니다. 1. 답변주신 내용에 1,2번 Timer설정시 if (BT == 1 && Replace1 == 0)이라는 조건문이 왜 들어가는지 궁금합니다. 3, 4번 Timer는 그런 조건문을 안 넣으셨는데요. 2. 아래식에서 현재는 선물청산신호시 모든 옵션도 같이 청산되도록 되어 있는데요. 선물에 손절청산신호(예를 들어 신호명이 LS_Long, LS_Short)가 나오면 옵션은 이후 Trailing Stop으로(옵션은 수익이므로) 수익청산 되도록 로직을 수정시키고 싶습니다. 만약 선물에 Trailing Stop으로 익절신호(예를 들어 신호명이 TS_Long, TS_Short)가 나오면 기존처럼 모든 옵션이 동시에 청산되어야 합니다. 간단히 말씀드리자면 선물손절시 옵션은 T/Stop으로, 선물익절이면 옵션동시청산입니다. 또한 옵션 T/Stop을 YT처럼 ATR T/Stop으로 만들수 있나요? 그게 안되면 최대수익대비하락폭 으로 수정부탁드립니다. 감사합니다. -------------------------------------- 안녕하세요 예스스탁입니다. 아래식 참고하시기 바랍니다. var Start; var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; var BT; var ST; var BuySignalCode; var SellSignalCode; var BuySignalID; var SellSignalID; var BuySignalNum; var SellSignalNum; var Replace1; var Replace2; function Main_OnStart() { Start = 0; } function Chart1_OnRiseSignal(Signal) { UNum = Option.uppersATM; LNum = Option.lowersATM; CallCode = new Array(UNum+LNum+1); PutCode = new Array(UNum+LNum+1); CallPrice = new Array(UNum+LNum+1); PutPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) < 3.0 ) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)); CallCode[i+LNum] = Option.GetATMCallRecent(i); } else { CallPrice[i+LNum] = -1; CallCode[i+LNum] = -1; } } CC = -1; CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum] } } for (var ii = -UNum; ii <= LNum; ii++) { if (Option.GetCurrent(1, ii) < 3.0) { PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)); PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } else { PutPrice[ii+UNum] = -1; PutCode[ii+UNum] = -1; } } PP = -1; PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } if (Signal.signalKind == 1) { Start = 1; if (CC >= PP && CC > -1 && PP > -1) { BT = 1; Replace1 = 0; BuySignalCode = CallOrderCode; BuySignalID = Account1.OrderSell(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0); } else{ BT = -1; Replace1 = 0; BuySignalCode = PutOrderCode; BuySignalID = Account1.OrderBuy(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0); } } if (Start == 1 && Signal.signalKind == 2) { if (BT == 1) { Account1.OrderBuy(BuySignalCode, 1, Option.GetAskByCode(BuySignalCode, 1), 0); } if (BT == -1) { Account1.OrderSell(BuySignalCode, 1, Option.GetBidByCode(BuySignalCode, 1), 0); } } if (Signal.signalKind == 3) { Start = 1; if (CC >= PP && CC > -1 && PP > -1) { ST = 1; Replace2 = 0; SellSignalCode = CallOrderCode; SellSignalID = Account1.OrderBuy(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0); } else{ ST = -1; Replace2 = 0; SellSignalCode = PutOrderCode; SellSignalID = Account1.OrderSell(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0); } } if (Start == 1 && Signal.signalKind == 4) { if (ST == 1) { Account1.OrderSell(SellSignalCode, 1, Option.GetBidByCode(SellSignalCode, 1), 0); } if (ST == -1) { Account1.OrderBuy(SellSignalCode, 1, Option.GetAskByCode(SellSignalCode, 1), 0); } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuySignalID) { BuySignalNum = OrderResponse.orderNum; if (BT == 1 && Replace1 == 0) { Main.SetTimer(1, 1000); Main.SetTimer(2, 3000); } } if (OrderResponse.orderID == SellSignalID) { SellSignalNum = OrderResponse.orderNum; Main.SetTimer(3, 1000); Main.SetTimer(4, 3000); } } function Main_OnTimer(nEventID) { if (nEventID == 1 && Replace1 == 0) { Replace1 = 1; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && BT == 1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,1)); } if (Account1.Unfill.count > 0 && BT == -1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,1)); } } if (nEventID == 2 && Replace1 == 1 ) { Replace1 = 2; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && BT == 1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetBidByCode(BuySignalCode,3)); } if (Account1.Unfill.count > 0 && BT == -1) { BuySignalID = Account1.OrderReplacePrice(BuySignalNum, Option.GetAskByCode(BuySignalCode,3)); } } if (nEventID == 3 && Replace2 == 0) { Replace2 = 1; Account1.SetUnfillOrderNumber(SellSignalNum); if (Account1.Unfill.count > 0 && ST == 1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,1)); } if (Account1.Unfill.count > 0 && ST == -1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,1)); } } if (nEventID == 4 && Replace2 == 1 ) { Replace2 = 2; Account1.SetUnfillOrderNumber(BuySignalNum); if (Account1.Unfill.count > 0 && ST == 1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetAskByCode(SellSignalNum,3)); } if (Account1.Unfill.count > 0 && ST == -1) { SellSignalID = Account1.OrderReplacePrice(SellSignalNum, Option.GetBidByCode(SellSignalNum,3)); } } } 즐거운 하루되세요 > 착한이 님이 쓴 글입니다. > 제목 : 옵션매수문의 > 수고하십니다. 아래의 내용에 맞게 YesSpot 수식 작성부탁드립니다. 또한 2번 같은 경우 본문의 라인이 길어질 수 있어 사용자함수로 만들어서 사용코자 하는데 가능할지요. 1. 예스트레이더의 선물 진입시 헷지를 위하여 옵션 매수 2. 3.0 이하의 콜옵션과 풋옵션중에 3.0 에 가장 근접하는 콜/풋 종목을 찾고 3. 선물매수신호 -> 그 종목이 콜이면 콜매도, 풋이면 풋매수, 선물매수청산신호 -> 옵션청산 4. 선물매도신호 -> 그 종목이 콜이면 콜매수, 풋이면 풋매도, 선물매도청산신호 -> 옵션청산 5. 옵션매수는 매수1호가에 지정가주문, 미체결시 1초후 매도1호가주문, 미체결시 3초후 매도3호가 주문 감사합니다.