커뮤니티

문의 드립니다.

프로필 이미지
왼손잡이
2015-08-05 10:13:14
2043
글번호 223602
답변완료
수고하십니다. 프로그램 검토 요청드립니다. 선물 신호 발생시 옵션 매도하는 프로그램인데요.(옵션매수하는 부분을 수정해보았습니다.) 수량은 2개로 고정해놓았습니다. 1. 미진입 또는 미청산시 2초뒤에 재 실행하고 싶습니다. 2. 테스트를 해보니 4.0대의 종목으로 진입이 되는되 왜그런지 궁금합니다. 3. 기타 프로그램 검토 부탁드리겠습니다. 그럼 더운 날씨에 수고하십시요! ============================================================================================= //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 PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); //풋 옵션중 2.0에 가장 가까운 종목 매도 //풋 옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 for (var i = -LNum; i <= UNum; i++) { PutPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); PutCode[i+LNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; PutOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (PutPrice[i+LNum] < CC) { CC = PutPrice[i+LNum]; PutOrderCode = PutCode[i+LNum] } } //종목을 찾았으면 if (CC < 99999999) { //주문가능현금의 5% //var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 PutOrderCode종목 매도 주문 //if (Qty >= 1) //{ Account1.OrderSell(PutOrderCode, 2, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 //} } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(PutOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("풋 매도 청산"); Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); T = 0; } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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 = -UNum; i <= LNum; i++) { CallPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); CallCode[i+UNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; CallOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (CallPrice[i+UNum] < PP) { PP = CallPrice[i+UNum]; CallOrderCode = CallCode[i+UNum]; } } //종목을 찾았으면 if (PP < 99999999) { //주문가능현금의 5% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 //if (Qty >= 1) //{ Account1.OrderSell(CallOrderCode, 2, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 //} } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("콜 매도 청산"); T = 0; } } }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2015-08-11 17:30:20

안녕하세요 예스스탁입니다. 각 함수중에는 콜과 풋일때 지정해야 하는 매개변수가 다른 함수가 있습니다. 해당 부분이 잘못 지정된 부분이 있습니다. 아래 풋과 콜 2.0에 가장 가까운 종목 찾는 식입니다. 참고하시기 바랍니다. 풋종목을 고를때 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] } } 콜종목을 고를때 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]; } } 아래 수정한 식입니다. Buy신호 발생하면 2.0에 가장 가까운 풋종목을 매도3호가로 매도주문하고 2초후에 미체결이면 매수5호가로 정정하고 Exitlong신호 발생하면 풋매도한 종목을 매수3호가로 청산(매수주문)하고 2초후에 미체결이면 매도5호가로 정정합니다. Sell신호 발생하면 2.0에 가장 가까운 콜종목을 매도3호가로 매도주문하고 2초후에 미체결이면 매수5호가로 정정하고 Exitshort신호 발생하면 콜매도한 종목을 매수3호가로 청산(매수주문)하고 2초후에 미체결이면 매도5호가로 정정합니다. //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) var CallOrderCode,PutOrderCode,T; var PID,CID,PXID,CXID; var Pnum,Cnum,PXnum,CXnum; 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 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) { //주문가능현금의 5% //var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 PutOrderCode종목 매도 주문 //if (Qty >= 1) //{ PID = Account1.OrderSell(PutOrderCode, 2, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 //} } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(PutOrderCode, 0); //CallOrderCode 잔고가 있으면 매도3호가로 전량 청산(매수주문) if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("풋 매도 청산"); SXID = Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); T = 0; Main.SetTimer(2, 2000);//2번타이머 2초 } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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) { //주문가능현금의 5% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상매도주문 //if (Qty >= 1) //{ CID = Account1.OrderSell(CallOrderCode, 2, OrderPrice, 0); T = -1; Main.SetTimer(3, 2000);//3번타이머 2초 //} } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { CXID = Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("콜 매도 청산"); T = 0; Main.SetTimer(4, 2000);//1번타이머 2초 } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == PID) { Pnum = OrderResponse.orderID; } if (OrderResponse.orderID == PXID) { PXnum = OrderResponse.orderID; } if (OrderResponse.orderID == CID) { Cnum = OrderResponse.orderID; } if (OrderResponse.orderID == CXID) { CXnum = OrderResponse.orderID; } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1) Account1.SetUnfillOrderNumber(Pnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(Pnum,Option.GetBid(Account1.Unfill.code, 5)); } if (nEventID == 2) { Main.KillTimer(2) Account1.SetUnfillOrderNumber(PXnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(PXnum,Option.GetAsk(Account1.Unfill.code, 5)); } if (nEventID == 3) { Main.KillTimer(3) Account1.SetUnfillOrderNumber(Xnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(Xnum,Option.GetBid(Account1.Unfill.code, 5)); } if (nEventID == 4) { Main.KillTimer(4) Account1.SetUnfillOrderNumber(XXnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(XXnum,Option.GetAsk(Account1.Unfill.code, 5)); } } 즐거운 하루되세요 > 왼손잡이 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 수고하십니다. 프로그램 검토 요청드립니다. 선물 신호 발생시 옵션 매도하는 프로그램인데요.(옵션매수하는 부분을 수정해보았습니다.) 수량은 2개로 고정해놓았습니다. 1. 미진입 또는 미청산시 2초뒤에 재 실행하고 싶습니다. 2. 테스트를 해보니 4.0대의 종목으로 진입이 되는되 왜그런지 궁금합니다. 3. 기타 프로그램 검토 부탁드리겠습니다. 그럼 더운 날씨에 수고하십시요! ============================================================================================= //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 PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); //풋 옵션중 2.0에 가장 가까운 종목 매도 //풋 옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 for (var i = -LNum; i <= UNum; i++) { PutPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); PutCode[i+LNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; PutOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (PutPrice[i+LNum] < CC) { CC = PutPrice[i+LNum]; PutOrderCode = PutCode[i+LNum] } } //종목을 찾았으면 if (CC < 99999999) { //주문가능현금의 5% //var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 PutOrderCode종목 매도 주문 //if (Qty >= 1) //{ Account1.OrderSell(PutOrderCode, 2, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 //} } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(PutOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("풋 매도 청산"); Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); T = 0; } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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 = -UNum; i <= LNum; i++) { CallPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); CallCode[i+UNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; CallOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (CallPrice[i+UNum] < PP) { PP = CallPrice[i+UNum]; CallOrderCode = CallCode[i+UNum]; } } //종목을 찾았으면 if (PP < 99999999) { //주문가능현금의 5% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 //if (Qty >= 1) //{ Account1.OrderSell(CallOrderCode, 2, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 //} } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("콜 매도 청산"); T = 0; } } }
프로필 이미지

왼손잡이

2015-08-13 13:54:01

수고하십니다. ------------------------------------------------------------------------------------ 아래 수정한 식입니다. Buy신호 발생하면 2.0에 가장 가까운 풋종목을 매도3호가로 매도주문하고 2초후에 미체결이면 매수5호가로 정정하고 ------------------------------------------------------------------------------------ 이부분이 궁금한데요. 매도3호가로 매도 주문내서 미체결이면 매도 5호가로 주문이 되어야 풋매도가 되는건 아닌지요? 제가 잘못이해한것이 맞지요 ? ^^ 그럼 답변 부탁드리겠습니다. > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 문의 드립니다. > 안녕하세요 예스스탁입니다. 각 함수중에는 콜과 풋일때 지정해야 하는 매개변수가 다른 함수가 있습니다. 해당 부분이 잘못 지정된 부분이 있습니다. 아래 풋과 콜 2.0에 가장 가까운 종목 찾는 식입니다. 참고하시기 바랍니다. 풋종목을 고를때 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] } } 콜종목을 고를때 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]; } } 아래 수정한 식입니다. Buy신호 발생하면 2.0에 가장 가까운 풋종목을 매도3호가로 매도주문하고 2초후에 미체결이면 매수5호가로 정정하고 Exitlong신호 발생하면 풋매도한 종목을 매수3호가로 청산(매수주문)하고 2초후에 미체결이면 매도5호가로 정정합니다. Sell신호 발생하면 2.0에 가장 가까운 콜종목을 매도3호가로 매도주문하고 2초후에 미체결이면 매수5호가로 정정하고 Exitshort신호 발생하면 콜매도한 종목을 매수3호가로 청산(매수주문)하고 2초후에 미체결이면 매도5호가로 정정합니다. //signalKind(1 : Buy, 2 : ExitLong, 3 : Sell, 4 : ExitShort) var CallOrderCode,PutOrderCode,T; var PID,CID,PXID,CXID; var Pnum,Cnum,PXnum,CXnum; 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 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) { //주문가능현금의 5% //var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 PutOrderCode종목 매도 주문 //if (Qty >= 1) //{ PID = Account1.OrderSell(PutOrderCode, 2, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 //} } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(PutOrderCode, 0); //CallOrderCode 잔고가 있으면 매도3호가로 전량 청산(매수주문) if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("풋 매도 청산"); SXID = Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); T = 0; Main.SetTimer(2, 2000);//2번타이머 2초 } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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) { //주문가능현금의 5% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상매도주문 //if (Qty >= 1) //{ CID = Account1.OrderSell(CallOrderCode, 2, OrderPrice, 0); T = -1; Main.SetTimer(3, 2000);//3번타이머 2초 //} } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { CXID = Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("콜 매도 청산"); T = 0; Main.SetTimer(4, 2000);//1번타이머 2초 } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == PID) { Pnum = OrderResponse.orderID; } if (OrderResponse.orderID == PXID) { PXnum = OrderResponse.orderID; } if (OrderResponse.orderID == CID) { Cnum = OrderResponse.orderID; } if (OrderResponse.orderID == CXID) { CXnum = OrderResponse.orderID; } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1) Account1.SetUnfillOrderNumber(Pnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(Pnum,Option.GetBid(Account1.Unfill.code, 5)); } if (nEventID == 2) { Main.KillTimer(2) Account1.SetUnfillOrderNumber(PXnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(PXnum,Option.GetAsk(Account1.Unfill.code, 5)); } if (nEventID == 3) { Main.KillTimer(3) Account1.SetUnfillOrderNumber(Xnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(Xnum,Option.GetBid(Account1.Unfill.code, 5)); } if (nEventID == 4) { Main.KillTimer(4) Account1.SetUnfillOrderNumber(XXnum); if (Account1.Unfill.count > 0) Account1.OrderReplacePrice(XXnum,Option.GetAsk(Account1.Unfill.code, 5)); } } 즐거운 하루되세요 > 왼손잡이 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 수고하십니다. 프로그램 검토 요청드립니다. 선물 신호 발생시 옵션 매도하는 프로그램인데요.(옵션매수하는 부분을 수정해보았습니다.) 수량은 2개로 고정해놓았습니다. 1. 미진입 또는 미청산시 2초뒤에 재 실행하고 싶습니다. 2. 테스트를 해보니 4.0대의 종목으로 진입이 되는되 왜그런지 궁금합니다. 3. 기타 프로그램 검토 부탁드리겠습니다. 그럼 더운 날씨에 수고하십시요! ============================================================================================= //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 PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); //풋 옵션중 2.0에 가장 가까운 종목 매도 //풋 옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 for (var i = -LNum; i <= UNum; i++) { PutPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); PutCode[i+LNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; PutOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (PutPrice[i+LNum] < CC) { CC = PutPrice[i+LNum]; PutOrderCode = PutCode[i+LNum] } } //종목을 찾았으면 if (CC < 99999999) { //주문가능현금의 5% //var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(PutOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 PutOrderCode종목 매도 주문 //if (Qty >= 1) //{ Account1.OrderSell(PutOrderCode, 2, OrderPrice, 0); T = 1; Main.SetTimer(1, 2000);//1번타이머 2초 //} } } //if (T == 1 && Signal.signalKind == 2) if (Signal.signalKind == 2) { Account1.SetBalanceItem(PutOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("풋 매도 청산"); Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0); T = 0; } } if (T >= 0 && Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); 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 = -UNum; i <= LNum; i++) { CallPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); CallCode[i+UNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; CallOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (CallPrice[i+UNum] < PP) { PP = CallPrice[i+UNum]; CallOrderCode = CallCode[i+UNum]; } } //종목을 찾았으면 if (PP < 99999999) { //주문가능현금의 5% var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.05; //주문가격 var OrderPrice = Option.GetAsk(CallOrderCode, 3); //주문가능현금/(주문가격*50만원) //var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000)); //1계약 이상 매수주문 //if (Qty >= 1) //{ Account1.OrderSell(CallOrderCode, 2, OrderPrice, 0); T = -1; Main.SetTimer(2, 2000);//2번타이머 2초 //} } } // if (T == -1 && Signal.signalKind == 4) if (Signal.signalKind == 4) { Account1.SetBalanceItem(CallOrderCode, 0); //CallOrderCode 잔고가 있으면 매수3호가로 전량 매도 if (Account1.Balance.count > 0) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0); Main.MessageList("--------------------------------------------"); Main.MessageList("콜 매도 청산"); T = 0; } } }