예스스탁
예스스탁 답변
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호가 로 진입
상기와 같이 스팟식으로만 차트가 만들어지고 그에 따른 신호발생및 주문이 가능한가요?
차트명 지정없이 ?