커뮤니티

매일 아침 9시에 옵션 양매수 하는 스팟수식 부탁드립니다.

프로필 이미지
제우스
2025-05-22 10:05:01.0
169
글번호 226305
답변완료
1. 매일 아침 9시에(=9시가 안되면 9시 1분에..1분도 안되면 아무튼 가능한 가장 빠른 시간에) 옵션 콜풋 양합이 2.5가 되도록 양매수 진입하되.. 콜풋은 최대한 비슷한 가격으로 선택함. 2. 양합이 3 이 되면 25% 청산 3. 양합이 4가되면 25% 청산 4. 양합이 5가 되면 25% 청산 5. 나머지는 종가청산 6.양합이 위 가격에 안오면 모두 종가청산 위 조건이 구현되는 스팟 수식 부탁드립니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-06-13 14:47:06.0

안녕하세요 예스스탁입니다. 아래식 참고하시기 바랍니다. 스크립트객체설정 옵션객체 추가 --> 객체명 Option1, KP200지수옵션 계좌객체 추가 --> 객체명 Account1, 주문낼 계좌지정 var 양매수시간 = 90100; var 당일청산시간 = 153000; var 양매수기준값 = 2.5; var 양매수기준절반값 = 양매수기준값/2; var 매수수량 = 10; var 양합목표1 = 3.00; var 양합목표2 = 4.00; var 양합목표3 = 5.00; var step,양합; var CallCode,PutCode; function Main_OnStart() { Main.SetTimer(1, 1000); //T는 초기값 0 step = 0; Main.MessageList("Start"); Main.MessageList("양매수기준값:",양매수기준값,"양합목표1:",양합목표1,"양합목표2:",양합목표2,"양합목표3:",양합목표3); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //양매수시간이 되면 if (step == 0 && HHMMSS >= 양매수시간) { //T는 1로 변경 step = 1; //종목선정시작 var CD = -1; var CP = 0; var CC = 0; var PD = -1; var PP = 0; var PC = 0; //양매수기준절반값에 가장 가까운 콜,풋 종목 선정 for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { if (CD == -1 || (CD >= 0 && Math.abs(Option1.GetCurrent(0,i)-양매수기준절반값) < CD)) { CP = Option1.GetCurrent(0,i); CD = Math.abs(Option1.GetCurrent(0,i)-양매수기준절반값); CC = Option1.GetATMCallRecent(i); } if (PD == -1 || (PD >= 0 && Math.abs(Option1.GetCurrent(1,-i)-양매수기준절반값) < PD)) { PD = Math.abs(Option1.GetCurrent(1,-i)-양매수기준절반값); PP = Option1.GetCurrent(1,-i); PC = Option1.GetATMPutRecent(-i); } } Main.MessageList(HHMMSS,CC,CP,PC,PP); //양매수기준절반값에 가장 가까운 콜과 풋을 기준으로 각각 양매수기준값에 가장 가까운 반대 종목을 다시 체크 var CDm = -1; var CPm = 0; var CCm = 0; var PDm = -1; var PPm = 0; var PCm = 0; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { if (CDm == -1 || (CDm >= 0 && Math.abs((Option1.GetCurrent(0,i)+PP)-양매수기준값) < CDm)) { CDm = Math.abs((Option1.GetCurrent(0,i)+PP)-양매수기준값); CPm = Option1.GetCurrent(0,i); CCm = Option1.GetATMCallRecent(i); } if (PDm == -1 || (PDm >= 0 && Math.abs((Option1.GetCurrent(1,-i)+CP)-양매수기준값) < PDm)) { PDm = Math.abs((Option1.GetCurrent(1,-i)+CP)-양매수기준값); PPm = Option1.GetCurrent(1,-i); PCm = Option1.GetATMPutRecent(-i); } } //차이가 3.0 미만에서 양매수기준값에 더 가까운 조합으로 주문 if (CDm <= PDm && Option1.GetCurrent(CC)+Option1.GetCurrent(PCm) < 양합목표1 ) { CallCode = CC; PutCode = PCm; Account1.OrderBuy(CallCode, 매수수량, Option1.GetAsk(CallCode, 5), 0); Account1.OrderBuy(PutCode, 매수수량, Option1.GetAsk(PutCode, 5), 0); //양매수되면 T는 2 step = 2; Main.MessageList(HHMMSS,"step:",step,"콜종목:",CallCode,"풋종목:",PutCode,"양합:",Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) ); } if (CDm > PDm && Option1.GetCurrent(CCm)+Option1.GetCurrent(PC) < 양합목표1 ) { CallCode = CCm; PutCode = PC; Account1.OrderBuy(CallCode, 매수수량, Option1.GetAsk(CallCode, 5), 0); Account1.OrderBuy(PutCode, 매수수량, Option1.GetAsk(PutCode, 5), 0); //양매수되면 T는 2 step = 2; Main.MessageList(HHMMSS,"step:",step,"콜종목:",CallCode,"풋종목:",PutCode,"양합:",Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) ); } } if (step >= 2) { 양합 = Math.round((Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode))*100)/100; Main.MessageList(HHMMSS,"step:",step,"현재 양합:",양합); } //양합이 3 되면 25% 청산 if (step == 2 && 양합 >= 양합목표1 ) { step = 3; Main.MessageList(HHMMSS,"step:",step,양합목표1,"도달"); Account1.SetBalance(CallCode, 0); //콜청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값 var Xvol1 = Math.min(Math.floor(매수수량*0.25),Account1.Balance.count); if (Account1.Balance.position == 2 && Xvol1 > 0) { Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0); } //풋청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값 Account1.SetBalance(PutCode, 0); var Xvol2 = Math.min(Math.floor(매수수량*0.25),Account1.Balance.count); if (Account1.Balance.position == 2 && Xvol2 > 0) { Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0); } } //양합이 4 되면 25% 청산 if (step == 3 && 양합 >= 양합목표2 ) { step = 4; Main.MessageList(HHMMSS,"step:",step,양합목표2,"도달"); //콜청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값 Account1.SetBalance(CallCode, 0); var Xvol1 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count); if (Account1.Balance.position == 2 && Xvol1 > 0) { Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0); } //풋청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값 Account1.SetBalance(PutCode, 0); var Xvol2 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count); if (Account1.Balance.position == 2 && Xvol2 > 0) { Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0); } } //양합이 5 이 되면 25% 청산 if (step == 4 && 양합 >= 양합목표3 ) { Main.MessageList(HHMMSS,"step:",step,양합목표3,"도달"); step = 5; //콜청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값 Account1.SetBalance(CallCode, 0); var Xvol1 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count); if (Account1.Balance.position == 2 && Xvol1 > 0) { Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0); } //풋청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값 Account1.SetBalance(PutCode, 0); var Xvol2 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count); if (Account1.Balance.position == 2 && Xvol2 > 0) { Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0); } } if (step >= 2 && HHMMSS >= 당일청산시간) { Main.MessageList(HHMMSS,"step:",step,"당일청산:전량청산"); step = 6; //콜청산수량 : 전량청산 Account1.SetBalance(CallCode, 0); var Xvol1 = Account1.Balance.count; if (Account1.Balance.position == 2 && Xvol1 > 0) { Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0); } //풋청산수량 : 전량청산 Account1.SetBalance(PutCode, 0); var Xvol2 = Account1.Balance.count; if (Account1.Balance.position == 2 && Xvol2 > 0) { Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0); } //타이머종료 Main.KillTimer(1); } } 즐거운 하루되세요 > 제우스 님이 쓴 글입니다. > 제목 : 매일 아침 9시에 옵션 양매수 하는 스팟수식 부탁드립니다. > 1. 매일 아침 9시에(=9시가 안되면 9시 1분에..1분도 안되면 아무튼 가능한 가장 빠른 시간에) 옵션 콜풋 양합이 2.5가 되도록 양매수 진입하되.. 콜풋은 최대한 비슷한 가격으로 선택함. 2. 양합이 3 이 되면 25% 청산 3. 양합이 4가되면 25% 청산 4. 양합이 5가 되면 25% 청산 5. 나머지는 종가청산 6.양합이 위 가격에 안오면 모두 종가청산 위 조건이 구현되는 스팟 수식 부탁드립니다.