커뮤니티

문의드립니다.

프로필 이미지
왼손잡이
2015-08-04 09:27:04
1890
글번호 223599
답변완료

첨부 이미지

수고하십니다. 프로그램 검토좀 부탁드리겠습니다. 아래 프로그램 내용중 추가매수하는 부분인데요... //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) Main.MessageList("추가 매수_01 "); if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) Main.MessageList("추가 매수_02 "); 로 했는데 테스트를 해보니 궁금한점이 있습니다. 1. 추가매수_01 과 추가매수_02 가 동시에 진입이 됩니다. 이또한 잔고에서 반영이 안되어 그런것인지요? 2. 평단가에 40% 이상이면 추가 매수_01 로 설정해 놓았는데 설절이 잘못된것같습니다. 40% 이전에 추가매수_01 이 실행되네요.. 3. 첫 매수후 Main.SetTimer(1, 2000);//1번타이머 2초 를 돌리는데요 이부분이 매수가 안되면 2초마다 다시 매수주문을 내는것인지요? 추가 매수 & 추가 매도 & 청산 부분도 결제가 안되는 상황을 대비해 Main.SetTimer(1, 2000) 를 돌려줘야 하는지요? 그럼 좋은 답변 부탁드리겠습니다. ================================================================================================================= //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //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); } } } }
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2015-08-07 13:45:02

안녕하세요 예스스탁입니다. 1.2 잔고가 없으면 Account1.Balance.avgUnitCost가 0입니다. 아래 2개의 조건문이 동시충족됩니다. if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) 3 1번과 2번 타이머는추가매수를 위해 2초 간격으로 동작하게 설정한 타이머입니다. 현재 식에서는 40% 조건이 만족하면 타이머가 종료가 됩니다. 그러므로 80%는 동작하지 않습니다. 잔고없이 테스트를 할때는 Account1.Balance.avgUnitCost값이 0이므로 동시에 만족해서 같이 출력된것일 뿐입니다. 2회에 나누어서 추가하시므로 타이머를 2회차에서만 킬되게 하셔야 합니다. 4. 아래 수정한 식입니다. 매수진입신호가 발생하면 T는 1, T가 1인상태에서 1차 추가진입 조건만족하면 T는 2 T가 2인 상태에서 2차 추자진입 조건만족하면 T는 3으로 변경되서 매수신호이후에 각 추가진입을 1회로 제한했습니다 타이머는 2차까지 가거나 청산신호가 발생하거나 반대진입이 발생하면 종료되게 했습니다 //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.KillTimer(2); 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Main.KillTimer(1); Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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.KillTimer(1); 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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Main.KillTimer(2); Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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 ) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == 1 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //T가 1이 된 이후 1번만 동작하도록 조건만족시 2로 변경 T = 2; //주문가능현금의 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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (T == 2 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //T가 2가 된 이후 1번만 동작하도록 조건만족시 3로 변경 T = 3; //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 ) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == -1 && Account1.Balance.position == 1 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //T가 -1이 된 이후 1번만 동작하도록 조건만족시 -2로 변경 T = -1; //주문가능현금의 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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //T가 -2가 된 이후 1번만 동작하도록 조건만족시 -3로 변경 T = -3; //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); } } } } 즐거운 하루되세요 > 왼손잡이 님이 쓴 글입니다. > 제목 : 문의드립니다. > 수고하십니다. 프로그램 검토좀 부탁드리겠습니다. 아래 프로그램 내용중 추가매수하는 부분인데요... //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) Main.MessageList("추가 매수_01 "); if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) Main.MessageList("추가 매수_02 "); 로 했는데 테스트를 해보니 궁금한점이 있습니다. 1. 추가매수_01 과 추가매수_02 가 동시에 진입이 됩니다. 이또한 잔고에서 반영이 안되어 그런것인지요? 2. 평단가에 40% 이상이면 추가 매수_01 로 설정해 놓았는데 설절이 잘못된것같습니다. 40% 이전에 추가매수_01 이 실행되네요.. 3. 첫 매수후 Main.SetTimer(1, 2000);//1번타이머 2초 를 돌리는데요 이부분이 매수가 안되면 2초마다 다시 매수주문을 내는것인지요? 추가 매수 & 추가 매도 & 청산 부분도 결제가 안되는 상황을 대비해 Main.SetTimer(1, 2000) 를 돌려줘야 하는지요? 그럼 좋은 답변 부탁드리겠습니다. ================================================================================================================= //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //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); } } } }
프로필 이미지

왼손잡이

2015-08-10 10:35:46

답변감사드립니다. 해당프로그램은 지정가로 셋팅된거 같은데요. 진입신호는 나왔지만 진입을 못하는경우가 생기는것 같습니다. 진입을 못하였을경우 2초뒤에 가격조정을 해서 재 진입은 안하는것이지요? 진입및 청산을 시장가로 부탁드리겠습니다. 그럼 수고하십시요 > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 문의드립니다. > 안녕하세요 예스스탁입니다. 1.2 잔고가 없으면 Account1.Balance.avgUnitCost가 0입니다. 아래 2개의 조건문이 동시충족됩니다. if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) 3 1번과 2번 타이머는추가매수를 위해 2초 간격으로 동작하게 설정한 타이머입니다. 현재 식에서는 40% 조건이 만족하면 타이머가 종료가 됩니다. 그러므로 80%는 동작하지 않습니다. 잔고없이 테스트를 할때는 Account1.Balance.avgUnitCost값이 0이므로 동시에 만족해서 같이 출력된것일 뿐입니다. 2회에 나누어서 추가하시므로 타이머를 2회차에서만 킬되게 하셔야 합니다. 4. 아래 수정한 식입니다. 매수진입신호가 발생하면 T는 1, T가 1인상태에서 1차 추가진입 조건만족하면 T는 2 T가 2인 상태에서 2차 추자진입 조건만족하면 T는 3으로 변경되서 매수신호이후에 각 추가진입을 1회로 제한했습니다 타이머는 2차까지 가거나 청산신호가 발생하거나 반대진입이 발생하면 종료되게 했습니다 //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.KillTimer(2); 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Main.KillTimer(1); Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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.KillTimer(1); 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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Main.KillTimer(2); Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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 ) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == 1 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //T가 1이 된 이후 1번만 동작하도록 조건만족시 2로 변경 T = 2; //주문가능현금의 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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (T == 2 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //T가 2가 된 이후 1번만 동작하도록 조건만족시 3로 변경 T = 3; //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 ) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == -1 && Account1.Balance.position == 1 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //T가 -1이 된 이후 1번만 동작하도록 조건만족시 -2로 변경 T = -1; //주문가능현금의 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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //T가 -2가 된 이후 1번만 동작하도록 조건만족시 -3로 변경 T = -3; //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); } } } } 즐거운 하루되세요 > 왼손잡이 님이 쓴 글입니다. > 제목 : 문의드립니다. > 수고하십니다. 프로그램 검토좀 부탁드리겠습니다. 아래 프로그램 내용중 추가매수하는 부분인데요... //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) Main.MessageList("추가 매수_01 "); if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) Main.MessageList("추가 매수_02 "); 로 했는데 테스트를 해보니 궁금한점이 있습니다. 1. 추가매수_01 과 추가매수_02 가 동시에 진입이 됩니다. 이또한 잔고에서 반영이 안되어 그런것인지요? 2. 평단가에 40% 이상이면 추가 매수_01 로 설정해 놓았는데 설절이 잘못된것같습니다. 40% 이전에 추가매수_01 이 실행되네요.. 3. 첫 매수후 Main.SetTimer(1, 2000);//1번타이머 2초 를 돌리는데요 이부분이 매수가 안되면 2초마다 다시 매수주문을 내는것인지요? 추가 매수 & 추가 매도 & 청산 부분도 결제가 안되는 상황을 대비해 Main.SetTimer(1, 2000) 를 돌려줘야 하는지요? 그럼 좋은 답변 부탁드리겠습니다. ================================================================================================================= //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //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); } } } }
프로필 이미지

예스스탁 예스스탁 답변

2015-08-11 16:03:33

안녕하세요 예스스탁입니다. 해당식은 지정한 조건이 만족하면 1회만 동작해서 주문을 내게 됩니다. 체결되지 않은 부분에 대해서는 기준을 마련해서 추가하셔야 합니다. 시장가로 수정해서 올려드립니다. //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.KillTimer(2); 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Main.KillTimer(1); Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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.KillTimer(1); 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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Main.KillTimer(2); Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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 ) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == 1 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //T가 1이 된 이후 1번만 동작하도록 조건만족시 2로 변경 T = 2; //주문가능현금의 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, 0, 1); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (T == 2 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //T가 2가 된 이후 1번만 동작하도록 조건만족시 3로 변경 T = 3; //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, 0, 1); } } } //2번 타이머 동작하고 T가 -1이면(Sell신호 이후) if (nEventID == 2 ) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == -1 && Account1.Balance.position == 1 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //T가 -1이 된 이후 1번만 동작하도록 조건만족시 -2로 변경 T = -1; //주문가능현금의 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, 0, 1); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (T == -2 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //T가 -2가 된 이후 1번만 동작하도록 조건만족시 -3로 변경 T = -3; //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, 0, 1); } } } } 즐거운 하루되세요 > 왼손잡이 님이 쓴 글입니다. > 제목 : Re : Re : 문의드립니다. > 답변감사드립니다. 해당프로그램은 지정가로 셋팅된거 같은데요. 진입신호는 나왔지만 진입을 못하는경우가 생기는것 같습니다. 진입을 못하였을경우 2초뒤에 가격조정을 해서 재 진입은 안하는것이지요? 진입및 청산을 시장가로 부탁드리겠습니다. 그럼 수고하십시요 > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 문의드립니다. > 안녕하세요 예스스탁입니다. 1.2 잔고가 없으면 Account1.Balance.avgUnitCost가 0입니다. 아래 2개의 조건문이 동시충족됩니다. if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) 3 1번과 2번 타이머는추가매수를 위해 2초 간격으로 동작하게 설정한 타이머입니다. 현재 식에서는 40% 조건이 만족하면 타이머가 종료가 됩니다. 그러므로 80%는 동작하지 않습니다. 잔고없이 테스트를 할때는 Account1.Balance.avgUnitCost값이 0이므로 동시에 만족해서 같이 출력된것일 뿐입니다. 2회에 나누어서 추가하시므로 타이머를 2회차에서만 킬되게 하셔야 합니다. 4. 아래 수정한 식입니다. 매수진입신호가 발생하면 T는 1, T가 1인상태에서 1차 추가진입 조건만족하면 T는 2 T가 2인 상태에서 2차 추자진입 조건만족하면 T는 3으로 변경되서 매수신호이후에 각 추가진입을 1회로 제한했습니다 타이머는 2차까지 가거나 청산신호가 발생하거나 반대진입이 발생하면 종료되게 했습니다 //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) var CallOrderCode,PutOrderCode,T; function Main_OnStart() { T = 0; } function Chart1_OnRiseSignal(Signal) { if (T <= 0 && Signal.signalKind == 1) { Main.KillTimer(2); 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Main.KillTimer(1); Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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.KillTimer(1); 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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Main.KillTimer(2); Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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 ) { //CallOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(CallOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == 1 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //T가 1이 된 이후 1번만 동작하도록 조건만족시 2로 변경 T = 2; //주문가능현금의 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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (T == 2 && Account1.Balance.position == 2 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //T가 2가 된 이후 1번만 동작하도록 조건만족시 3로 변경 T = 3; //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 ) { //PutOrderCode 종목 잔고 셋팅해서 Account1.SetBalanceItem(PutOrderCode, 0); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (T == -1 && Account1.Balance.position == 1 && Account1.Balance.count >= 1 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //T가 -1이 된 이후 1번만 동작하도록 조건만족시 -2로 변경 T = -1; //주문가능현금의 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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //T가 -2가 된 이후 1번만 동작하도록 조건만족시 -3로 변경 T = -3; //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); } } } } 즐거운 하루되세요 > 왼손잡이 님이 쓴 글입니다. > 제목 : 문의드립니다. > 수고하십니다. 프로그램 검토좀 부탁드리겠습니다. 아래 프로그램 내용중 추가매수하는 부분인데요... //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) Main.MessageList("추가 매수_01 "); if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) Main.MessageList("추가 매수_02 "); 로 했는데 테스트를 해보니 궁금한점이 있습니다. 1. 추가매수_01 과 추가매수_02 가 동시에 진입이 됩니다. 이또한 잔고에서 반영이 안되어 그런것인지요? 2. 평단가에 40% 이상이면 추가 매수_01 로 설정해 놓았는데 설절이 잘못된것같습니다. 40% 이전에 추가매수_01 이 실행되네요.. 3. 첫 매수후 Main.SetTimer(1, 2000);//1번타이머 2초 를 돌리는데요 이부분이 매수가 안되면 2초마다 다시 매수주문을 내는것인지요? 추가 매수 & 추가 매도 & 청산 부분도 결제가 안되는 상황을 대비해 Main.SetTimer(1, 2000) 를 돌려줘야 하는지요? 그럼 좋은 답변 부탁드리겠습니다. ================================================================================================================= //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) 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) { Main.MessageList("첫 매수"); Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 } } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(CallOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매수 청산"); //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) { Main.MessageList("첫 매도"); Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 } } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(PutOrderCode, 0); Main.MessageList("--------------------------------------------"); Main.MessageList("매도 청산"); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매수_02 "); //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); //잔고의 현재가가 평단가의 40% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.40) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_01 "); //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); } } //잔고의 현재가가 평단가의 80% 이상이면 추가매수 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.80) { Main.MessageList("--------------------------------------------"); Main.MessageList("추가 매도_02 "); //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); } } } }