커뮤니티

프로그램 검토요청

프로필 이미지
왼손잡이
2015-07-28 12:06:00
1874
글번호 223591
답변완료
수고하십니다. 선물챠트에서 나오는 신호를 가지고 옵션매매하는 프로그램인데요.. 진입신호는 나오나 청산신호가 나오지 않습니다. 초짜인 제가 보기엔 프로그램은 문제없어 보이는데요 ^^ 확인좀 부탁드리겠습니다. ------------------------------------------------------------------------ var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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] } } //종목을 찾았으면 if (CC < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 10000);//1번타이머 10초 } } } if (T == 1 && Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); T = 0; } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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 (PP < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 10000);//2번타이머 10초 } } } if (T == -1 && Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); //PutOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); T = 0; } } } function Main_OnTimer(nEventID) { //1번 타이머 동작 T가 1일이면(Buy신호 이후) if (nEventID == 1 && T == 1) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수 "); //1번 타이머종료 Main.KillTimer(1); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); } } } //2번 타이머 동작하고 T가 -1이면(Sell신호 이후) if (nEventID == 2 && T == -1) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도 "); //2번 타이머종료 Main.KillTimer(2); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2015-07-28 17:26:33

안녕하세요 예스스탁입니다. 현재 해당 수식에서 청산신호가 발생하면 잔고를 체크해서 수량이 있을때만 주문이 집행되게 되어 있습니다. 식상으로 보아 잔고체크하는 부분을 제외하고는 진입후 청산신호 발생할때 주문을 막는 부분은 없습니다. 하이투자증권의 모의투자는 선물만 가능합니다. 해당 식을 예스트레이더 모의투자에 적용하시면 잔고에 수량이 없어 청산신호시 주문이 나갈수 없습니다. NH트레이더에는 옵션종목도 모의투자 가능합니다. NH트레이더 모의투자에서 적용해 보시면 정상적으로 신호와 주문나오는 것을 확인하실수 있습니다. 즐거운 하루되세요 > 왼손잡이 님이 쓴 글입니다. > 제목 : 프로그램 검토요청 > 수고하십니다. 선물챠트에서 나오는 신호를 가지고 옵션매매하는 프로그램인데요.. 진입신호는 나오나 청산신호가 나오지 않습니다. 초짜인 제가 보기엔 프로그램은 문제없어 보이는데요 ^^ 확인좀 부탁드리겠습니다. ------------------------------------------------------------------------ var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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] } } //종목을 찾았으면 if (CC < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 10000);//1번타이머 10초 } } } if (T == 1 && Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); T = 0; } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 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 (PP < 99999999) { //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 10000);//2번타이머 10초 } } } if (T == -1 && Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); //PutOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); T = 0; } } } function Main_OnTimer(nEventID) { //1번 타이머 동작 T가 1일이면(Buy신호 이후) if (nEventID == 1 && T == 1) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수 "); //1번 타이머종료 Main.KillTimer(1); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 CallOrderCode종목 매수주문 if (Qty >= 1) { Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); } } } //2번 타이머 동작하고 T가 -1이면(Sell신호 이후) if (nEventID == 2 && T == -1) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 20% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도 "); //2번 타이머종료 Main.KillTimer(2); //주문가능현금의 10% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 if (Qty >= 1) { Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); } } } }