1.
전략내용
특정시간 이후
일정 시간간격으로 일정수량을 매수하는데
전일 종가는 감시가격 아래였지만 현재가가 지정한 감시가격 이상일 때만
매수주문을 집행하며 목표수량만큼 주문할 때까지 반복합니다.
아래 예제에서 감시가격은 전일기준 20일 최저가+(20일 고저폭)*38.2%입니다.
2.
스크립트 객체화면 설정
계좌객체를 추가한 후 속성에서 객체명은 Account1으로 지정하고 계좌번호로 지정합니다.
3.
스팟수식
var 매수종목코드 = "005930"
var 주문시작시간 = 93000;
var 목표수량 = 1000;
var 단위수량 = 100;
var 감시가격 = 100000;
var 주문가격 = 0; //0: 현재가, 1이상:매도호가, -1이하 매수호가
var 주문간격 = 60;//초
var step,MK;
var TF = 주문간격*1000;
var TF = 10000;
var TotalOrderVol = 0;;
var TimerCount = 0;
function Main_OnStart()
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
step = 0;
if (HHMMSS < 주문시작시간)
{
step = 1;
TotalOrderVol = 0;
TimerCount = 0;
//종목객체 요청시 일봉데이터 20개 동시 요청
Main.ReqMarketData(매수종목코드,20);
Main.MessageList(HHMMSS,"|매수주문종목 종목객체 요청",매수종목코드);
Main.SetTimer(1, 1000);
}
else
{
step = -1;
Main.MessageList(HHMMSS,"|주문시작시간 셋팅확인 : 주문시작시간이 현재시간 이전입니다. 주문시작시간:",주문시작시간);
}
}
function Main_OnRcvMarketData(MarketData)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (step == 1 && MarketData.code == 매수종목코드)
{
step = 2;
Main.MessageList(HHMMSS,"|매수주문종목 종목객체 수신",MarketData.code);
MK = MarketData;
if (MK.GetPrevCount() >= 20)
{
var HH = 0;
var LL = 0;
for (var i = 1; i <= 20 ; i++)
{
if (HH == 0 || (HH > 0 && MK.GetPrevHigh(i) > HH))
{
HH = MK.GetPrevHigh(i);
}
if (LL == 0 || (LL > 0 && MK.GetPrevLow(i) < LL))
{
LL = MK.GetPrevLow(i);
}
}
감시가격 = LL+(HH-LL)*0.382;
Main.MessageList(HHMMSS,"|감시가격 : 최저가+고저폭의 38.2%",감시가격);
}
else
{
Main.MessageList(HHMMSS,"|일봉 데이터부족");
Main.KillTimer(1);
Main.MessageList(HHMMSS,"|타이머 종료");
}
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (step >= 2 && HHMMSS >= 주문시작시간)
{
if (step == 2)
{
Main.SetTimer(1, TF);
}
TimerCount = TimerCount + 1;
var CP = MK.current;
var OP = MK.current;
if (주문가격 > 0)
{
OP = MK.Ask(Math.abs(주문가격));
}
if (주문가격 < 0)
{
OP = MK.Bid(Math.abs(주문가격));
}
Main.MessageList(HHMMSS,"|",TimerCount,"차 타이머동작:현재가",CP,"|감시가격:",감시가격);
if (CP <= 감시가격 && MK.GetPrevClose(1) < 감시가격)
{
Main.MessageList(HHMMSS,"|가격조건O");
var diff = (목표수량-TotalOrderVol);
var vol = Math.min(diff,단위수량);
Account1.OrderBuy(MK.code, vol, OP, 0);
TotalOrderVol = TotalOrderVol + vol;
Main.MessageList(HHMMSS,"|분할매수주문실행:주문가격",CP,"|주문수량:",vol,"|누적주문수량",TotalOrderVol);
if (TotalOrderVol >= 목표수량)
{
Main.KillTimer(1);
Main.MessageList(HHMMSS,"|목표수량 도달:","|누적주문수량",TotalOrderVol,"|목표수량",목표수량);
Main.MessageList(HHMMSS,"|타이머 종료");
}
}
else
{
Main.MessageList(HHMMSS,"|가격조건X");
}
}
}
JavaScript
복사