커뮤니티

수식 수정 보완 부탁드립니다

프로필 이미지
무명
2015-12-20 00:14:28
1949
글번호 223747
답변완료
1. 다음 2개의 스팟식이 있습니다 둘 다 스팟식을 실행하면 RangeError : Invalid array length라는 메세지가 뜨면서 안돼는데 스팟식 수정 보완 좀 부탁드립니다. 아래 2개의 스팟식은 차트에서 매수 신호가 나오면 양매수, 매도 신호가 나오면 양매도 하는 스팟식입니다. 2. 차트에서 청산신호(매수청산 혹은 매도청산)가 나오면 계좌에 있는 모든 옵션을 청산하는 스팟식 부탁드립니다 var Start = 0; var BC; var BP; var Bcount1,Bcount2; var SC; var SP; var Scount1,Scount2; var upv = 1.0; var dnv = 0.1; function Main_OnStart() { Start = 0; Main.MessageList("시작",Start); Main.SetTimer(1, 5000); } function Chart1_OnRiseSignal(Signal) { //차트에서 매수신호 발생 if (Signal.signalKind == 1) { //1.0~2.0사이 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = 1; BC = CallOrderCode; Bcount1 = Math.floor(10/Option.GetAskByCode(BC,3)); BP = PutOrderCode; Bcount2 = Math.floor(10/Option.GetAskByCode(BP,3)); Account1.OrderBuy(BC,Signal.count,Option.GetAskByCode(BC,3),0); Account1.OrderBuy(BP,Signal.count,Option.GetAskByCode(BP,3),0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; Account1.OrderSell(BC,Signal.count,Option.GetBidByCode(BC,3),0); Account1.OrderSell(BP,Signal.count,Option.GetBidByCode(BP,3),0); } //차트에서 매도신호 발생 if (Signal.signalKind == 3) { //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = -1; SC = CallOrderCode; Scount1 = Math.floor(10/Option.GetBidByCode(SC,3)); SP = PutOrderCode; Scount1 = Math.floor(10/Option.GetBidByCode(SP,3)); Account1.OrderSell(SC,Signal.count,Option.GetBidByCode(SC,3),0); Account1.OrderSell(SP,Signal.count,Option.GetBidByCode(SP,3),0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; Account1.OrderBuy(SC,Signal.count,Option.GetAskByCode(SC,3),0); Account1.OrderBuy(SP,Signal.count,Option.GetAskByCode(SP,3),0); } } ---------------------------------------------------------------------------------------- var Start = 0; var BC; var BP; var Bcount; var SC; var SP; var Scount; var upv = 2.0; var dnv = 0.1; function Main_OnStart() { Start = 0; Main.MessageList("시작",Start); } function Chart1_OnRiseSignal(Signal) { //차트에서 매수신호 발생 if (Signal.signalKind == 1) { //1.0~2.0사이 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = 1; BC = CallOrderCode; BP = PutOrderCode; Bcount = Signal.count; var OP1 = Option1.GetCurrent(BC); if (Option.GetAskByCode(BC,1) > 0) OP1 = Option.GetAskByCode(BC,3); if (Option.GetAskByCode(BC,2) > 0) OP1 = Option.GetAskByCode(BC,3); if (Option.GetAskByCode(BC,3) > 0) OP1 = Option.GetAskByCode(BC,3); var OP2 = Option1.GetCurrent(BP); if (Option.GetAskByCode(BP,1) > 0) OP2 = Option.GetAskByCode(BP,3); if (Option.GetAskByCode(BP,2) > 0) OP2 = Option.GetAskByCode(BP,3); if (Option.GetAskByCode(BP,3) > 0) OP2 = Option.GetAskByCode(BP,3); Account1.OrderBuy(BC,Signal.count,OP1,0); Account1.OrderBuy(BP,Signal.count,OP2,0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; var OP1 = Option1.GetCurrent(BC); if (Option.GetBidByCode(BC,1) > 0) OP1 = Option.GetBidByCode(BC,3); if (Option.GetBidByCode(BC,2) > 0) OP1 = Option.GetBidByCode(BC,3); if (Option.GetBidByCode(BC,3) > 0) OP1 = Option.GetBidByCode(BC,3); var OP2 = Option1.GetCurrent(BP); if (Option.GetBidByCode(BP,1) > 0) OP2 = Option.GetBidByCode(BP,3); if (Option.GetBidByCode(BP,2) > 0) OP2 = Option.GetBidByCode(BP,3); if (Option.GetBidByCode(BP,3) > 0) OP2 = Option.GetBidByCode(BP,3); Account1.OrderSell(BC,Signal.count,OP1,0); Account1.OrderSell(BP,Signal.count,OP2,0); } //차트에서 매도신호 발생 if (Signal.signalKind == 3) { //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = -1; SC = CallOrderCode; SP = PutOrderCode; Scount = Signal.count; var OP1 = Option1.GetCurrent(SC); if (Option.GetAskByCode(SC,1) > 0) OP1 = Option.GetAskByCode(SC,3); if (Option.GetAskByCode(SC,2) > 0) OP1 = Option.GetAskByCode(SC,3); if (Option.GetAskByCode(SC,3) > 0) OP1 = Option.GetAskByCode(SC,3); var OP2 = Option1.GetCurrent(SP); if (Option.GetAskByCode(SP,1) > 0) OP2 = Option.GetAskByCode(SP,3); if (Option.GetAskByCode(SP,2) > 0) OP2 = Option.GetAskByCode(SP,3); if (Option.GetAskByCode(SP,3) > 0) OP2 = Option.GetAskByCode(SP,3); Account1.OrderSell(SC,Signal.count,OP1,0); Account1.OrderSell(SP,Signal.count,OP2,0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; var OP1 = Option1.GetCurrent(SC); if (Option.GetBidByCode(SC,1) > 0) OP1 = Option.GetBidByCode(SC,3); if (Option.GetBidByCode(SC,2) > 0) OP1 = Option.GetBidByCode(SC,3); if (Option.GetBidByCode(SC,3) > 0) OP1 = Option.GetBidByCode(SC,3); var OP2 = Option1.GetCurrent(SP); if (Option.GetBidByCode(SP,1) > 0) OP2 = Option.GetBidByCode(SP,3); if (Option.GetBidByCode(SP,2) > 0) OP2 = Option.GetBidByCode(SP,3); if (Option.GetBidByCode(SP,3) > 0) OP2 = Option.GetBidByCode(SP,3); Account1.OrderBuy(SC,Signal.count,OP1,0); Account1.OrderBuy(SP,Signal.count,OP2,0); } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2015-12-23 15:27:02

안녕하세요 예스스탁입니다. 1. 1번식과 2번식 실행해 봤지만 말씀하신 오류메세지가 나오지 않습니다. 2번식은 옵션객체명이 Option,Option1로 다른 객체이름으로 사용이 되어 있습니다. 모두 Option으로 수정해서 올려드립니다. var Start = 0; var BC; var BP; var Bcount; var SC; var SP; var Scount; var upv = 2.0; var dnv = 0.1; function Main_OnStart() { Start = 0; Main.MessageList("시작",Start); } function Chart1_OnRiseSignal(Signal) { //차트에서 매수신호 발생 if (Signal.signalKind == 1) { //1.0~2.0사이 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = 1; BC = CallOrderCode; BP = PutOrderCode; Bcount = Signal.count; var OP1 = Option.GetCurrent(BC); if (Option.GetAskByCode(BC,1) > 0) OP1 = Option.GetAskByCode(BC,3); if (Option.GetAskByCode(BC,2) > 0) OP1 = Option.GetAskByCode(BC,3); if (Option.GetAskByCode(BC,3) > 0) OP1 = Option.GetAskByCode(BC,3); var OP2 = Option.GetCurrent(BP); if (Option.GetAskByCode(BP,1) > 0) OP2 = Option.GetAskByCode(BP,3); if (Option.GetAskByCode(BP,2) > 0) OP2 = Option.GetAskByCode(BP,3); if (Option.GetAskByCode(BP,3) > 0) OP2 = Option.GetAskByCode(BP,3); Account1.OrderBuy(BC,Signal.count,OP1,0); Account1.OrderBuy(BP,Signal.count,OP2,0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; var OP1 = Option.GetCurrent(BC); if (Option.GetBidByCode(BC,1) > 0) OP1 = Option.GetBidByCode(BC,3); if (Option.GetBidByCode(BC,2) > 0) OP1 = Option.GetBidByCode(BC,3); if (Option.GetBidByCode(BC,3) > 0) OP1 = Option.GetBidByCode(BC,3); var OP2 = Option.GetCurrent(BP); if (Option.GetBidByCode(BP,1) > 0) OP2 = Option.GetBidByCode(BP,3); if (Option.GetBidByCode(BP,2) > 0) OP2 = Option.GetBidByCode(BP,3); if (Option.GetBidByCode(BP,3) > 0) OP2 = Option.GetBidByCode(BP,3); Account1.OrderSell(BC,Signal.count,OP1,0); Account1.OrderSell(BP,Signal.count,OP2,0); } //차트에서 매도신호 발생 if (Signal.signalKind == 3) { //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = -1; SC = CallOrderCode; SP = PutOrderCode; Scount = Signal.count; var OP1 = Option.GetCurrent(SC); if (Option.GetAskByCode(SC,1) > 0) OP1 = Option.GetAskByCode(SC,3); if (Option.GetAskByCode(SC,2) > 0) OP1 = Option.GetAskByCode(SC,3); if (Option.GetAskByCode(SC,3) > 0) OP1 = Option.GetAskByCode(SC,3); var OP2 = Option.GetCurrent(SP); if (Option.GetAskByCode(SP,1) > 0) OP2 = Option.GetAskByCode(SP,3); if (Option.GetAskByCode(SP,2) > 0) OP2 = Option.GetAskByCode(SP,3); if (Option.GetAskByCode(SP,3) > 0) OP2 = Option.GetAskByCode(SP,3); Account1.OrderSell(SC,Signal.count,OP1,0); Account1.OrderSell(SP,Signal.count,OP2,0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; var OP1 = Option.GetCurrent(SC); if (Option.GetBidByCode(SC,1) > 0) OP1 = Option.GetBidByCode(SC,3); if (Option.GetBidByCode(SC,2) > 0) OP1 = Option.GetBidByCode(SC,3); if (Option.GetBidByCode(SC,3) > 0) OP1 = Option.GetBidByCode(SC,3); var OP2 = Option.GetCurrent(SP); if (Option.GetBidByCode(SP,1) > 0) OP2 = Option.GetBidByCode(SP,3); if (Option.GetBidByCode(SP,2) > 0) OP2 = Option.GetBidByCode(SP,3); if (Option.GetBidByCode(SP,3) > 0) OP2 = Option.GetBidByCode(SP,3); Account1.OrderBuy(SC,Signal.count,OP1,0); Account1.OrderBuy(SP,Signal.count,OP2,0); } } 2. 차트에서 청산신호가 발생하면 계좌의 모든 옵션종목을 청산하는 내용입니다. 스크립트 객체화면 설정 차트객체추가 --> 속성에서 객체명은 Chart1, 차트아이디 연결 옵션객체추가 --> 속성에서 객체명은 Option, 옵션종류설정 계좌객체 추가 --> 속성에서 객체명은 Account1, 선옵계좌번호설정 function Main_OnStart() { Main.MessageList("시작",Start); } function Chart1_OnRiseSignal(Signal) { //exitlong발생 if (Signal.signalKind == 2) { Main.MessageList("매수청산신호발생"); var Bnum = Account1.GetTheNumberOfBalances(); 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.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option.GetAsk(Account1.Balance.code,5),0); if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Option.GetBid(Account1.Balance.code,5),0); } } } //exitshort발생 if (Signal.signalKind == 2) { Main.MessageList("매도청산신호발생"); var Bnum = Account1.GetTheNumberOfBalances(); 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.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option.GetAsk(Account1.Balance.code,5),0); if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,Option.GetBid(Account1.Balance.code,5),0); } } } } 즐거운 하루되세요 > 무명 님이 쓴 글입니다. > 제목 : 수식 수정 보완 부탁드립니다 > 1. 다음 2개의 스팟식이 있습니다 둘 다 스팟식을 실행하면 RangeError : Invalid array length라는 메세지가 뜨면서 안돼는데 스팟식 수정 보완 좀 부탁드립니다. 아래 2개의 스팟식은 차트에서 매수 신호가 나오면 양매수, 매도 신호가 나오면 양매도 하는 스팟식입니다. 2. 차트에서 청산신호(매수청산 혹은 매도청산)가 나오면 계좌에 있는 모든 옵션을 청산하는 스팟식 부탁드립니다 var Start = 0; var BC; var BP; var Bcount1,Bcount2; var SC; var SP; var Scount1,Scount2; var upv = 1.0; var dnv = 0.1; function Main_OnStart() { Start = 0; Main.MessageList("시작",Start); Main.SetTimer(1, 5000); } function Chart1_OnRiseSignal(Signal) { //차트에서 매수신호 발생 if (Signal.signalKind == 1) { //1.0~2.0사이 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = 1; BC = CallOrderCode; Bcount1 = Math.floor(10/Option.GetAskByCode(BC,3)); BP = PutOrderCode; Bcount2 = Math.floor(10/Option.GetAskByCode(BP,3)); Account1.OrderBuy(BC,Signal.count,Option.GetAskByCode(BC,3),0); Account1.OrderBuy(BP,Signal.count,Option.GetAskByCode(BP,3),0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; Account1.OrderSell(BC,Signal.count,Option.GetBidByCode(BC,3),0); Account1.OrderSell(BP,Signal.count,Option.GetBidByCode(BP,3),0); } //차트에서 매도신호 발생 if (Signal.signalKind == 3) { //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = -1; SC = CallOrderCode; Scount1 = Math.floor(10/Option.GetBidByCode(SC,3)); SP = PutOrderCode; Scount1 = Math.floor(10/Option.GetBidByCode(SP,3)); Account1.OrderSell(SC,Signal.count,Option.GetBidByCode(SC,3),0); Account1.OrderSell(SP,Signal.count,Option.GetBidByCode(SP,3),0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; Account1.OrderBuy(SC,Signal.count,Option.GetAskByCode(SC,3),0); Account1.OrderBuy(SP,Signal.count,Option.GetAskByCode(SP,3),0); } } ---------------------------------------------------------------------------------------- var Start = 0; var BC; var BP; var Bcount; var SC; var SP; var Scount; var upv = 2.0; var dnv = 0.1; function Main_OnStart() { Start = 0; Main.MessageList("시작",Start); } function Chart1_OnRiseSignal(Signal) { //차트에서 매수신호 발생 if (Signal.signalKind == 1) { //1.0~2.0사이 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = 1; BC = CallOrderCode; BP = PutOrderCode; Bcount = Signal.count; var OP1 = Option1.GetCurrent(BC); if (Option.GetAskByCode(BC,1) > 0) OP1 = Option.GetAskByCode(BC,3); if (Option.GetAskByCode(BC,2) > 0) OP1 = Option.GetAskByCode(BC,3); if (Option.GetAskByCode(BC,3) > 0) OP1 = Option.GetAskByCode(BC,3); var OP2 = Option1.GetCurrent(BP); if (Option.GetAskByCode(BP,1) > 0) OP2 = Option.GetAskByCode(BP,3); if (Option.GetAskByCode(BP,2) > 0) OP2 = Option.GetAskByCode(BP,3); if (Option.GetAskByCode(BP,3) > 0) OP2 = Option.GetAskByCode(BP,3); Account1.OrderBuy(BC,Signal.count,OP1,0); Account1.OrderBuy(BP,Signal.count,OP2,0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; var OP1 = Option1.GetCurrent(BC); if (Option.GetBidByCode(BC,1) > 0) OP1 = Option.GetBidByCode(BC,3); if (Option.GetBidByCode(BC,2) > 0) OP1 = Option.GetBidByCode(BC,3); if (Option.GetBidByCode(BC,3) > 0) OP1 = Option.GetBidByCode(BC,3); var OP2 = Option1.GetCurrent(BP); if (Option.GetBidByCode(BP,1) > 0) OP2 = Option.GetBidByCode(BP,3); if (Option.GetBidByCode(BP,2) > 0) OP2 = Option.GetBidByCode(BP,3); if (Option.GetBidByCode(BP,3) > 0) OP2 = Option.GetBidByCode(BP,3); Account1.OrderSell(BC,Signal.count,OP1,0); Account1.OrderSell(BP,Signal.count,OP2,0); } //차트에서 매도신호 발생 if (Signal.signalKind == 3) { //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.7~1.7 사이가 아니면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 0.7~1.7사이이면 if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; var CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; var PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } if (CC > 0 && PP > 0) { Start = -1; SC = CallOrderCode; SP = PutOrderCode; Scount = Signal.count; var OP1 = Option1.GetCurrent(SC); if (Option.GetAskByCode(SC,1) > 0) OP1 = Option.GetAskByCode(SC,3); if (Option.GetAskByCode(SC,2) > 0) OP1 = Option.GetAskByCode(SC,3); if (Option.GetAskByCode(SC,3) > 0) OP1 = Option.GetAskByCode(SC,3); var OP2 = Option1.GetCurrent(SP); if (Option.GetAskByCode(SP,1) > 0) OP2 = Option.GetAskByCode(SP,3); if (Option.GetAskByCode(SP,2) > 0) OP2 = Option.GetAskByCode(SP,3); if (Option.GetAskByCode(SP,3) > 0) OP2 = Option.GetAskByCode(SP,3); Account1.OrderSell(SC,Signal.count,OP1,0); Account1.OrderSell(SP,Signal.count,OP2,0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; var OP1 = Option1.GetCurrent(SC); if (Option.GetBidByCode(SC,1) > 0) OP1 = Option.GetBidByCode(SC,3); if (Option.GetBidByCode(SC,2) > 0) OP1 = Option.GetBidByCode(SC,3); if (Option.GetBidByCode(SC,3) > 0) OP1 = Option.GetBidByCode(SC,3); var OP2 = Option1.GetCurrent(SP); if (Option.GetBidByCode(SP,1) > 0) OP2 = Option.GetBidByCode(SP,3); if (Option.GetBidByCode(SP,2) > 0) OP2 = Option.GetBidByCode(SP,3); if (Option.GetBidByCode(SP,3) > 0) OP2 = Option.GetBidByCode(SP,3); Account1.OrderBuy(SC,Signal.count,OP1,0); Account1.OrderBuy(SP,Signal.count,OP2,0); } }