커뮤니티

풋스프레드 매수

프로필 이미지
좌오비우오비
2024-11-15 09:49:39.0
739
글번호 225860
답변완료
아래식은 하방 Put 스프레드 수식입니다 차트1에서 매도 신호가 나오면 1.00 과 가장 가까운 Put 옵션을 매수하고 동시에 바로 아래 외가격(Put종목-1)은 매도합니다. 과거 게시글의 상방 콜 스프레드 수식을 참조하여 작성하여 보았습니다. 진입은 되는데 청산이 안됩니다. 수식이 맞는지 살펴주시기 바랍니다. ************************************************************************ var S1= 0,S2 = 0,PutCode1,PutCode2; var RemainDays,entry; function Main_OnStart() { Main.MessageList("Start"); RemainDays = Option1.GetRemainDays(0,0); entry = true; if (RemainDays == 1) { Main.SetTimer(1, 1000); } } function Chart1_OnRiseSignal(Signal) { S2 = S1; S1 = Signal.signalKind; if (S1 == 3 && entry == true) { if (S2 != 3) { var HNum = Option1.uppersATM; var LNum = Option1.lowersATM; var CP = []; var PD1 = []; var PD2 = []; for (var i = -LNum; i <= HNum; i++) { CP[i+LNum] = Math.abs(Option1.GetCurrent(0, i)-1); PD1[i+LNum] = Option1.GetATMPutRecent(i); PD2[i+LNum] = Option1.GetATMPutRecent(i+1); } var MinV = CP[0]; PutCode1 = PD1[0]; PutCode2 = PD2[0]; for (var i = 0; i < CP.length; i++) { if (CP[i] < MinV) { MinV = CP[i]; PutCode1 = PD1[i]; PutCode2 = PD2[i]; } } Account1.OrderBuy(PutCode1, 1, Option1.GetAskByCode(PutCode1, 5), 0); Account1.OrderSell(PutCode2, 1, Option1.GetBidByCode(PutCode2, 5), 0); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { var d = new Date(); var T1 = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (T1 >= 150000) { Main.KillTimer(1); entry = false; Account1.SetBalance(PutCode1); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { var vol1 = Account1.Balance.count; Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } Account1.SetBalance(PutCode2); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { var vol2 = Account1.Balance.count; Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2023-11-07 15:42:55.0

안녕하세요 예스스탁입니다. Account1.Balance.position 계좌객체의 포지션함수는 해당 종목이 포지션이 매도이면 1, 매수이면 2를 리턴합니다. 현재 2개 종목 모두 Account1.Balance.position == 1 로 되어 있습니다. 차트에서 신호가 발생하면 PutCode1은 매수, PutCode2는 매도를 하므로 타이머 이벤트에서 15시가 되면 PutCode1에 대한 포지션은 2로 확인을 하셔야 합니다. function Main_OnTimer(nEventID) { if (nEventID == 1) { var d = new Date(); var T1 = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (T1 >= 150000) { Main.KillTimer(1); entry = false; Account1.SetBalance(PutCode1); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { var vol1 = Account1.Balance.count; Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } Account1.SetBalance(PutCode2); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { var vol2 = Account1.Balance.count; Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } } } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 문의 > 아래식은 하방 Put 스프레드 수식입니다 차트1에서 매도 신호가 나오면 1.00 과 가장 가까운 Put 옵션을 매수하고 동시에 바로 아래 외가격(Put종목-1)은 매도합니다. 과거 게시글의 상방 콜 스프레드 수식을 참조하여 작성하여 보았습니다. 진입은 되는데 청산이 안됩니다. 수식이 맞는지 살펴주시기 바랍니다. ************************************************************************ var S1= 0,S2 = 0,PutCode1,PutCode2; var RemainDays,entry; function Main_OnStart() { Main.MessageList("Start"); RemainDays = Option1.GetRemainDays(0,0); entry = true; if (RemainDays == 1) { Main.SetTimer(1, 1000); } } function Chart1_OnRiseSignal(Signal) { S2 = S1; S1 = Signal.signalKind; if (S1 == 3 && entry == true) { if (S2 != 3) { var HNum = Option1.uppersATM; var LNum = Option1.lowersATM; var CP = []; var PD1 = []; var PD2 = []; for (var i = -LNum; i <= HNum; i++) { CP[i+LNum] = Math.abs(Option1.GetCurrent(0, i)-1); PD1[i+LNum] = Option1.GetATMPutRecent(i); PD2[i+LNum] = Option1.GetATMPutRecent(i+1); } var MinV = CP[0]; PutCode1 = PD1[0]; PutCode2 = PD2[0]; for (var i = 0; i < CP.length; i++) { if (CP[i] < MinV) { MinV = CP[i]; PutCode1 = PD1[i]; PutCode2 = PD2[i]; } } Account1.OrderBuy(PutCode1, 1, Option1.GetAskByCode(PutCode1, 5), 0); Account1.OrderSell(PutCode2, 1, Option1.GetBidByCode(PutCode2, 5), 0); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { var d = new Date(); var T1 = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (T1 >= 150000) { Main.KillTimer(1); entry = false; Account1.SetBalance(PutCode1); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { var vol1 = Account1.Balance.count; Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } Account1.SetBalance(PutCode2); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { var vol2 = Account1.Balance.count; Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } } } }