커뮤니티

수식 문의 드립니다

프로필 이미지
무명
2015-10-16 15:09:56
2096
글번호 223691
답변완료
1. 계좌에 잔고가 있으면 15시 4분이나 15분 6분에(현재가의 선물은 3% 옵션은 30% +(매도청산) 혹은 -(매수청산)가격으로)청산되는 스팟식 부탁드립니다.정규선물옵션과 미니선물옵션 한꺼번에 가능하면 스팟식 하나로..아니면 분리해서 부탁드려요^^ 2. 아래 스팟식을 차트에서 나오는 진입 수량으로 진입되도록 수정 부탁드립니다.예스차트에서 피라미딩 진입하는데... 차트 진입수량만큼 피라미딩 진입하고.. 청산도 차트 청산수량만큼(피라미딩포함) 되는지요? function Main_OnStart() { Main.MessageList("시작"); T = 0; } function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { T = 1; Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); } if (T == 1 && Signal.signalKind == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } if (Signal.signalKind == 3) { T = -1; Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } if (T == -1 && Signal.signalKind == 4) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); } } 3 아래 로직에서 주문호가가 없을때 오류가 나지 않도록 진입 청산 부분 수정 부탁드립니다.. 그리고 진입했던 종목이 청산되는지 확인부탁드리고,, 아니면 진입했던 종목이 청산되도록 수정부탁드립니다. 차트 진입수량만큼 피라미딩 진입하고.. 청산도 차트 청산수량만큼(피라미딩포함) 되는지요? var Start = 0; var BC; var BP; var Bcount; var SC; var SP; var Scount; var upv = 1.7; var dnv = 0.7; 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; Account1.OrderBuy(BC,Bcount,Option.GetAskByCode(BC,3),0); Account1.OrderBuy(BP,Bcount,Option.GetAskByCode(BP,3),0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; Account1.OrderSell(BC,Bcount,Option.GetBidByCode(BC,3),0); Account1.OrderSell(BP,Bcount,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; SP = PutOrderCode; Scount = Signal.count; Account1.OrderSell(SC,Scount,Option.GetBidByCode(SC,3),0); Account1.OrderSell(SP,Scount,Option.GetBidByCode(SP,3),0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; Account1.OrderBuy(SC,Scount,Option.GetAskByCode(SC,3),0); Account1.OrderBuy(SP,Scount,Option.GetAskByCode(SP,3),0); } }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2015-10-27 18:11:56

안녕하세요 예스스탁입니다. 1. 내용을 정확히 이해하지 못했습니다. 3%, 30%가 어떤 의미이신지 좀더 자세한 내용 올려주시기 바랍니다. 혹은 시간되실때 전화주시기 바랍니다. 02-3453-1060 2. 신호수량으로 주문발생하게 수정했습니다. 청산도 신호수량만큼만 발생합니다. function Main_OnStart() { Main.MessageList("시작"); T = 0; } function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { T = 1; Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.Ask(5), 0); } if (T == 1 && Signal.signalKind == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.Bid(5), 0); } if (Signal.signalKind == 3) { T = -1; Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.Bid(5), 0); } if (T == -1 && Signal.signalKind == 4) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Signal.count,MarketData1.Ask(5), 0); } } 3. 주문호가가 없을때 그아래단계호가로 주문되게 수정했습니다. 계속 호가가 없으면 현재가로 주문집행됩니다. 해당식 차트의 수량만큼만 주문되게 되어 있고 청산시 진입신호에서 나온 종목으로 청산됩니다. var Start = 0; var BC; var BP; var Bcount; var SC; var SP; var Scount; var upv = 1.7; var dnv = 0.7; 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,Bcount,OP1,0); Account1.OrderBuy(BP,Bcount,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,Bcount,OP1,0); Account1.OrderSell(BP,Bcount,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.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.OrderSell(SC,Scount,OP1,0); Account1.OrderSell(SP,Scount,OP2,0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; 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.OrderBuy(SC,Scount,OP1,0); Account1.OrderBuy(SP,Scount,OP2,0); } } 즐거운 하루되세요 > 무명 님이 쓴 글입니다. > 제목 : 수식 문의 드립니다 > 1. 계좌에 잔고가 있으면 15시 4분이나 15분 6분에(현재가의 선물은 3% 옵션은 30% +(매도청산) 혹은 -(매수청산)가격으로)청산되는 스팟식 부탁드립니다.정규선물옵션과 미니선물옵션 한꺼번에 가능하면 스팟식 하나로..아니면 분리해서 부탁드려요^^ 2. 아래 스팟식을 차트에서 나오는 진입 수량으로 진입되도록 수정 부탁드립니다.예스차트에서 피라미딩 진입하는데... 차트 진입수량만큼 피라미딩 진입하고.. 청산도 차트 청산수량만큼(피라미딩포함) 되는지요? function Main_OnStart() { Main.MessageList("시작"); T = 0; } function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { T = 1; Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); } if (T == 1 && Signal.signalKind == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } if (Signal.signalKind == 3) { T = -1; Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0); } if (T == -1 && Signal.signalKind == 4) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0); } } 3 아래 로직에서 주문호가가 없을때 오류가 나지 않도록 진입 청산 부분 수정 부탁드립니다.. 그리고 진입했던 종목이 청산되는지 확인부탁드리고,, 아니면 진입했던 종목이 청산되도록 수정부탁드립니다. 차트 진입수량만큼 피라미딩 진입하고.. 청산도 차트 청산수량만큼(피라미딩포함) 되는지요? var Start = 0; var BC; var BP; var Bcount; var SC; var SP; var Scount; var upv = 1.7; var dnv = 0.7; 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; Account1.OrderBuy(BC,Bcount,Option.GetAskByCode(BC,3),0); Account1.OrderBuy(BP,Bcount,Option.GetAskByCode(BP,3),0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; Account1.OrderSell(BC,Bcount,Option.GetBidByCode(BC,3),0); Account1.OrderSell(BP,Bcount,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; SP = PutOrderCode; Scount = Signal.count; Account1.OrderSell(SC,Scount,Option.GetBidByCode(SC,3),0); Account1.OrderSell(SP,Scount,Option.GetBidByCode(SP,3),0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; Account1.OrderBuy(SC,Scount,Option.GetAskByCode(SC,3),0); Account1.OrderBuy(SP,Scount,Option.GetAskByCode(SP,3),0); } }
프로필 이미지

무명

2015-11-03 19:48:23

다음 수식은 선물신호에 따라 옵션으로 레이쇼를 들어가게 했습니다. 특정포인트 근접 옵션 매수1 + 1외가 매도3 이게 맞게 되어있는지요? 확인 좀 부탁드립니다. var Start = 0; var C1; var C2; var Pcount; var P1; var P2; var Ccount; var upv = 2.0; var dnv = 0.1; function Main_OnStart() { Start = 0; Main.MessageList("시작",Start); } function Chart1_OnRiseSignal(Signal) { //차트에서 매수신호 발생 if (Signal.signalKind == 1) { //0.1~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; P1 = Option.GetATMPutRecent(PutOrderCode,0); P2 = Option.GetATMPutRecent(PutOrderCode+1,0); Pcount = Signal.count; var OP1 = Option.GetCurrent(P1); if (Option.GetAskByCode(P1,1) > 0) OP1 = Option.GetAskByCode(P1,3); if (Option.GetAskByCode(P1,2) > 0) OP1 = Option.GetAskByCode(P1,3); if (Option.GetAskByCode(P1,3) > 0) OP1 = Option.GetAskByCode(P1,3); var OP2 = Option.GetCurrent(P2); if (Option.GetBidByCode(P2,1) > 0) OP2 = Option.GetBidByCode(P2,3); if (Option.GetBidByCode(P2,2) > 0) OP2 = Option.GetBidByCode(P2,3); if (Option.GetBidByCode(P2,3) > 0) OP2 = Option.GetBidByCode(P2,3); Account1.OrderBuy(P1,Pcount,OP1,0); Account1.OrderSell(P2,Pcount*3,OP2,0); } } //차트에서 매수청산신호 발생 if (Start == 1 && Signal.signalKind == 2) { Start = 0; var OP1 = Option.GetCurrent(P1); if (Option.GetBidByCode(P1,1) > 0) OP1 = Option.GetBidByCode(P1,3); if (Option.GetBidByCode(P1,2) > 0) OP1 = Option.GetBidByCode(P1,3); if (Option.GetBidByCode(P1,3) > 0) OP1 = Option.GetBidByCode(P1,3); var OP2 = Option.GetCurrent(P2); if (Option.GetAskByCode(P2,1) > 0) OP2 = Option.GetAskByCode(P2,3); if (Option.GetAskByCode(P2,2) > 0) OP2 = Option.GetAskByCode(P2,3); if (Option.GetAskByCode(P2,3) > 0) OP2 = Option.GetAskByCode(P2,3); Account1.OrderSell(P1,Pcount,OP1,0); Account1.OrderBuy(P2,Pcount*3,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; C1 = Option.GetATMCallRecent(CallOrderCode,0); C2 = Option.GetATMCallRecent(CallOrderCode+1,0); Ccount = Signal.count; var OP1 = Option.GetCurrent(C1); if (Option.GetAskByCode(C1,1) > 0) OP1 = Option.GetAskByCode(C1,3); if (Option.GetAskByCode(C1,2) > 0) OP1 = Option.GetAskByCode(SC,3); if (Option.GetAskByCode(C1,3) > 0) OP1 = Option.GetAskByCode(C1,3); var OP2 = Option.GetCurrent(C2); if (Option.GetBidByCode(C2,1) > 0) OP2 = Option.GetBidByCode(C2,3); if (Option.GetBidByCode(C2,2) > 0) OP2 = Option.GetBidByCode(C2,3); if (Option.GetBidByCode(C2,3) > 0) OP2 = Option.GetBidByCode(C2,3); Account1.OrderBuy(C1,Ccount,OP1,0); Account1.OrderSell(C2,Ccount*3,OP2,0); } } //차트에서 매도청산신호 발생 if (Start == -1 && Signal.signalKind == 4) { Start = 0; var OP1 = Option.GetCurrent(C1); if (Option.GetBidByCode(C1,1) > 0) OP1 = Option.GetBidByCode(C1,3); if (Option.GetBidByCode(C1,2) > 0) OP1 = Option.GetBidByCode(SC,3); if (Option.GetBidByCode(C1,3) > 0) OP1 = Option.GetBidByCode(C1,3); var OP2 = Option.GetCurrent(C2); if (Option.GetAskByCode(C2,1) > 0) OP2 = Option.GetAskByCode(C2,3); if (Option.GetAskByCode(C2,2) > 0) OP2 = Option.GetAskByCode(C2,3); if (Option.GetAskByCode(C2,3) > 0) OP2 = Option.GetAskByCode(C2,3); Account1.OrderSell(C1,Ccount,OP1,0); Account1.OrderBuy(C2,Ccount*3,OP2,0); } }