(Technical Analysis)
현재 인텔리퀀트 스튜디오에서 제공하는 기술적 분석 지표 함수는 아래와 같이 추세 지표, 모멘텀 지표, 변동성 지표, 시장강도 지표로 나누며, 자세한 사항은 도움말 API 레퍼런스의 Stock 객체(https://intelliquant.co.kr/help/ref/1) 부분을 참고해주세요.
※ 모든 기술적 지표는 수정주가를 기반으로 계산된 값입니다.
1) 추세 지표
•
MA (Moving Average, 이동평균) - getMA(period)
•
EMA (Exponential Moving Average, 지수이동평균) - getEMA(period)
•
WMA (Weighted Moving Average, 가중이동평균) - getWMA(period)
•
MACD (Moving Average Convergence & Divergence, 이동평균수렴확산) - getMACD(fast, slow, signal)
•
ADX (Average Directional Movement Index, 평균방향운동지수) - getADX(period)
2) 모멘텀 지표
•
Stochastics (스토캐스틱) - getStochastic(fastK, slowK, slowD)
•
Williams%R (윌리엄스%R) - getWilliamsR(period)
•
CCI (Commodity Channel Index, 상품채널지수) - getCCI(period)
3) 변동성 지표
•
Bolinger Band (볼린저밴드) - getBolingerBand(period, devUp, devDown)
•
True Range (트루레인지) - getTrueRange()
•
ATR (Average True Range, 애버리지 투루레인지) - getATR(period)
•
Parabolic (파라볼릭) - getParabolic(acc, max)
4) 시장강도 지표
•
OBV (On Balance Volume, 누적균형거래량) - getOBV()
•
RSI (Relative Strength Index, 상대강도지수) - getRSI(period)
아래 예제는 추세 지표들 중에 하나인 이동평균 수렴확산(MACD) 지표를 이용하여 해당 종목을 매수/매도하는 방법입니다.
전체적인 내용은 한 종목의 MACD 값과 Signal 값을 비교하여 MACD가 Signal을 하향 돌파(데드크로스)하면 매도, Signal을 상향 돌파(골든크로스)하면 매수하게 됩니다.
var code = "A066570", name = "LG전자"; // 종목코드
var stock, stock_basket, graph;
var stock_weight = 0.9; // 주식비중
var target_num = 1; // 투자 종목 수
var initClose = 0; // 초기 종가
var intQty = 0;
function initialize() {
IQAccount.getDefaultAccount().accountName = name + " MACD 반영 수익률";
stock_basket = new Basket(IQAccount.getDefaultAccount(), target_num, IQEnvironment.aum * stock_weight);
stock = IQStock.getStock(code);
graph = IQGraph.createGraph(name + " 수익률");
initClose = stock.getAdjClose(); // 누적 수익률 계산을 위해 초기 종가 저장
}
function _buildPortfolio(macd, signal, histogram) {
var totalEquity = IQAccount.getDefaultAccount().getTotalEquity(); // 계좌 총 평가액
var error = -99999999; // 에러코드
if (macd !== error) {
// MACD 값이 Signal을 하향돌파(데드크로스)할 때 매도
if (prevMacd > prevSignal && macd < signal) {
stock_basket.leave(IQStock.getStock(code), intQty); // 종목 매도
logger.debug("[Sell] (signal -> macd) " + 'macd: ' + macd + ", signal: " + signal + ", histogram: " + histogram);
// MACD 값이 Signal을 상향돌파(골든크로스)할 때 매수
} else if (prevMacd < prevSignal && macd > signal) {
logger.debug("[Buy] (macd -> signal) " + 'macd: ' + macd + ", signal: " + signal + ", histogram: " + histogram);
if (stock_basket.getCurrentEggs().length === 0) {
stock_basket.reset();
intQty = parseInt((totalEquity / stock.getAdjClose()) * stock_weight);
stock_basket.enter(IQStock.getStock(code), intQty); // 종목 매수
}
}
}
}
var enterForInit = false; // 초기 실행 플래그
var fast = 12, slow = 26, signal = 9; // 12일 단기 이동평균, 26일 장기 이동평균, 9일 시그널 이동평균
var prevMacd = 0, prevSignal = 0; // 이전 MACD, Signal 저장
function onDayClose(now) {
logger.debug(stock_basket.getCurrentEggs());
graph.plot(((stock.getAdjClose() / initClose) - 1) * 100); // 기본 수익률 그래프
// MACD 값을 가져오는 함수입니다. 결과 값은 당일 MACD 값의 JSON 형태
// {"macd":117.3,"signal":128.1,"hist":-10.8}, 문제가 있을 경우 -99999999
var macdJson = stock.getMACD(fast, slow, signal);
// MACD 및 Signal 값에 따라 매수/매도 수행
_buildPortfolio(macdJson.macd, macdJson.signal, macdJson.hist);
prevMacd = macdJson.macd; // 현재 MACD 값 저장
prevSignal = macdJson.signal; // 현재 Signal 값 저장
if (enterForInit == false) { // 최초 진입일 경우 종목 매수
stock_basket.reset();
intQty = parseInt((IQEnvironment.aum / stock.getAdjClose()) * stock_weight);
stock_basket.enter(IQStock.getStock(code), intQty);
enterForInit = true;
}
}
JavaScript
복사