커뮤니티

수식 부탁합니다.

프로필 이미지
팡팡
2015-04-20 18:31:13
1778
글번호 223436
답변완료
많은 도움을 받고 있습니다. 선물매수신호유지시 콜옵션 1.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 풋옵션 2.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 선물매도신호유지시 콜옵션 2.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 풋옵션 1.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 로스컷은 아래식으로 가능한지요? //5초단위로 잔고 체크 function Main_OnTimer(nEventID) { var U1 = 0; var P1 = 0; var V1 = 0; var Z1 = 0; var U2 = 0; var P2 = 0; var V2 = 0; var Z2 = 0; //최근 buy발생상태이면 if (Start == 1) { A1.SetBalanceItem(CallCode1,0); if (A1.Balance.count > 0 && A1.Balance.position == 1) { U1 = A1.Balance.avgUnitCost; P1 = A1.Balance.current; V1 = A1.Balance.count; Z1 = ((U1-P1)*V1)*500000; } A1.SetBalanceItem(CallCode2,0); if (A1.Balance.count > 0 && A1.Balance.position == 2) { U2 = A1.Balance.avgUnitCost; P2 = A1.Balance.current; V2 = A1.Balance.count; Z2 = ((P2-U2)*V2)*500000; } if ((Z1+Z2) <= loss) { A1.OrderBuy(CallCode1, V1, Option.GetAskByCode(CallCode1, 2), 0); A1.OrderSell(CallCode2, V2, Option.GetBidByCode(CallCode2, 2), 0); Main.SetUserValue("Start", 0); Main.SetUserValue("Code1", " "); Main.SetUserValue("Code2", " "); } } //최근 SEll발생상태이면 if (Start == -1) { A1.SetBalanceItem(PutCode1,0); if (A1.Balance.count > 0 && A1.Balance.position == 1) { U1 = A1.Balance.avgUnitCost; P1 = A1.Balance.current; V1 = A1.Balance.count; Z1 = ((U1-P1)*V1)*500000; } A1.SetBalanceItem(PutCode2,0); if (A1.Balance.count > 0 && A1.Balance.position == 2) { U2 = A1.Balance.avgUnitCost; P2 = A1.Balance.current; V2 = A1.Balance.count; Z2 = ((P2-U2)*V2)*500000; } if ((Z1+Z2) <= loss) { Start = 0; A1.OrderBuy(PutCode1, V1, Option.GetAskByCode(PutCode1, 2), 0); A1.OrderSell(PutCode2, V2, Option.GetBidByCode(PutCode2, 2), 0); Main.SetUserValue("Start", 0); Main.SetUserValue("Code1", " "); Main.SetUserValue("Code2", " "); } } }
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2015-04-24 16:59:27

안녕하세요 예스스탁입니다. 아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다. 이전일의 주문낸것을 기억하려면 내부파일에 값을 적어 보관해야 합니다. 아래식은 15시 4분에 차트 포지션 여부에 따라 콜과 풋종목을 선정하고 주문후에 내부파일에 지정한 변수명으로 종모코드를 적어놓게 됩니다. 15시 3분에 내부파일의 지정한 변수에 값이 저장되어 있으면 청산하고 내부파일을 지우게 됩니다. var CallOrderCode,PutOrderCode; var Entry, Exit; function Main_OnStart() { Entry = false; Exit = false; Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { if (nEventID <= 1) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //15시 4분 if (Entry == false && HHMMSS >= 150400 ) { Entry = true; //차트가 무포지션 if (Chart1.GetOpenContracts() == 0) { Main.SetUserValue("CallOrderCode", ""); Main.SetUserValue("PutOrderCode", ""); } //차트가 매수유지봉 if (Chart1.GetOpenContracts() > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호유지"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 1.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-1.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { Account1.OrderSell(CallOrderCode, 1, 0, 1); Account1.OrderSell(PutOrderCode, 1, 0, 1); Main.SetUserValue("CallOrderCode", CallOrderCode); Main.SetUserValue("PutOrderCode", PutOrderCode); } } //차트가 매도유지봉 if (Chart1.GetOpenContracts() < 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매도신호 유지"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //풋옵션중 1.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-1.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { Account1.OrderSell(CallOrderCode, 1, 0, 1); Account1.OrderSell(PutOrderCode, 1, 0, 1); Main.SetUserValue("CallOrderCode", CallOrderCode); Main.SetUserValue("PutOrderCode", PutOrderCode); } } } //15시 3분 if (Exit == false && HHMMSS >= 150300 ) { Exit = true; //내부파일의 값을 가져와 변수에 저장 var PreDayCall = Main.GetUserValue("CallOrderCode"); var PreDayPut = Main.GetUserValue("PutOrderCode"); //PreDayCall에 값이 있으면 if (PreDayCall != "") { //잔고셋팅후 매도포지션이면 청산하고 //내부파일의 값을 빈공간으로 만듬 Account1.SetBalanceItem(PreDayCall,0) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1); Main.SetUserValue("CallOrderCode", ""); } } //PreDayPutl에 값이 있으면 if (PreDayPut != "") { //잔고셋팅후 매도포지션이면 청산하고 //내부파일의 값을 빈공간으로 만듬 Account1.SetBalanceItem(PreDayCall,0) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1); Main.SetUserValue("CallOrderCode", ""); } } //모두 수행후 값을 빈공간으로 만듬 Main.SetUserValue("CallOrderCode", ""); Main.SetUserValue("PutOrderCode", ""); } } } 즐거운 하루되세요 > 팡팡 님이 쓴 글입니다. > 제목 : 수식 부탁합니다. > 많은 도움을 받고 있습니다. 선물매수신호유지시 콜옵션 1.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 풋옵션 2.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 선물매도신호유지시 콜옵션 2.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 풋옵션 1.0 에 가장근접한 행사가를 15시04분 매도, 익일 15시 03분 청산 로스컷은 아래식으로 가능한지요? //5초단위로 잔고 체크 function Main_OnTimer(nEventID) { var U1 = 0; var P1 = 0; var V1 = 0; var Z1 = 0; var U2 = 0; var P2 = 0; var V2 = 0; var Z2 = 0; //최근 buy발생상태이면 if (Start == 1) { A1.SetBalanceItem(CallCode1,0); if (A1.Balance.count > 0 && A1.Balance.position == 1) { U1 = A1.Balance.avgUnitCost; P1 = A1.Balance.current; V1 = A1.Balance.count; Z1 = ((U1-P1)*V1)*500000; } A1.SetBalanceItem(CallCode2,0); if (A1.Balance.count > 0 && A1.Balance.position == 2) { U2 = A1.Balance.avgUnitCost; P2 = A1.Balance.current; V2 = A1.Balance.count; Z2 = ((P2-U2)*V2)*500000; } if ((Z1+Z2) <= loss) { A1.OrderBuy(CallCode1, V1, Option.GetAskByCode(CallCode1, 2), 0); A1.OrderSell(CallCode2, V2, Option.GetBidByCode(CallCode2, 2), 0); Main.SetUserValue("Start", 0); Main.SetUserValue("Code1", " "); Main.SetUserValue("Code2", " "); } } //최근 SEll발생상태이면 if (Start == -1) { A1.SetBalanceItem(PutCode1,0); if (A1.Balance.count > 0 && A1.Balance.position == 1) { U1 = A1.Balance.avgUnitCost; P1 = A1.Balance.current; V1 = A1.Balance.count; Z1 = ((U1-P1)*V1)*500000; } A1.SetBalanceItem(PutCode2,0); if (A1.Balance.count > 0 && A1.Balance.position == 2) { U2 = A1.Balance.avgUnitCost; P2 = A1.Balance.current; V2 = A1.Balance.count; Z2 = ((P2-U2)*V2)*500000; } if ((Z1+Z2) <= loss) { Start = 0; A1.OrderBuy(PutCode1, V1, Option.GetAskByCode(PutCode1, 2), 0); A1.OrderSell(PutCode2, V2, Option.GetBidByCode(PutCode2, 2), 0); Main.SetUserValue("Start", 0); Main.SetUserValue("Code1", " "); Main.SetUserValue("Code2", " "); } } }
프로필 이미지

팡팡

2015-04-27 18:05:00

답변 감사합니다.. 콜매도, 풋매도 금액의 합으로 투입 금액의 +20% 익절, -20% 손절 식을 부탁합니다.
프로필 이미지

예스스탁 예스스탁 답변

2015-05-07 19:54:59

안녕하세요 예스스탁입니다. var CallOrderCode,PutOrderCode; var Entry, Exit; function Main_OnStart() { Entry = false; Exit = false; Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { if (nEventID <= 1) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //15시 4분 if (Entry == false && HHMMSS >= 150400 ) { Entry = true; //차트가 무포지션 if (Chart1.GetOpenContracts() == 0) { Main.SetUserValue("CallOrderCode", ""); Main.SetUserValue("PutOrderCode", ""); } //차트가 매수유지봉 if (Chart1.GetOpenContracts() > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호유지"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 1.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-1.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { Account1.OrderSell(CallOrderCode, 1, 0, 1); Account1.OrderSell(PutOrderCode, 1, 0, 1); Main.SetUserValue("CallOrderCode", CallOrderCode); Main.SetUserValue("PutOrderCode", PutOrderCode); } } //차트가 매도유지봉 if (Chart1.GetOpenContracts() < 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매도신호 유지"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //풋옵션중 1.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-1.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { Account1.OrderSell(CallOrderCode, 1, 0, 1); Account1.OrderSell(PutOrderCode, 1, 0, 1); Main.SetUserValue("CallOrderCode", CallOrderCode); Main.SetUserValue("PutOrderCode", PutOrderCode); } } } //15시 3분 if (Exit == false && HHMMSS >= 150300 ) { Exit = true; //내부파일의 값을 가져와 변수에 저장 var PreDayCall = Main.GetUserValue("CallOrderCode"); var PreDayPut = Main.GetUserValue("PutOrderCode"); //PreDayCall에 값이 있으면 if (PreDayCall != "") { //잔고셋팅후 매도포지션이면 청산하고 //내부파일의 값을 빈공간으로 만듬 Account1.SetBalanceItem(PreDayCall,0) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1); Main.SetUserValue("CallOrderCode", ""); } } //PreDayPutl에 값이 있으면 if (PreDayPut != "") { //잔고셋팅후 매도포지션이면 청산하고 //내부파일의 값을 빈공간으로 만듬 Account1.SetBalanceItem(PreDayCall,0) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1); Main.SetUserValue("CallOrderCode", ""); } } //모두 수행후 값을 빈공간으로 만듬 Main.SetUserValue("CallOrderCode", ""); Main.SetUserValue("PutOrderCode", ""); } //콜매도, 풋매도 금액의 합으로 +500000원 익절, -500000원 손절 if (HHMMSS < 150300) { // 옵션매도포지션 전체 손익계산 var num = Account1.GetTheNumberOfBalances(); var PLsum = 0; for(var i = 0; i < num; i++) { //잔고셋팅 Account1.SetBalanceIndex(i); //매도포지션이고 옵션종목이고 if (Account1.Balance.position == 1 && (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3")) { //각 옵션매도종목의 (평균단가-현재가)*수량*50만원을 누적 PLsum = PLsum + ((Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count)*500000; } } //손익이 +50만원이상이거나 -50만원 이하이면 if (PLsum >= 500000 || Plsum <= -500000) { for(var i = 0; i < num; i++) { //잔고셋팅 Account1.SetBalanceIndex(i); //매도포지션이고 옵션종목이고 if (Account1.Balance.position == 1 && (Account1.Balance.code.substring(0,1) == "2" || Account1.Balance.code.substring(0,1) == "3")) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0,1); } } } } } } 즐거운 하루되세요 > 팡팡 님이 쓴 글입니다. > 제목 : Re : Re : 수식 부탁합니다. > 답변 감사합니다.. 콜매도, 풋매도 금액의 합으로 투입 금액의 +20% 익절, -20% 손절 식을 부탁합니다.