커뮤니티

수식 수정 문의드립니다.

프로필 이미지
탄젠트80
2016-06-13 08:21:02
1269
글번호 223925
답변완료
안녕하세요 항상 답변에 감사드리고 있습니다. 아래 수식은 선물매수시 스팟에서 콜매수, 풋매도 진입하고 선물매도시 스팟에서 풋매수,콜매도 옵션을 주문하는 합성선물 수식입니다. 이 합성선물 수식을 수정하여 아래와 같은 수식으로 변경하고자 합니다. 주내용은 선물신호발생하여 옵션주문시 당초 양합보다 (+)시에는(양매수장) 옵션매수를 하고 양합 (-)시에는(양매도) 옵션매도 판단하여 주문하는 수식입니다. ㅁ선물신호 발생 --->(양합이 1% 이상일때) 콜매수 또는 풋매수 ㅁ선물신호 발생 --->(양합이 1% 미만일때) 콜매도 또는 풋매도 최종 합성선물수식은 아니고 방향성 수식이며 선물에서 신호발생시 스팟에서 양합에 따라 매수, 매도를 결정하여 한 종목만 네이키드 진입함 당일 9시1분 등가의 콜과 풋의 종목을 기억하고 콜값, 풋값과 그 양합을 구함 (당일 시초가 등가는 장이 시작되야 알기에 1분으로 함) 선물매수신호가 나오면 9시1분 기억한 종목의 양합을 체크하여 양합이 9시1분보다 1% 이상에 있을때는 콜매수하고 1%보다 낮을때는 풋매도 진입 선물매도신호가 나오면 9시 1분에 기억한 종목의 양합을 체크하여 현재의 양합이 9시1분보다 1% 이상에 있을때는 풋매수, 그렇지 않을때는 콜매도 진입 미리 답변에 감사드립니다. 주신답변 실전에 잘 응용해서 써먹고 있습니다. 아래는 합성선물 수식입니다. ================================================================================ var T; var CC, CallOrderCode; var PP, PutOrderCode; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { T = 1; Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); 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] } } //풋옵션중 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.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } if (T == 1 && Signal.signalKind == 2) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitLong신호 발생"); T = 0; Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0); Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); } if (T >= 0 && Signal.signalKind == 3) { T = -1; Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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] } } //풋옵션중 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, Vol, Option.GetBid(CallOrderCode, 5), 0); Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); } } if (T == -1 && Signal.signalKind == 4) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitShort신호 발생"); T = 0; Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } ==================================================================================
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2016-07-13 14:57:45

안녕하세요 예스스탁입니다. 올려주신 식은 차트에서 신호가 발생하면 그때 지정한 조건의 콜/풋을 찾아 주문을 내게 됩니다. 9시 1분에는 어떤 종목에 대해 주문이 나갈지 알수가 없어 그때 양합저장활수는 없습니다. 신호가 발생하면 선택되는 종목들의 시초가를 합해서 현재가와 +인지 -인지로 판단하게 작성했습니다. var T; var CC, CallOrderCode; var PP, PutOrderCode; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { T = 1; Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); 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] } } //풋옵션중 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) { //시초가합 var sum = Option.GetOpen(CallOrderCode)+ Option.GetOpen(PutOrderCode); //시초가합보다 현재가합이 1%이상 크면 콜매수 if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) >= sum*1.01) { T = 2; Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); } //시초가합보다 현재가합이 1%이상 작으면 풋매도 if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) <= sum*0.99) { T = 3; Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } } if (T >= 1 && Signal.signalKind == 2) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitLong신호 발생"); T = 0; if (T == 2) { Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0); } if (T == 3) { Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); } } if (T >= 0 && Signal.signalKind == 3) { T = -1; Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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] } } //풋옵션중 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) { //시초가합 var sum = Option.GetOpen(CallOrderCode)+ Option.GetOpen(PutOrderCode); //시초가합보다 현재가합이 1%이상 크면 풋매수 if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) >= sum*1.01) { Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); T = -2; } //시초가합보다 현재가합이 1%이상 작으면 콜매 if (Option.GetCurrent(CallOrderCode)+ Option.GetCurrent(PutOrderCode) <= sum*0.99) { Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0); T = -3; } } } if (T <= -1 && Signal.signalKind == 4) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitShort신호 발생"); T = 0; if (T == -2) { Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); } if (T == -3) { Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } } 즐거운 하루되세요 > 탄젠트80 님이 쓴 글입니다. > 제목 : 수식 수정 문의드립니다. > 안녕하세요 항상 답변에 감사드리고 있습니다. 아래 수식은 선물매수시 스팟에서 콜매수, 풋매도 진입하고 선물매도시 스팟에서 풋매수,콜매도 옵션을 주문하는 합성선물 수식입니다. 이 합성선물 수식을 수정하여 아래와 같은 수식으로 변경하고자 합니다. 주내용은 선물신호발생하여 옵션주문시 당초 양합보다 (+)시에는(양매수장) 옵션매수를 하고 양합 (-)시에는(양매도) 옵션매도 판단하여 주문하는 수식입니다. ㅁ선물신호 발생 --->(양합이 1% 이상일때) 콜매수 또는 풋매수 ㅁ선물신호 발생 --->(양합이 1% 미만일때) 콜매도 또는 풋매도 최종 합성선물수식은 아니고 방향성 수식이며 선물에서 신호발생시 스팟에서 양합에 따라 매수, 매도를 결정하여 한 종목만 네이키드 진입함 당일 9시1분 등가의 콜과 풋의 종목을 기억하고 콜값, 풋값과 그 양합을 구함 (당일 시초가 등가는 장이 시작되야 알기에 1분으로 함) 선물매수신호가 나오면 9시1분 기억한 종목의 양합을 체크하여 양합이 9시1분보다 1% 이상에 있을때는 콜매수하고 1%보다 낮을때는 풋매도 진입 선물매도신호가 나오면 9시 1분에 기억한 종목의 양합을 체크하여 현재의 양합이 9시1분보다 1% 이상에 있을때는 풋매수, 그렇지 않을때는 콜매도 진입 미리 답변에 감사드립니다. 주신답변 실전에 잘 응용해서 써먹고 있습니다. 아래는 합성선물 수식입니다. ================================================================================ var T; var CC, CallOrderCode; var PP, PutOrderCode; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { T = 1; Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); 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] } } //풋옵션중 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.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } if (T == 1 && Signal.signalKind == 2) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitLong신호 발생"); T = 0; Account1.OrderSell(CallOrderCode, Vol, Option.GetBid(CallOrderCode, 5), 0); Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); } if (T >= 0 && Signal.signalKind == 3) { T = -1; Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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] } } //풋옵션중 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, Vol, Option.GetBid(CallOrderCode, 5), 0); Account1.OrderBuy(PutOrderCode, Vol, Option.GetAsk(PutOrderCode, 5), 0); } } if (T == -1 && Signal.signalKind == 4) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitShort신호 발생"); T = 0; Account1.OrderBuy(CallOrderCode, Vol, Option.GetAsk(CallOrderCode, 5), 0); Account1.OrderSell(PutOrderCode, Vol, Option.GetBid(PutOrderCode, 5), 0); } } ==================================================================================