커뮤니티

수식 문의 드립니다.

프로필 이미지
피니트
2016-02-24 10:43:34
2259
글번호 223839
답변완료
수고 많으십니다. 1. 일봉에서 종가가 20이평 위에 있고 // 300틱에서 종가가 60이평 아래에 있을 때 // 9시 10분이 될 때 // 콜ATM+1 2계약 매도 , 풋ATM+1 2계약 각각 매도 하라 (만기일은 제외하고 진입하라) 2. (선물포지션은 그냥 둔 채로) 현재 계좌의 옵션의 수익이 계약당 5만원이 넘으면 계좌의 모든 옵션 청산하라 3. 진입한 옵션중 콜 옵션이나 풋옵션의 수익률이 -50% 가 되면 계좌의 모든 옵션을 청산하라
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2016-03-04 16:17:06

안녕하세요 예스스탁입니다. 1. 각 주기의 이평이 주문할 종목의 이평인지 혹은 선물과 같은 다른종목의 이평인지 모르겠습니다. 선물로 생각하고 식 작성해 드립니다. 일봉, 300틱등은 시간주기를 가지는 데이터는 차트에서 확인을 해야 하며 지표값 같은 경우에 차트에 지표식을 적용하고 스팟에서 받아서 처리하면 간단히 처리가 됩니다. 아래 지표식을 [이평2]라는 이름으로 작성하시고 input : P1(20),P2(60); plot1(ma(c,P1)); plot2(ma(C,P2)); 일봉과 300틱차트를 차트에 적용한 이후에 아이디 부여후 스팟의 객체설정화면에서 아이디 연결하시면 됩니다. 스크립트 객체 설정 차트객체 추가 --> 속성에서 객체명은 Chart1, 일봉차트와 아이디 연결 차트객체 추가 --> 속성에서 객체명은 Chart2, 300틱차트와 아이디 연결 계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호 지정 옵션객체 추가 --> 속성에서 객체명은 Option1, 주가지수옵션으로 지정 스팟수식은 아래와 같습니다. var entry; function Main_OnStart() { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); Entry = false; //스팟이 9시 10분이전에 적용된 경우만 동작 if (HHMMSS < 91000) { Entry = true; Main.SetTimer(1,10000);//1번 타이머 10초 } } function Main_OnTimer(nEventID) { if (Entry == false && nEventID == 1 && HHMMSS >= 91000) { //chart1에 적용된 이평2에서 plot1의 현재값을 가져와 저장 var ma1 = Chart1.GetIndicatorData("이평2",1,0); //chart2에 적용된 이평2에서 plot2의 현재값을 가져와 저장 var ma2 = Chart1.GetIndicatorData("이평2",2,0); //chart1의 종가가 ma1보다 크고 chart2의 종가가 ma2보다 작으면 if (Chart1.GetClose(1, 0) > ma1 && Chart2.GetClose(1, 0) < ma2 ) { //콜+1 2계약 매수5호가로 매도 Account1.OrderSell(Option1.GetATMCallRecent(1, 0),2, Option1.GetBid(Option1.GetATMCallRecent(1, 0), 5),0); //풋+1 2계약 매수5호가로 매도 Account1.OrderSell(Option1.GetATMPutRecent(1, 0),2, Option1.GetBid(Option1.GetATMCallRecent(1, 0), 5),0); } } } 2. function Main_OnStart() { Main.MessageLog("시작") Main.SetTimer(1, 30000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 090000 && HHMMSS < 151000) { //옵션 잔고의 손익과 손실 합계 var Bnum = Account1.GetTheNumberOfBalances(); var sumPL = 0; var sumVol = 0; for(var i = 0; i < Bnum; i++) { Account1.SetBalance(i); //콜이나 풋이면 if (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3") //if (Account1.Balance.code.substring(0,2) == "12" || Account1.Balance.code.substring(0,2) == "13") //NH투자증권이면 아래 if문사용 { if (Account1.Balance.position == 1) { sumPL = sumPL + (Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count; sumVol = sumVol + Account1.Balance.count; } if (Account1.Balance.position == 2) { sumPL = sumPL + (Account1.Balance.current-Account1.Balance.avgUnitCost)*Account1.Balance.count; sumVol = sumVol + Account1.Balance.count; } } } //1계약당 0.1포인트 이상 수익이면 if (sumPL/sumVol >= 0.1) { for(var i = 0; i < Bnum; i++) { Account1.SetBalance(i); if (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3") //if (Account1.Balance.code.substring(0,2) == "12" || Account1.Balance.code.substring(0,2) == "13") //NH투자증권이면 아래 if문사용 { if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } } 3 function Main_OnStart() { Main.MessageLog("시작") Main.SetTimer(1, 30000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 090000 && HHMMSS < 151000) { //옵션 잔고의 손익과 손실 합계 var Bnum = Account1.GetTheNumberOfBalances(); var AllExit = false; for(var i = 0; i < Bnum; i++) { Account1.SetBalance(i); //콜이나 풋이면 if (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3") //if (Account1.Balance.code.substring(0,2) == "12" || Account1.Balance.code.substring(0,2) == "13") //NH투자증권이면 아래 if문사용 { if (Account1.Balance.position == 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.5) { AllExit = true; } if (Account1.Balance.position == 2 && Account1.Balance.current <= Account1.Balance.avgUnitCost*0.5) { AllExit = true; } } } //50% 이상 손실난 옵션 종목이 있으면 //옵션 전체 청산 if (AllExit == true) { for(var i = 0; i < Bnum; i++) { Account1.SetBalance(i); if (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3") //if (Account1.Balance.code.substring(0,2) == "12" || Account1.Balance.code.substring(0,2) == "13") //NH투자증권이면 아래 if문사용 { if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } } 즐거운 하루되세요 > 피니트 님이 쓴 글입니다. > 제목 : 수식 문의 드립니다. > 수고 많으십니다. 1. 일봉에서 종가가 20이평 위에 있고 // 300틱에서 종가가 60이평 아래에 있을 때 // 9시 10분이 될 때 // 콜ATM+1 2계약 매도 , 풋ATM+1 2계약 각각 매도 하라 (만기일은 제외하고 진입하라) 2. (선물포지션은 그냥 둔 채로) 현재 계좌의 옵션의 수익이 계약당 5만원이 넘으면 계좌의 모든 옵션 청산하라 3. 진입한 옵션중 콜 옵션이나 풋옵션의 수익률이 -50% 가 되면 계좌의 모든 옵션을 청산하라