커뮤니티

수식 수정 부탁드립니다.

프로필 이미지
몬스터
2019-06-27 10:27:01
3207
글번호 224907
답변완료
아래의 시스템은 진입 -> 청산 식으로 진행될때 옵션을 진입,청산는 시스템인데, 선물 신호가 진입 -> 청산과 진입 -> 리버스가 혼재되어 발생합니다. 선물 신호가 혼재되어 발생될때 함께 진입과 청산을 할 수 있는 식으로 수정 부탁드립니다. ================================================================ /*스크립트시작-----------------------------------------------------*/ var Start; var BuyC1_code; var BuyC2_code; var BuyP1_code; var BuyP2_code; var SellC1_code; var SellC2_code; var SellP1_code; var SellP2_code; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; //옵션 Day청산이면 타이머셋팅 5초간격 if (Option.GetRemainDays(0,0) == 1) { Main.SetTimer(1, 5000); } } function Chart1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); //Buy 신호발생 if (Signal.signalKind == 1 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price, 0); Main.MessageLog("상방합성선물매수"); } //매수청산신호 if (Start == 1 && Signal.signalKind == 2 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("상방합성선물매수청산"); } } //Sell 신호발생 if (Signal.signalKind == 3 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price , 0); Main.MessageLog("하방합성선물매도"); } //매도청산신호 if (Start == 1 && Signal.signalKind == 4 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("하방합성선물매도청산"); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //만기일 15시 이후이면 if (nEventID == 1 && HHMMSS >= 150000) { //타이머종료 Main.KillTimer(1); //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산하고 차월물로 진입 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매도주문 Account1.OrderSell(NextMonth,vv,Option.GetBid(NextMonth,5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매수주문 Account1.OrderBuy(NextMonth,vv,Option.GetAsk(NextMonth,5),0); } } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-07-18 14:55:22

안녕하세요 예스스탁입니다. 현재 사용하시는 수식에서 신호발생시 주문은 아래와 같습니다. 차트에서 매수신호 발생하면 콜 ATM+2종목 매수 차트에서 매수청산신호 발생하면 보유종목 중 옵션종목 모두 청산 차트에서 매도신호 발생하면 콜 ATM+2종목 매수 차트에서 매도청산신호 발생하면 보유종목 중 옵션종목 모두 청산 리버스는 청산과 반대방향 진입신호가 동시에 발생하는 내용입니다. 리버스가 발생해도 청산과 진입이 각각 발생하므로 모두 위 내용에 따라 주문을 발생합니다. 문의하신 내용으로는 어느부분을 수정해 드려야 할지 알수 없습니다. 각 신호별 주문에 대해 상세한 내용을 올려주시기 바랍니다. 즐거운 하루되세요 > 몬스터 님이 쓴 글입니다. > 제목 : 수식 수정 부탁드립니다. > 아래의 시스템은 진입 -> 청산 식으로 진행될때 옵션을 진입,청산는 시스템인데, 선물 신호가 진입 -> 청산과 진입 -> 리버스가 혼재되어 발생합니다. 선물 신호가 혼재되어 발생될때 함께 진입과 청산을 할 수 있는 식으로 수정 부탁드립니다. ================================================================ /*스크립트시작-----------------------------------------------------*/ var Start; var BuyC1_code; var BuyC2_code; var BuyP1_code; var BuyP2_code; var SellC1_code; var SellC2_code; var SellP1_code; var SellP2_code; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; //옵션 Day청산이면 타이머셋팅 5초간격 if (Option.GetRemainDays(0,0) == 1) { Main.SetTimer(1, 5000); } } function Chart1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); //Buy 신호발생 if (Signal.signalKind == 1 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price, 0); Main.MessageLog("상방합성선물매수"); } //매수청산신호 if (Start == 1 && Signal.signalKind == 2 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("상방합성선물매수청산"); } } //Sell 신호발생 if (Signal.signalKind == 3 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price , 0); Main.MessageLog("하방합성선물매도"); } //매도청산신호 if (Start == 1 && Signal.signalKind == 4 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("하방합성선물매도청산"); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //만기일 15시 이후이면 if (nEventID == 1 && HHMMSS >= 150000) { //타이머종료 Main.KillTimer(1); //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산하고 차월물로 진입 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매도주문 Account1.OrderSell(NextMonth,vv,Option.GetBid(NextMonth,5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매수주문 Account1.OrderBuy(NextMonth,vv,Option.GetAsk(NextMonth,5),0); } } } } }