커뮤니티

옵션 종목선정 오류가 있는거 같아요

프로필 이미지
탄젠트80
2025-03-24 01:56:27.0
170
글번호 226254
답변완료
안녕하세요. 완전초보입니다 월물옵션, 위클리옵션 스팟으로 매매중이며 아래수식은 그중 종목선정 부분만 발췌한 사항입니다. 작동은 되는데 가끔 엉뚱한 종목이 선정됩니다. (증상) 콜풋 1.5에 가까운 종목 찾아서 SC, SP로 지정하되 그 차이가 0.8보다 크면 콜풋 0.9에 가까운 종목으로 SC, SP로 변경 지정하라 인데 가끔 풋옵션이 3.X 또는 4.X 가격이 지정됩니다. 분명 종목선정 시기에 1.5 또는 0.9에 가까운 풋옵션 종목이 있는데도 말입니다. 풋옵션만 좀 더 내가쪽에서 종목이 선정되는거 같습니다. 수식 자체는 작동하나 종목 선정시에는 문제가 있는거 같은데 꼭 수정 부탁드립니다. 아래식은 제가 사용하는 수식이며 이수식도 예전에 운영자님께서 도움주셔서 작성한 수식입니다. (요청사항 1) 지정된 가격의 종목이 선정될수 있도록 수식의 오류사항을 수정해주세요 (요청사항 2) 콜가격1(1.5근접), 콜가격2(0.9근접), 풋가격1, 풋가격2에서 콜가격1-풋가격1, 콜가격1-풋가격2, 콜가격2-풋가격1, 콜가격2-풋가격2 차이의 절대값을 구하고 그 차이가 가장 적은 경우의 콜과 풋을 SC, SP로 지정하는 수식도 부탁드립니다. //아래는 종목선정 수식이며 답변 미리감사드립니다. ----------------------------------------------------------------------- function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (Option.GetRemainDays(0,0) >= 4 && nEventID == 1 && HHMMSS >= 090030) { Main.MessageList("당일목클진입없음"); Main.KillTimer(1); } if (Option.GetRemainDays(0,0) >= 2 && Option.GetRemainDays(0,0) <= 3 && nEventID == 1 && HHMMSS >= 090040 && Entry1 == false) { var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); var CallPrice1 = new Array(UNum+LNum+1); var CallPrice2 = new Array(UNum+LNum+1); var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); var PutPrice1 = new Array(UNum+LNum+1); var PutPrice2 = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) >= 0.7 && Option.GetCurrent(0, i) <= 2.5 && Math.abs(Option.GetDelta(0, i)) < 0.95) { CallPrice[i+LNum] = Option.GetCurrent(0, i); //콜별 현재가 CallPrice1[i+LNum] = Math.abs(Option.GetCurrent(0, i)-1.5); //1.5 근접 CallPrice2[i+LNum] = Math.abs(Option.GetCurrent(0, i)-0.9); //0.9 근접 CallCode[i+LNum] = Option.GetATMCallRecent(i); //종목코드 } } for (var i = -UNum; i <= LNum; i++) { if (Option.GetCurrent(0, i) >= 0.7 && Option.GetCurrent(0, i) <= 2.5 && Math.abs(Option.GetDelta(1, i)) < 0.95) { PutPrice[i+UNum] = Option.GetCurrent(1, i); //풋별 현재가 PutPrice1[i+UNum] = Math.abs(Option.GetCurrent(1, i)-1.5); //1.5 근접 PutPrice2[i+UNum] = Math.abs(Option.GetCurrent(1, i)-0.9); //0.9 근접 PutCode[i+UNum] = Option.GetATMPutRecent(i); //종목코드 } } //콜 종목 찾음 var CC1 = 99999999; var CCPrice1 = 0; var CallOrderCode1 = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice1[i+LNum] < CC1) { CC1 = CallPrice1[i+LNum]; CCPrice1 = CallPrice[i+LNum]; CallOrderCode1 = CallCode[i+LNum] } } //풋 종목 찾음 var PP1 = 99999999; var PPPrice1 = 0; var PutOrderCode1 = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice1[i+UNum] < PP1) { PP1 = PutPrice1[i+UNum]; PPPrice1 = PutPrice[i+UNum]; PutOrderCode1 = PutCode[i+UNum]; } } //콜풋 모두 찾았으면 if (CC1 < 99999999 && PP1 < 99999999) { //우선 1.5에 가까운 종목을 SC와 SP로 저장 SC = CallOrderCode1; SP = PutOrderCode1; //콜풋 차이가 0.8이상이면 0.9에 가장 가까운 종목을 찾아 SC와 SP를 변경 if (Math.abs(CCPrice1-PPPrice1) >= 0.8) { var CC2 = 99999999; var CCPrice2 = 0; var CallOrderCode2 = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice2[i+LNum] < CC2) { CC2 = CallPrice2[i+LNum]; CCPrice2 = CallPrice[i+LNum]; CallOrderCode2 = CallCode[i+LNum] } } var PP2 = 99999999; var PPPrice2 = 0; var PutOrderCode2 = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice2[i+UNum] < PP2) { PP2 = PutPrice2[i+UNum]; PPPrice2 = PutPrice[i+UNum]; PutOrderCode2 = PutCode[i+UNum]; } } if (CC2 < 99999999 && PP2 < 99999999) { SC = CallOrderCode2; SP = PutOrderCode2; } } CEntryPrice = Option.GetCurrentByCode(SC); PEntryPrice = Option.GetCurrentByCode(SP); CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100; Entry1 = true; Main.MessageList("기준양합:", CPEntryPrice, "콜종목:", SC, "콜가격:", CEntryPrice, "풋종목:", SP, "풋가격:", PEntryPrice); //종목선정이 완료되었으므로 타이머 종료 Main.KillTimer(1); //타이머 셋팅(2번, 2초) Main.SetTimer(2, 2000); } } } ------------------------------------------------------------------------------------
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-04-07 14:46:59.0

안녕하세요 예스스탁입니다. 콜풋 1.5에 가까운 종목 찾아서 SC, SP로 지정하되 그 차이가 0.8보다 크면 콜풋 0.9에 가까운 종목으로 SC, SP로 변경 지정 기존식 불필요한 내용들이 많고 확인인 어려워 위 내용으로만 새로 작성해 드립니다. 필요하신 부분은 추가해서 조건을 지정하시면 됩니다. var Entry1; function Main_OnStart() { Main.SetTimer(1,5000); Entry1 = false; } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (Option.GetRemainDays(0,0) >= 4 && nEventID == 1 && HHMMSS >= 090030) { Main.MessageList("당일목클진입없음"); Main.KillTimer(1); } if (Option.GetRemainDays(0,0) >= 2 && Option.GetRemainDays(0,0) <= 3 && nEventID == 1 && HHMMSS >= 090040 && Entry1 == false) { var UNum = Option.uppersATM; var LNum = Option.lowersATM; CSdiff = -1; SC = 0; CEntryPrice = 0; PSdiff = -1; SP = 0; PEntryPrice = 0; for (var i = -LNum; i <= UNum; i++) { if (CSdiff == -1 || (CSdiff >= 0 && Math.abs(Option.GetCurrent(0,i)-1.5) < CSdiff)) { CEntryPrice = Option.GetCurrent(0,i); CSdiff = Math.abs(CEntryPrice-1.5); CS = Option.GetATMCallRecent(i); } if (PSdiff == -1 || (PSdiff >= 0 && Math.abs(Option.GetCurrent(1,-i)-1.5) < PSdiff)) { PEntryPrice = Option.GetCurrent(1,-i); PSdiff = Math.abs(PEntryPrice-1.5); PS = Option.GetATMPutRecent(-i); } } if (Math.abs(CEntryPrice-PEntryPrice) <= 0.008) { Main.MessageList("1.5급접 선정완료:","콜:",CS,CEntryPrice,"풋:",PS,CEntryPrice,"차이:",Math.abs(CEntryPrice-PEntryPrice)); } else { Main.MessageList("차이 0.8이상 --> 0.9근접종목 재선정하기"); CSdiff = -1; SC = 0; CEntryPrice = 0; PSdiff = -1; SP = 0; PEntryPrice = 0; for (var i = -LNum; i <= UNum; i++) { if (CSdiff == -1 || (CSdiff >= 0 && Math.abs(Option.GetCurrent(0,i)-0.9) < CSdiff)) { CEntryPrice = Option.GetCurrent(0,i); CSdiff = Math.abs(CEntryPrice-0.9); CS = Option.GetATMCallRecent(i); } if (PSdiff == -1 || (PSdiff >= 0 && Math.abs(Option.GetCurrent(1,-i)-0.9) < PSdiff)) { PEntryPrice = Option.GetCurrent(1,-i); PSdiff = Math.abs(PEntryPrice-0.9); PS = Option.GetATMPutRecent(-i); } } Main.MessageList("0.9급접:","콜:",CS,CEntryPrice,"풋:",PS,PEntryPrice); } CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100; Entry1 = true; Main.MessageList("기준양합:", CPEntryPrice, "콜종목:", SC, "콜가격:", CEntryPrice, "풋종목:", SP, "풋가격:", PEntryPrice); //종목선정이 완료되었으므로 타이머 종료 Main.KillTimer(1); } } 즐거운 하루되세요 > 탄젠트80 님이 쓴 글입니다. > 제목 : 옵션 종목선정 오류가 있는거 같아요 > 안녕하세요. 완전초보입니다 월물옵션, 위클리옵션 스팟으로 매매중이며 아래수식은 그중 종목선정 부분만 발췌한 사항입니다. 작동은 되는데 가끔 엉뚱한 종목이 선정됩니다. (증상) 콜풋 1.5에 가까운 종목 찾아서 SC, SP로 지정하되 그 차이가 0.8보다 크면 콜풋 0.9에 가까운 종목으로 SC, SP로 변경 지정하라 인데 가끔 풋옵션이 3.X 또는 4.X 가격이 지정됩니다. 분명 종목선정 시기에 1.5 또는 0.9에 가까운 풋옵션 종목이 있는데도 말입니다. 풋옵션만 좀 더 내가쪽에서 종목이 선정되는거 같습니다. 수식 자체는 작동하나 종목 선정시에는 문제가 있는거 같은데 꼭 수정 부탁드립니다. 아래식은 제가 사용하는 수식이며 이수식도 예전에 운영자님께서 도움주셔서 작성한 수식입니다. (요청사항 1) 지정된 가격의 종목이 선정될수 있도록 수식의 오류사항을 수정해주세요 (요청사항 2) 콜가격1(1.5근접), 콜가격2(0.9근접), 풋가격1, 풋가격2에서 콜가격1-풋가격1, 콜가격1-풋가격2, 콜가격2-풋가격1, 콜가격2-풋가격2 차이의 절대값을 구하고 그 차이가 가장 적은 경우의 콜과 풋을 SC, SP로 지정하는 수식도 부탁드립니다. //아래는 종목선정 수식이며 답변 미리감사드립니다. ----------------------------------------------------------------------- function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (Option.GetRemainDays(0,0) >= 4 && nEventID == 1 && HHMMSS >= 090030) { Main.MessageList("당일목클진입없음"); Main.KillTimer(1); } if (Option.GetRemainDays(0,0) >= 2 && Option.GetRemainDays(0,0) <= 3 && nEventID == 1 && HHMMSS >= 090040 && Entry1 == false) { var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); var CallPrice1 = new Array(UNum+LNum+1); var CallPrice2 = new Array(UNum+LNum+1); var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); var PutPrice1 = new Array(UNum+LNum+1); var PutPrice2 = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { if (Option.GetCurrent(0, i) >= 0.7 && Option.GetCurrent(0, i) <= 2.5 && Math.abs(Option.GetDelta(0, i)) < 0.95) { CallPrice[i+LNum] = Option.GetCurrent(0, i); //콜별 현재가 CallPrice1[i+LNum] = Math.abs(Option.GetCurrent(0, i)-1.5); //1.5 근접 CallPrice2[i+LNum] = Math.abs(Option.GetCurrent(0, i)-0.9); //0.9 근접 CallCode[i+LNum] = Option.GetATMCallRecent(i); //종목코드 } } for (var i = -UNum; i <= LNum; i++) { if (Option.GetCurrent(0, i) >= 0.7 && Option.GetCurrent(0, i) <= 2.5 && Math.abs(Option.GetDelta(1, i)) < 0.95) { PutPrice[i+UNum] = Option.GetCurrent(1, i); //풋별 현재가 PutPrice1[i+UNum] = Math.abs(Option.GetCurrent(1, i)-1.5); //1.5 근접 PutPrice2[i+UNum] = Math.abs(Option.GetCurrent(1, i)-0.9); //0.9 근접 PutCode[i+UNum] = Option.GetATMPutRecent(i); //종목코드 } } //콜 종목 찾음 var CC1 = 99999999; var CCPrice1 = 0; var CallOrderCode1 = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice1[i+LNum] < CC1) { CC1 = CallPrice1[i+LNum]; CCPrice1 = CallPrice[i+LNum]; CallOrderCode1 = CallCode[i+LNum] } } //풋 종목 찾음 var PP1 = 99999999; var PPPrice1 = 0; var PutOrderCode1 = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice1[i+UNum] < PP1) { PP1 = PutPrice1[i+UNum]; PPPrice1 = PutPrice[i+UNum]; PutOrderCode1 = PutCode[i+UNum]; } } //콜풋 모두 찾았으면 if (CC1 < 99999999 && PP1 < 99999999) { //우선 1.5에 가까운 종목을 SC와 SP로 저장 SC = CallOrderCode1; SP = PutOrderCode1; //콜풋 차이가 0.8이상이면 0.9에 가장 가까운 종목을 찾아 SC와 SP를 변경 if (Math.abs(CCPrice1-PPPrice1) >= 0.8) { var CC2 = 99999999; var CCPrice2 = 0; var CallOrderCode2 = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice2[i+LNum] < CC2) { CC2 = CallPrice2[i+LNum]; CCPrice2 = CallPrice[i+LNum]; CallOrderCode2 = CallCode[i+LNum] } } var PP2 = 99999999; var PPPrice2 = 0; var PutOrderCode2 = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice2[i+UNum] < PP2) { PP2 = PutPrice2[i+UNum]; PPPrice2 = PutPrice[i+UNum]; PutOrderCode2 = PutCode[i+UNum]; } } if (CC2 < 99999999 && PP2 < 99999999) { SC = CallOrderCode2; SP = PutOrderCode2; } } CEntryPrice = Option.GetCurrentByCode(SC); PEntryPrice = Option.GetCurrentByCode(SP); CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100; Entry1 = true; Main.MessageList("기준양합:", CPEntryPrice, "콜종목:", SC, "콜가격:", CEntryPrice, "풋종목:", SP, "풋가격:", PEntryPrice); //종목선정이 완료되었으므로 타이머 종료 Main.KillTimer(1); //타이머 셋팅(2번, 2초) Main.SetTimer(2, 2000); } } } ------------------------------------------------------------------------------------