1. 기본 전략 작성
전략 스크립트 기본 구성
인텔리퀀트의 전략 스크립트를 작성하는 것은 어렵지 않습니다.
전략 시뮬레이션이 처음 시작하면 실행할 내용과,
시뮬레이션 기간중 매일 매일 실행할 내용과,
시뮬레이션이 종료되면 실행할 내용을 작성하면 됩니다.
대부분의 경우 종료할 때 특별히 할일이 없으므로, 시작 할때와 매일매일 함수
두개만 작성하면 됩니다.
initialize() 함수
우선 시작하면 initialize 함수를 실행합니다.
만약 사용자가 initialize 함수를 정의하지 않으면 건너 뛰게 됩니다. 또는
오타가 나서 함수명이 달라지면 역시 건너뛰게 됩니다.
보통의 경우에는 Basket 객체를 초기화 하거나, 계산을 위해서 필요한 값들을
초기화 하는데 사용합니다.
주의: 자바스크립트 특성상, initialize 함수가 아닌 root 에 있는
스크립트들도 실행 초기에 실행이 됩니다.
그러나 이 경우에는 기본 계좌등의 내부 초기화가 이루어진 상태가 아니므로
가급적 initalize 함수에서 초기화 하는것을 권장합니다.
initalize 함수의 예제는 다음과 같습니다.
var stock_basket = null; var second_account = null; function initialize() { IQEnvironment.stockCommission = 0.0015; // commission for stocks 0.0015 IQEnvironment.etfCommission = 0.0015; // commission for ETFs 0.0015 IQEnvironment.stockTax = 0.003; // trade tax for stocks logger.debug("strategy initialized."); //로그를 출력합니다. second_account = IQAccount.add('9876-1234-11', 100000000 ); //1억짜리 새로운 계좌를 추가합니다. stock_basket = new Basket(second_account, 10, 10000000); //새로운 Basket 객체를 생성합니다. }
onDayClose() 함수
시뮬레이션 기간중 매일 매일 장이 종료되면 이 함수가 호출됩니다.
이 함수에서 당일 혹은 이전의 시세를 참조하여 주문을 내는 방식으로
시뮬레이션을 진행합니다.
인텔리퀀트는 실시간으로 장중에 주문을 내는 시뮬레이션 방식이 아닌, 장 종료
이후에 주문을 낼 것인지 판단하여 다음날 시가에 주문을 내는 것으로 가정하는
방식을 사용합니다.
(주: 기본은 주문이 발생한 이후 다음날 시가 거래이지만, 옵션 설정을 통해
다음날 시가가 아닌 당일 종가로 매매하는 것으로 가정 할 수 있습니다. trade
station을 사용해 보신 분들은 onClose 옵션과 atMarket 옵션을 생각하시면
됩니다.)
실전에서 다음날 시가가 아닌 장중 임의의 시간에 매매하게
되면 시뮬레이션과 차이가 발생 할 수 있습니다.
그러나 시뮬레이션 기간이 길어 질수록 차이가 상쇄되어 시스템 성능을
판단하는데는 큰 문제가 되지 않게 됩니다.
onDayClose 함수는 시뮬레이션 기간중 매일 호출됩니다.
1년정도 시뮬레이션 한다면 대략 250번이 호출됩니다.
따라서 이 함수에서는 가급적 불필요한 계산을 하지 않는것이 테스트 속도를
높이는데 도움이 됩니다.
파라메터로 전달되는 now 객체는 Javascript의 Datetime 객체입니다.
이를 통해 onDayClose 가 호출되는 시점을 판단 할 수 있습니다.
예를 들어 매월 1일에 리밸런싱 하도록 하거나, 옵션 만기일에 맞춰서 거래할
경우 now 객체를 사용하시면 됩니다.
onDayClose 함수의 예제
var buy = false; function onDayClose(now) { //시뮬레이션 시작일부터 종료일까지 매일 호출 됩니다. //호출되는 시점의 날자는 now를 통해 알 수 있습니다. //주말 및 공휴일등 장이 열리지 않은 날은 호출되지 않습니다. if (buy) { IQAccount.getDefaultAccount().sell(hp.code, 1); //기본계좌에 1주 매도 주문 buy = false; } else { IQAccount.getDefaultAccount().buy(hp.code, 1); //기본 계좌에 1주 매수 주문 buy = true; } }
onComplete() 함수
모든 시뮬레이션이 완료되면 호출됩니다.
사실 저희도 만들어놓고 잘 안씁니다. 여러분도 딱히 사용할 일이 없을거 같아
긴설명은 하지 않겠습니다.
필요하면 전략에 선언하고 사용하시면 됩니다.
콘솔 로그 출력
스크립트를 실행하면서 디버깅등에 필요한 출력은 logger 객체를 사용합니다.
function onDayClose(now) { logger.debug("now : " + now.toString()); }
logger 객체는 debug, info, error 3가지 종류의 로그 기능을 제공합니다.
콘솔창에서는 3가지 로그중 원하는 로그 종류만 필터링 하는 기능을
제공합니다.
주의할 점은 콘솔창은 1만개의 로그까지만 허용합니다. 더이상의 로그는 가장
최근 메시지부터 삭제됩니다.
너무 많은 로그를 출력할 경우 웹브라우저의 과부하로 문제가 생길수 있습니다.