커뮤니티

수식문의

프로필 이미지
쏘로스
2015-06-15 12:36:12
1426
글번호 223519
답변완료
예제 합성선물 에서 미완성신호에 주문 나가게 하려면 어떻게 수정해야하나요? 또 동시호가 청산 수식은 아래와 같이 연결해서 붙여쓰면 되나요? ** 미완성신호에 합성선물(call은 ATM+1 , put은 ATM-1) 주문내고 14시50분에 청산하는식 부탁합니다 ===================================== /*스크립트시작-----------------------------------------------------*/ var Start; var BuyCallCode; var BuyPutCode; var SellCallCode; var SellPutCode; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; } function C1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); if (Signal.signalKind == 1 ) { Start = 1; BuyCallCode = Option.GetATMCallRecent(0); BuyPutCode = Option.GetATMPutRecent(0); var BuyCallPrice = Option.GetAskByCode(BuyCallCode,2); var BuyPutPrice = Option.GetBidByCode(BuyPutCode,2); A1.OrderBuy(BuyCallCode, Vol, BuyCallPrice, 0); A1.OrderSell(BuyPutCode, Vol, BuyPutPrice, 0); Main.MessageLog("합성선물매수"); } if (Start == 1 && Signal.signalKind == 2 ) { var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2); var BxPutPrice = Option.GetAskByCode(BuyPutCode, 2); A1.OrderSell(BuyCallCode, Vol, BxCallPrice, 0); A1.OrderBuy(BuyPutCode, Vol, BxPutPrice, 0); Main.MessageLog("합성선물매수청산"); } if (Signal.signalKind == 3 ) { Start = 1; SellCallCode = Option.GetATMCallRecent(0); SellPutCode = Option.GetATMPutRecent(0); var SellCallPrice = Option.GetBidByCode(SellCallCode,2); var SellPutPrice = Option.GetAskByCode(SellPutCode,2); A1.OrderSell(SellCallCode, Vol, SellCallPrice , 0); A1.OrderBuy(SellPutCode, Vol, SellPutPrice, 0); Main.MessageLog("합성선물매도"); } if (Start == 1 && Signal.signalKind == 4 ) { var SxCallPrice = Option.GetAskByCode(SellCallCode, 2); var SxPutPrice = Option.GetBidByCode(SellPutCode, 2); A1.OrderBuy(SellCallCode, Vol, SxCallPrice, 0); A1.OrderSell(SellPutCode, Vol, SxPutPrice, 0); Main.MessageLog("합성선물매도청산"); } } /*스크립트끝-------------------------------------------------------*/ // 동시호가청산 function Main_OnStart() { Main.MessageLog("시작") Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { Main.KillTimer(1); num = A1.GetTheNumberOfBalances(); for(var i = 0; i < num; i++) { A1.SetBalanceIndex(i); if (A1.Balance.position == 1) A1.OrderBuy(A1.Balance.code,A1.Balance.count,0,1); if (A1.Balance.position == 2) A1.OrderSell(A1.Balance.code,A1.Balance.count,0,1); } } } /*스크립트끝-------------------------------------------------------*/
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2015-06-18 16:30:10

안녕하세요 예스스탁입니다. 1. 미완성신호는 봉미완성시에 시세수신시 마다 조건이 충족되면 뜨는 표시입니다. 스팟에서는 차트객체에 OnRiseIncompleteSignal 이벤트로 수신을 받습니다. 미완성 신호는 하나의 봉에서 조건이 만족하면 횟수와 관계없이 발생합니다. 즉 한봉에 한번만 발생하는 것이 아니므로 처리 기준을 마련하셔야 합니다. 또한 봉미완성시에 미완성 신호가 발생해서 스팟에서 주문을 냈는데 실제 봉완성시에는 최종 조건이 만족하지 않아 확정신호가 발생하지 않을수 있습니다. 차트에는 확정신호가 나오지 않으면 잔고 포지션이 역전되거나 혹은 동일포지션에 대해 계속 누적할수도 있습니다. 미완성신호로 식을 작성하기 위해서는 많은 부분을 정하셔야 하고 해당 내용을 수식으로 구현해 가야 합니다. 예스스팟의 수식답변은 가이드라인 정도이고 하나의 식작성에 많은 시간을 할애해 드리지 못하므로 아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다. 아래수식은 미완성 신호만 보고 주문을 내게 작성했습니다. 차트의 포지션이 무포지션이거나 매도포지션인 상태에서 미완성 Buy신호 발생하면 매수 차트의 포지션이 매수포지션인 상태에서 미완성 exitlong신호 발생하면 매수청산 차트의 포지션이 무포지션이거나 매수포지션인 상태에서 미완성 Sell신호 발생하면 매수 차트의 포지션이 매도포지션인 상태에서 미완성 exitshort신호 발생하면 매수청산 var Start; var BuyCallCode; var BuyPutCode; var SellCallCode; var SellPutCode; var Bcnt,Bxcnt,Scnt,Sxcnt; function Main_OnStart() { Main.MessageList("시작"); Start = 0; Main.SetTimer(1, 5000); } function C1_OnBarAppended(nData) { Bcnt = 0; Bxcnt = 0; Scnt = 0; Sxcnt = 0; } //미완성 신호 발생 function C1_OnRiseIncompleteSignal(IncompleteSignal) { Main.MessageList("신호완성/",IncompleteSignal.signalKind); if (C1.GetOpenContracts() <= 0 && Bcnt == 0 && IncompleteSignal.signalKind == 1 ) { Start = 1; Bcnt = Bcnt+1; BuyCallCode = Option.GetATMCallRecent(0); BuyPutCode = Option.GetATMPutRecent(0); var BuyCallPrice = Option.GetAskByCode(BuyCallCode,2); var BuyPutPrice = Option.GetBidByCode(BuyPutCode,2); A1.OrderBuy(BuyCallCode, Vol, BuyCallPrice, 0); A1.OrderSell(BuyPutCode, Vol, BuyPutPrice, 0); Main.MessageList("합성선물매수"); } if (C1.GetOpenContracts() > 0 && Start == 1 && Bxcnt == 0 && IncompleteSignal.signalKind == 2 ) { Bxcnt = Bxcnt+1; var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2); var BxPutPrice = Option.GetAskByCode(BuyPutCode, 2); A1.OrderSell(BuyCallCode, Vol, BxCallPrice, 0); A1.OrderBuy(BuyPutCode, Vol, BxPutPrice, 0); Main.MessageList("합성선물매수청산"); } if (C1.GetOpenContracts() >= 0 && Scnt == 0 && IncompleteSignal.signalKind == 3 ) { Start = -1; Scnt = Scnt+1; SellCallCode = Option.GetATMCallRecent(0); SellPutCode = Option.GetATMPutRecent(0); var SellCallPrice = Option.GetBidByCode(SellCallCode,2); var SellPutPrice = Option.GetAskByCode(SellPutCode,2); A1.OrderSell(SellCallCode, Vol, SellCallPrice , 0); A1.OrderBuy(SellPutCode, Vol, SellPutPrice, 0); Main.MessageList("합성선물매도"); } if (C1.GetOpenContracts() < 0 && Start == -1 && Sxcnt == 0 && IncompleteSignal.signalKind == 4 ) { Sxcnt = Sxcnt+1; var SxCallPrice = Option.GetAskByCode(SellCallCode, 2); var SxPutPrice = Option.GetBidByCode(SellPutCode, 2); A1.OrderBuy(SellCallCode, Vol, SxCallPrice, 0); A1.OrderSell(SellPutCode, Vol, SxPutPrice, 0); Main.MessageList("합성선물매도청산"); } } /*스크립트끝-------------------------------------------------------*/ function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { Main.KillTimer(1); num = A1.GetTheNumberOfBalances(); for(var i = 0; i < num; i++) { A1.SetBalanceIndex(i); if (A1.Balance.position == 1) A1.OrderBuy(A1.Balance.code,A1.Balance.count,0,1); if (A1.Balance.position == 2) A1.OrderSell(A1.Balance.code,A1.Balance.count,0,1); } } } /*스크립트끝-------------------------------------------------------*/ 2 스팟에서 동일한 이벤트가 2개가 잇으면 아래쪽의 이벤트만 실행됩니다. 하나의 스팟식에는 이벤트가 한번씩만 사용되어야 하므로 동시호가 청산식의 OnStart 내용을 상단의 OnStart내용과 합쳐주시고 나머지 내용만 아래로 붙여넣기 하시면 됩니다. var Start; var BuyCallCode; var BuyPutCode; var SellCallCode; var SellPutCode; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; Main.SetTimer(1, 5000); } function C1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); if (Signal.signalKind == 1 ) { Start = 1; BuyCallCode = Option.GetATMCallRecent(0); BuyPutCode = Option.GetATMPutRecent(0); var BuyCallPrice = Option.GetAskByCode(BuyCallCode,2); var BuyPutPrice = Option.GetBidByCode(BuyPutCode,2); A1.OrderBuy(BuyCallCode, Vol, BuyCallPrice, 0); A1.OrderSell(BuyPutCode, Vol, BuyPutPrice, 0); Main.MessageLog("합성선물매수"); } if (Start == 1 && Signal.signalKind == 2 ) { var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2); var BxPutPrice = Option.GetAskByCode(BuyPutCode, 2); A1.OrderSell(BuyCallCode, Vol, BxCallPrice, 0); A1.OrderBuy(BuyPutCode, Vol, BxPutPrice, 0); Main.MessageLog("합성선물매수청산"); } if (Signal.signalKind == 3 ) { Start = 1; SellCallCode = Option.GetATMCallRecent(0); SellPutCode = Option.GetATMPutRecent(0); var SellCallPrice = Option.GetBidByCode(SellCallCode,2); var SellPutPrice = Option.GetAskByCode(SellPutCode,2); A1.OrderSell(SellCallCode, Vol, SellCallPrice , 0); A1.OrderBuy(SellPutCode, Vol, SellPutPrice, 0); Main.MessageLog("합성선물매도"); } if (Start == 1 && Signal.signalKind == 4 ) { var SxCallPrice = Option.GetAskByCode(SellCallCode, 2); var SxPutPrice = Option.GetBidByCode(SellPutCode, 2); A1.OrderBuy(SellCallCode, Vol, SxCallPrice, 0); A1.OrderSell(SellPutCode, Vol, SxPutPrice, 0); Main.MessageLog("합성선물매도청산"); } } /*스크립트끝-------------------------------------------------------*/ function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { Main.KillTimer(1); num = A1.GetTheNumberOfBalances(); for(var i = 0; i < num; i++) { A1.SetBalanceIndex(i); if (A1.Balance.position == 1) A1.OrderBuy(A1.Balance.code,A1.Balance.count,0,1); if (A1.Balance.position == 2) A1.OrderSell(A1.Balance.code,A1.Balance.count,0,1); } } } /*스크립트끝-------------------------------------------------------*/ 즐거운 하루되세요 > 쏘로스 님이 쓴 글입니다. > 제목 : 수식문의 > 예제 합성선물 에서 미완성신호에 주문 나가게 하려면 어떻게 수정해야하나요? 또 동시호가 청산 수식은 아래와 같이 연결해서 붙여쓰면 되나요? ** 미완성신호에 합성선물(call은 ATM+1 , put은 ATM-1) 주문내고 14시50분에 청산하는식 부탁합니다 ===================================== /*스크립트시작-----------------------------------------------------*/ var Start; var BuyCallCode; var BuyPutCode; var SellCallCode; var SellPutCode; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; } function C1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); if (Signal.signalKind == 1 ) { Start = 1; BuyCallCode = Option.GetATMCallRecent(0); BuyPutCode = Option.GetATMPutRecent(0); var BuyCallPrice = Option.GetAskByCode(BuyCallCode,2); var BuyPutPrice = Option.GetBidByCode(BuyPutCode,2); A1.OrderBuy(BuyCallCode, Vol, BuyCallPrice, 0); A1.OrderSell(BuyPutCode, Vol, BuyPutPrice, 0); Main.MessageLog("합성선물매수"); } if (Start == 1 && Signal.signalKind == 2 ) { var BxCallPrice = Option.GetBidByCode(BuyCallCode, 2); var BxPutPrice = Option.GetAskByCode(BuyPutCode, 2); A1.OrderSell(BuyCallCode, Vol, BxCallPrice, 0); A1.OrderBuy(BuyPutCode, Vol, BxPutPrice, 0); Main.MessageLog("합성선물매수청산"); } if (Signal.signalKind == 3 ) { Start = 1; SellCallCode = Option.GetATMCallRecent(0); SellPutCode = Option.GetATMPutRecent(0); var SellCallPrice = Option.GetBidByCode(SellCallCode,2); var SellPutPrice = Option.GetAskByCode(SellPutCode,2); A1.OrderSell(SellCallCode, Vol, SellCallPrice , 0); A1.OrderBuy(SellPutCode, Vol, SellPutPrice, 0); Main.MessageLog("합성선물매도"); } if (Start == 1 && Signal.signalKind == 4 ) { var SxCallPrice = Option.GetAskByCode(SellCallCode, 2); var SxPutPrice = Option.GetBidByCode(SellPutCode, 2); A1.OrderBuy(SellCallCode, Vol, SxCallPrice, 0); A1.OrderSell(SellPutCode, Vol, SxPutPrice, 0); Main.MessageLog("합성선물매도청산"); } } /*스크립트끝-------------------------------------------------------*/ // 동시호가청산 function Main_OnStart() { Main.MessageLog("시작") Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMDD >= 150600) { Main.KillTimer(1); num = A1.GetTheNumberOfBalances(); for(var i = 0; i < num; i++) { A1.SetBalanceIndex(i); if (A1.Balance.position == 1) A1.OrderBuy(A1.Balance.code,A1.Balance.count,0,1); if (A1.Balance.position == 2) A1.OrderSell(A1.Balance.code,A1.Balance.count,0,1); } } } /*스크립트끝-------------------------------------------------------*/