커뮤니티

문의_pointless

프로필 이미지
좌오비우오비
2024-08-22 10:03:39
591
글번호 226084
답변완료
<p>&lt;p&gt;1. 검토사항 (아래 수식) 진입조건(등가격의 합과 차)을 만족했을 때 등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다.&amp;nbsp; 코딩내용이 맞는지 봐주셨으면 합니다. 2. 요청수식 검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다. 등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다. (판단은 등가격의 합과 차로, 액션은 외가격으로) 익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다. 포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다. **************************************************************************** var ID, num; var Entry, Code; var Xvol; var HasExited;&amp;nbsp;&amp;nbsp;// 청산 후 재진입을 방지하는 변수 function Main_OnStart() { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Main.MessageList("Start"); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Main.SetTimer(1, 5000);&amp;nbsp;&amp;nbsp;// 기존 타이머 설정 (5초 간격) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Main.SetTimer(2, 1000);&amp;nbsp;&amp;nbsp;// 15시 청산을 위한 타이머 설정 (1초 간격) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry = 0;&amp;nbsp;&amp;nbsp;// 초기 Entry 값 설정 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HasExited = false;&amp;nbsp;&amp;nbsp;// 초기 재진입 가능 상태 } function Main_OnTimer(nEventID) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var d = new Date(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (nEventID == 1) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!HasExited) {&amp;nbsp;&amp;nbsp;// 재진입 방지 조건 추가 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (HHMMSS &amp;gt;= 84500) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var CallPrice = Option1.GetCurrent(0, 0); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var PutPrice = Option1.GetCurrent(1, 0); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var absCall = Math.abs(CallPrice); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var absPut = Math.abs(PutPrice); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var sum = absCall + absPut; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var diff = Math.abs(absCall - absPut); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 진입 조건 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Entry == 0 &amp;amp;&amp;amp; sum &amp;lt;= 5.00 &amp;amp;&amp;amp; diff &amp;lt;= 2.50) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (absCall &amp;lt;= absPut) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry = CallPrice; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Code = Option1.GetATMCallRecent(0); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ID = Account1.OrderBuy(Code, 1, CallAsk, 0); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Xvol = 1; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry = PutPrice; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Code = Option1.GetATMPutRecent(0); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ID = Account1.OrderBuy(Code, 1, PutAsk, 0); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Xvol = 1; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 익절/손절 조건 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Entry &amp;gt; 0 &amp;amp;&amp;amp; Xvol &amp;gt; 0) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var currentPrice = Option1.GetCurrent(Code); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (currentPrice &amp;gt;= Entry + 0.50 || currentPrice &amp;lt;= Entry - 0.50) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;closePosition(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 청산 후 매수 재진입 방지 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HasExited = true;&amp;nbsp;&amp;nbsp;// 청산 후 재진입 방지 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Main.KillTimer(1);&amp;nbsp;&amp;nbsp;// 타이머 1 종료 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (nEventID == 2) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 15시 청산 조건 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (HHMMSS &amp;gt;= 151000 &amp;amp;&amp;amp; HHMMSS &amp;lt; 151500) { // 15시 15분에 청산 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;closePosition(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Main.KillTimer(2);&amp;nbsp;&amp;nbsp;// 타이머 2 종료 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} } function closePosition() { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 포지션 청산 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Xvol &amp;gt; 0) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Code) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry = 0;&amp;nbsp;&amp;nbsp;// Entry 값 초기화 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Code = null;&amp;nbsp;&amp;nbsp;// Code 초기화 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Xvol = 0;&amp;nbsp;&amp;nbsp;// 수량 초기화 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// HasExited = true;&amp;nbsp;&amp;nbsp;// 청산 후 재진입 방지&amp;nbsp; } function Main_OnOrderResponse(OrderResponse) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 주문 응답 처리 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (OrderResponse.orderID == ID) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num = OrderResponse.orderNum; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} }&lt;/p&gt;</p>
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2024-08-26 16:44:58

안녕하세요 예스스탁입니다. 1 예 맞습니다. 낮은 가격의 종목을 매수하게 작성되었습니다. 2 code변수에 저장되는 값만 Option1.GetATMCallRecent(1),Option1.GetATMPutRecent(1)로 변경하시면 됩니다. // 진입 조건 if (Entry == 0 && sum <= 5.00 && diff <= 2.50) { if (absCall <= absPut) { Entry = CallPrice; Code = Option1.GetATMCallRecent(1); ID = Account1.OrderBuy(Code, 1, CallAsk, 0); Xvol = 1; } else { Entry = PutPrice; Code = Option1.GetATMPutRecent(1); ID = Account1.OrderBuy(Code, 1, PutAsk, 0); Xvol = 1; } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 외가격 옵션 매수 > 1. 검토사항 (아래 수식) 진입조건(등가격의 합과 차)을 만족했을 때 등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다. 코딩내용이 맞는지 봐주셨으면 합니다. 2. 요청수식 검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다. 등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다. (판단은 등가격의 합과 차로, 액션은 외가격으로) 익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다. 포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다. **************************************************************************** var ID, num; var Entry, Code; var Xvol; var HasExited; // 청산 후 재진입을 방지하는 변수 function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격) Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격) Entry = 0; // 초기 Entry 값 설정 HasExited = false; // 초기 재진입 가능 상태 } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); if (nEventID == 1) { if (!HasExited) { // 재진입 방지 조건 추가 if (HHMMSS >= 84500) { var CallPrice = Option1.GetCurrent(0, 0); var PutPrice = Option1.GetCurrent(1, 0); var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5); var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5); var absCall = Math.abs(CallPrice); var absPut = Math.abs(PutPrice); var sum = absCall + absPut; var diff = Math.abs(absCall - absPut); // 진입 조건 if (Entry == 0 && sum <= 5.00 && diff <= 2.50) { if (absCall <= absPut) { Entry = CallPrice; Code = Option1.GetATMCallRecent(0); ID = Account1.OrderBuy(Code, 1, CallAsk, 0); Xvol = 1; } else { Entry = PutPrice; Code = Option1.GetATMPutRecent(0); ID = Account1.OrderBuy(Code, 1, PutAsk, 0); Xvol = 1; } } // 익절/손절 조건 if (Entry > 0 && Xvol > 0) { var currentPrice = Option1.GetCurrent(Code); if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) { closePosition(); // 청산 후 매수 재진입 방지 HasExited = true; // 청산 후 재진입 방지 Main.KillTimer(1); // 타이머 1 종료 } } } } } if (nEventID == 2) { // 15시 청산 조건 if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산 closePosition(); Main.KillTimer(2); // 타이머 2 종료 } } } function closePosition() { // 포지션 청산 if (Xvol > 0) { if (Code) { Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0); } } Entry = 0; // Entry 값 초기화 Code = null; // Code 초기화 Xvol = 0; // 수량 초기화 // HasExited = true; // 청산 후 재진입 방지 } function Main_OnOrderResponse(OrderResponse) { // 주문 응답 처리 if (OrderResponse.orderID == ID) { num = OrderResponse.orderNum; } }
프로필 이미지

좌오비우오비

2024-08-29 14:16:21

답변 고맙습니다. > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 외가격 옵션 매수 > 안녕하세요 예스스탁입니다. 1 예 맞습니다. 낮은 가격의 종목을 매수하게 작성되었습니다. 2 code변수에 저장되는 값만 Option1.GetATMCallRecent(1),Option1.GetATMPutRecent(1)로 변경하시면 됩니다. // 진입 조건 if (Entry == 0 && sum <= 5.00 && diff <= 2.50) { if (absCall <= absPut) { Entry = CallPrice; Code = Option1.GetATMCallRecent(1); ID = Account1.OrderBuy(Code, 1, CallAsk, 0); Xvol = 1; } else { Entry = PutPrice; Code = Option1.GetATMPutRecent(1); ID = Account1.OrderBuy(Code, 1, PutAsk, 0); Xvol = 1; } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 외가격 옵션 매수 > 1. 검토사항 (아래 수식) 진입조건(등가격의 합과 차)을 만족했을 때 등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다. 코딩내용이 맞는지 봐주셨으면 합니다. 2. 요청수식 검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다. 등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다. (판단은 등가격의 합과 차로, 액션은 외가격으로) 익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다. 포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다. **************************************************************************** var ID, num; var Entry, Code; var Xvol; var HasExited; // 청산 후 재진입을 방지하는 변수 function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격) Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격) Entry = 0; // 초기 Entry 값 설정 HasExited = false; // 초기 재진입 가능 상태 } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); if (nEventID == 1) { if (!HasExited) { // 재진입 방지 조건 추가 if (HHMMSS >= 84500) { var CallPrice = Option1.GetCurrent(0, 0); var PutPrice = Option1.GetCurrent(1, 0); var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5); var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5); var absCall = Math.abs(CallPrice); var absPut = Math.abs(PutPrice); var sum = absCall + absPut; var diff = Math.abs(absCall - absPut); // 진입 조건 if (Entry == 0 && sum <= 5.00 && diff <= 2.50) { if (absCall <= absPut) { Entry = CallPrice; Code = Option1.GetATMCallRecent(0); ID = Account1.OrderBuy(Code, 1, CallAsk, 0); Xvol = 1; } else { Entry = PutPrice; Code = Option1.GetATMPutRecent(0); ID = Account1.OrderBuy(Code, 1, PutAsk, 0); Xvol = 1; } } // 익절/손절 조건 if (Entry > 0 && Xvol > 0) { var currentPrice = Option1.GetCurrent(Code); if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) { closePosition(); // 청산 후 매수 재진입 방지 HasExited = true; // 청산 후 재진입 방지 Main.KillTimer(1); // 타이머 1 종료 } } } } } if (nEventID == 2) { // 15시 청산 조건 if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산 closePosition(); Main.KillTimer(2); // 타이머 2 종료 } } } function closePosition() { // 포지션 청산 if (Xvol > 0) { if (Code) { Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0); } } Entry = 0; // Entry 값 초기화 Code = null; // Code 초기화 Xvol = 0; // 수량 초기화 // HasExited = true; // 청산 후 재진입 방지 } function Main_OnOrderResponse(OrderResponse) { // 주문 응답 처리 if (OrderResponse.orderID == ID) { num = OrderResponse.orderNum; } }
프로필 이미지

예스스탁 예스스탁 답변

2024-08-29 14:31:51

> 좌오비우오비 님이 쓴 글입니다. > 제목 : Re : Re : 외가격 옵션 매수 > 답변 고맙습니다. > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 외가격 옵션 매수 > 안녕하세요 예스스탁입니다. 1 예 맞습니다. 낮은 가격의 종목을 매수하게 작성되었습니다. 2 code변수에 저장되는 값만 Option1.GetATMCallRecent(1),Option1.GetATMPutRecent(1)로 변경하시면 됩니다. // 진입 조건 if (Entry == 0 && sum <= 5.00 && diff <= 2.50) { if (absCall <= absPut) { Entry = CallPrice; Code = Option1.GetATMCallRecent(1); ID = Account1.OrderBuy(Code, 1, CallAsk, 0); Xvol = 1; } else { Entry = PutPrice; Code = Option1.GetATMPutRecent(1); ID = Account1.OrderBuy(Code, 1, PutAsk, 0); Xvol = 1; } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 외가격 옵션 매수 > 1. 검토사항 (아래 수식) 진입조건(등가격의 합과 차)을 만족했을 때 등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다. 코딩내용이 맞는지 봐주셨으면 합니다. 2. 요청수식 검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다. 등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다. (판단은 등가격의 합과 차로, 액션은 외가격으로) 익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다. 포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다. **************************************************************************** var ID, num; var Entry, Code; var Xvol; var HasExited; // 청산 후 재진입을 방지하는 변수 function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격) Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격) Entry = 0; // 초기 Entry 값 설정 HasExited = false; // 초기 재진입 가능 상태 } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); if (nEventID == 1) { if (!HasExited) { // 재진입 방지 조건 추가 if (HHMMSS >= 84500) { var CallPrice = Option1.GetCurrent(0, 0); var PutPrice = Option1.GetCurrent(1, 0); var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5); var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5); var absCall = Math.abs(CallPrice); var absPut = Math.abs(PutPrice); var sum = absCall + absPut; var diff = Math.abs(absCall - absPut); // 진입 조건 if (Entry == 0 && sum <= 5.00 && diff <= 2.50) { if (absCall <= absPut) { Entry = CallPrice; Code = Option1.GetATMCallRecent(0); ID = Account1.OrderBuy(Code, 1, CallAsk, 0); Xvol = 1; } else { Entry = PutPrice; Code = Option1.GetATMPutRecent(0); ID = Account1.OrderBuy(Code, 1, PutAsk, 0); Xvol = 1; } } // 익절/손절 조건 if (Entry > 0 && Xvol > 0) { var currentPrice = Option1.GetCurrent(Code); if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) { closePosition(); // 청산 후 매수 재진입 방지 HasExited = true; // 청산 후 재진입 방지 Main.KillTimer(1); // 타이머 1 종료 } } } } } if (nEventID == 2) { // 15시 청산 조건 if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산 closePosition(); Main.KillTimer(2); // 타이머 2 종료 } } } function closePosition() { // 포지션 청산 if (Xvol > 0) { if (Code) { Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0); } } Entry = 0; // Entry 값 초기화 Code = null; // Code 초기화 Xvol = 0; // 수량 초기화 // HasExited = true; // 청산 후 재진입 방지 } function Main_OnOrderResponse(OrderResponse) { // 주문 응답 처리 if (OrderResponse.orderID == ID) { num = OrderResponse.orderNum; } }