커뮤니티

문의드립니다

프로필 이미지
tktmsl
2016-04-15 17:01:01
2181
글번호 223878
답변완료
수고하십니다 다음과 같은 스팟수식을 부탁드립니다 1. 콜옵션가격 3.0 이하의 가격중 제일 큰 행사가를 찾는다 2. 위의 행사가 옵션 5분봉 차트를 기준으로 시스템신호 발생(예를들어 이평G/C, D/C) 3. 2번 신호에 따라 미니선물에 진입한다( 매수신호시 매수 ,매도신호시 매도) 4. 진입시 현재가+- 1호가 로 진입 ---- 5. 똑같이 풋옵션가격 3.0 이하중 제일 큰 행사가를 찾는다 6. 위의 행사가 옵션 5분봉 차트를 기준으로 시스템신호 발생(예를들어 이평G/C, D/C) 7. 5번 신호에 따라 미니선물에 진입한다 ( 풋 이므로 매수신호시 미니선물매도 .. 매도신호시 미니선물 매수) 8. 진입시 현재가+- 1호가 로 진입 상기와 같이 스팟식으로만 차트가 만들어지고 그에 따른 신호발생및 주문이 가능한가요? 차트명 지정없이 ?
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2016-05-04 16:17:08

안녕하세요 예스스탁입니다. 스팟의 수식답변은 가이드 정도의 답변만 해드립니다. 아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다. 스크립트 객체설정 옵션객체 추가 --> 속성에서 객체명은 Option, 주가지수나 미니옵션 중 하나로 지정 종목객체 추가 --> 속성에서 객체명은 MarketData1, 미니선물로 지정 계좌객체 추가 --> 속성에서 객체명은 Account1, 주문낼 계좌로 지정 var CallOrderCode,PutOrderCode; var CallChartSet,PutChartSet; function Main_OnStart() { CallChartSet = false; PutChartSet = false; Main.MessageList("시작",Start); Main.SetTimer(1, 5000);//타이머 5초 } //타이머 동작 function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //1번타이머 동작하고 9시가 되면 if (nEventID == 1 && HHMMSS >= 90000) { Main.KillTimer(1);//1번타이머 종료 //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 3.0이하이면 if (Option.GetCurrent(0, i) <= 3.0) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//3.0보다 크면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 var CC = -1; CallOrderCode = -1; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] > CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var i = -UNum; i <= LNum; i++) { //값이 3.0이하이면 if (Option.GetCurrent(1, i) <= 3.0 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[i+UNum] = Option.GetCurrent(1, i); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[i+UNum] = Option.GetATMPutRecent(i); } else //2.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[i+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[i+UNum] = -1; } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 var PP = -1; PutOrderCode = -1; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] > PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //콜종목을 찾았으면 if (CC > 0) { //차트설정 : 콜종목,5분봉,5000개, 수정주가X, 갭보정X var C1 = new ReqChartItem(CallOrderCode,5,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); //시스템 설정 var S1 = new SystemInfo("이동평균(단순) Golden_Dead"); //<--실제 예스랭귀지의 시스템식명을 지정하셔야 합니다. //C1차트설정, S1시스템설정으로 첫번째 종목 차트 생성 Main.ReqChartEx(C1,S1); } //콜종목을 찾았으면 if (PP > 0) { //차트설정 : 풋종목,5분봉,5000개, 수정주가X, 갭보정X var C2 = new ReqChartItem(PutOrderCode,5,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); //시스템 설정 var S2 = new SystemInfo("이동평균(단순) Golden_Dead"); //<--실제 예스랭귀지의 시스템식명을 지정하셔야 합니다. //C1차트설정, S1시스템설정으로 첫번째 종목 차트 생성 Main.ReqChartEx(C2,S2); } } } function Main_OnRcvChartEx(ChartEx) { if (ChartEx.code == CallOrderCode) { CallChartSet = true; } if (ChartEx.code == PutOrderCode) { PutChartSet = true; } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //콜차트에서 신호발생하면 MarketData1종목에 대해 주문 if (ChartEx.code == CallOrderCode && CallChartSet == true) { if (Signal.signalKind == 1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current + MarketData1.GetTickSize()*1, 0); } if (Signal.signalKind == 2) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.current - MarketData1.GetTickSize()*1, 0); } if (Signal.signalKind == 3) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.current - MarketData1.GetTickSize()*1, 0); } if (Signal.signalKind == 4) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current + MarketData1.GetTickSize()*1, 0); } } //풋차트에서 신호발생하면 MarketData1종목에 대해 주문 if (ChartEx.code == CallOrderCode && CallChartSet == true) { if (Signal.signalKind == 1) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.current - MarketData1.GetTickSize()*1, 0); } if (Signal.signalKind == 2) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current + MarketData1.GetTickSize()*1, 0); } if (Signal.signalKind == 3) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.current + MarketData1.GetTickSize()*1, 0); } if (Signal.signalKind == 4) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.current - MarketData1.GetTickSize()*1, 0); } } } 즐거운 하루되세요 > tktmsl 님이 쓴 글입니다. > 제목 : 문의드립니다 > 수고하십니다 다음과 같은 스팟수식을 부탁드립니다 1. 콜옵션가격 3.0 이하의 가격중 제일 큰 행사가를 찾는다 2. 위의 행사가 옵션 5분봉 차트를 기준으로 시스템신호 발생(예를들어 이평G/C, D/C) 3. 2번 신호에 따라 미니선물에 진입한다( 매수신호시 매수 ,매도신호시 매도) 4. 진입시 현재가+- 1호가 로 진입 ---- 5. 똑같이 풋옵션가격 3.0 이하중 제일 큰 행사가를 찾는다 6. 위의 행사가 옵션 5분봉 차트를 기준으로 시스템신호 발생(예를들어 이평G/C, D/C) 7. 5번 신호에 따라 미니선물에 진입한다 ( 풋 이므로 매수신호시 미니선물매도 .. 매도신호시 미니선물 매수) 8. 진입시 현재가+- 1호가 로 진입 상기와 같이 스팟식으로만 차트가 만들어지고 그에 따른 신호발생및 주문이 가능한가요? 차트명 지정없이 ?