도움말
인텔리퀀트의 사용방법과 메뉴얼입니다.

2. 종목과 시장 데이터 참조

인텔리퀀트에서는 하나의 종목을 Stock 객체를 통해 나타냅니다.
Stock 객체들은 IQStock이라는 컨테이너에 담겨 있습니다.
이 객체를 통해 시장 데이터나 회계 데이터 등의 각종 정보를 참조할 수 있습니다. 그리고 Basket 객체에 주문을 낼 때도 이 객체를 사용합니다.
이 객체를 가져오는 방법은 아래와 같이 여러 방법이 있습니다.

(1) 종목코드를 통해 Stock 객체 가져오기

만약 삼성전자의 Stock객체를 가져오려면 다음과 같이 호출 합니다.

var sseStock = IQStock.getStock('A005930');
logger.debug('code' + sseStock.code + ', name:' + sseStock.name);

(2) filter 함수를 통해 특정 조건에 맞는 Stock 객체 가져오기

IQStock객체는 특정 조건에 맞는 Stock 객체를 가져오기 위해서 filter() 함수를 제공합니다.
예를 들어 시가총액이 3조 이상인 종목만을 가져오거나, 지난 1주일간 거래대금이 10억 이상인 종목만 가져올 수 있습니다.
또는 재무데이터를 이용하여 PER이 20 이상인 종목 혹은 영업이익이 발생한 종목만을 가져올 수 있습니다.

그러나 필터링 하는 방법은 조금 복잡합니다. 바로 필터링 할것이냐 말 것이냐를 판단하는 함수를 만들어서, 그 함수를 파라메터로 넘기는 방식입니다.
프로그래머들이 자주 사용하는 방식인데요. 이 방법이 복잡하다면 그냥 복사하기 & 붙여넣기 신공을 사용하신 후 이름만 바꾸시면 됩니다.
우선은 예제를 먼저 보겠습니다.

function marketCapitalFilter(stock) {
  //Stock 을 인자로 갖는 함수여야 합니다.
  if (stock.getMarketCapital() > 100000) //시가총액이 1000억이상인 종목으로 필터링
      false
  else
      true;
}
var universe0 = IQStock.filter(marketCapitalFilter);
logger.debug('universe0 size:' + universe0.length); //필터링 되지 않은 종목수를 출력함

예제에서 보신 것처럼 stock을 인자로 갖는 함수를 정의해서 filter() 함수를 호출하면, marketCapitalFilter() 함수는 주식의 종목 수 만큼 호출됩니다.
한번 호출 될때마다 stock 객체가 바뀌면서 true면 리턴 배열에 추가하고, false 만 추가하지 않습니다.
이런식으로 필터를 거쳐서 원하는 Stock 객체를 배열로 가져올 수 있습니다.

(3) 종목 속성 참조

stock 객체는 code, name, isETF, market, manage, basePrice, grade 의 속성을 가지고 있습니다.
code는 말그대로 단축 코드입니다. (코드6자리 앞에는 항상 대문자 'A'가 붙습니다.)
name은 종목명입니다.
market은 시장입니다. 코스피:1, 코스닥:0 입니다.
isETF는 ETF종목인지 아닌지를 나타냅니다.
manage는 관리 코드 입니다. 관리:1, 투자유의:2, 거래정지:4 (비트연산 허용) 입니다.
basePrice는 기준가입니다.
grade는 구분 코드 입니다. 대형:1, 중형:2, 소형:4, 8:Kospi200 (비트연산 허용) 입니다.

(4) Stock 객체의 시장 데이터 참조

Stock데이터를 통해 수정 종가를 가져오려면 아래처럼 작성합니다.
var currentPrice = stock.getAdjClose(0);

여기서 파라메터로 전달되는 숫자 0 은 현재로 부터 몇번째 과거의 데이터 인지를 나타냅니다. 0이라면 당일 데이터(당일이라는 표현은 시뮬레이션 시간 기준입니다.)이고,
1이면 하루 전 데이터 입니다. 이 과거는 무한대로 커질 수는 없습니다. 시뮬레이션을 시작할때 시작일보다 과거는 가져올 수 없습니다.
주말 및 휴일을 제외한 거래일 기준입니다. 예를 들어 당일이 월요일이라면 getAdjClose(1)은 금요일이 됩니다.
숫자가 생략되면 내부적으로 당일인 0으로 간주합니다.

예를 들어 20일간의 이동 평균을 구한다면 아래와 같이 구현할 수 있습니다.

var sum = 0;
for(var i=0; i<20; i++) {
   sum = sum + stock.getAdjClose(i);
}
return sum / 20;

Stock 객체에서 각 시장데이터를 참조하는 것은 Stock객체의 메뉴얼을 참고하시기 바랍니다.