TRIX는 잭 허튼(Jack K. Hutson)이 만든 지표로 가격 변화율을 삼중 지수 이동 평균(TEMA, Triple Exponential Moving Average)하여 백분율로 보여주는 지표다. TRIX는 가격 변화율을 세 번이나 지수 이동 평균하기 때문에 노이즈를 굉장히 많이 제거하여 표현하는 것에 장점이 있으며 지수 이동 평균이다 보니 후행하는 현상이 많이 제거되었다. 반대로 여러 번의 지수 이동 평균 과정을 통해 노이즈를 제거하는 만큼 가격 변동을 표현하지는 못하는 단점이 공존한다.
삼중 지수 이동 평균하여 구한 TRIX를 한번 더 지수 이동 평균하여 시그널 라인을 하나 더 그려 오실레이터로 활용한다. 보통 MACD와 비슷하게 시그널을 줄 수 있다고 알려져 있긴 한데, 실제로 적용해 보면 계산 공식이 다르기 때문에 차이는 분명 존재한다. 삼중 지수 이동 평균의 길이는 적용하는 사람마다 천차만별인데, 기술 분석 설명서로 유명한 마틴 프링(Martin Pring)이 30일 TRIX로 모멘텀을 측정하는 방법에 대해 설명하던 덕분인지 30일 이 가장 일반적으로 사용되고 있다. 시그널에 대해서는 다른 지표들과 비슷하게 9일 선을 주로 사용하는 듯.
0을 기준으로 하여 TRIX가 양수이면 상승 모멘텀, 음수이면 하락 모멘텀으로 보는 게 지표로서의 TRIX를 활용하는 가장 일반적인 방법이다.
매매 전략은 TRIX와 시그널 선의 교차에 따른 전략이 있다. TRIX가 시그널 선을 상향 돌파 할 때 매수하고, TRIX가 시그널 선을 하향 돌파 할 때 매도하는 전략이다. 단 이 전략은 TRIX와 시그널 선의 길이를 잘 조절해서 테스트해 볼 필요가 있다.
두 번째는 TRIX라인이 0을 교차하는 시점에 매수/매도하는 방법. TRIX가 0을 상향 돌파하면 매수, TRIX가 0을 하향 돌파하면 매도하는 전략이다. TRIX가 아니라 시그널 라인을 기준으로도 이 전략을 적용할 수 있는데 시그널도 비교적 짧은 기간으로 EMA 하여 적용하다 보니 차이는 그렇게 많지 않다. 이 전략은 대충 적용해도 다른 지표들보다 수익률이 제법 좋게 나오는 전략 중 하나다. 기간을 잘 조절해서 사용하면 타 지표와 조합 없이도 높은 수익률을 올릴 수 있는 매매 전략이다.
마지막으로 TRIX의 트레이딩 뷰 파인 스크립트 소스와 pandas-ta 소스를 공유하며 마친다.
- TRIX 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="TRIX", shorttitle="TRIX", format=format.price, precision=2, timeframe="", timeframe_gaps=true)
import TradingView/ta/7 as ta7
import blackcat1402/pandas_ta/7 as pta
ma(source, length, _type) =>
switch _type
"SMA" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"DEMA" => ta7.dema(source,length)
"TEMA" => ta7.tema(source,length)
"FRAMA" => ta7.frama(source,length)
"T3" => ta7.t3(source,length)
"TRIMA" => ta7.trima(source,length)
"RMA" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"HMA" => ta.hma(source, length)
"VWMA" => ta.vwma(source * volume, length)
"ALMA" => pta.alma(source, length)
"JMA" => pta.jma(source, length)
"SINWMA" => pta.sinwma(source, length)
"FWMA" => pta.fwma(source, length)
"LINREG" => pta.linreg(source, length)
"SWMA" => pta.swma(source)
"YIDYA" => pta.vidya(source, length)
"VWAP" => pta.vwap(source)
"ZLMA" => pta.zlma(source, length)
lengthInput = input.int(defval=30, title="TRIX Length")
signalLegnthInput = input.int(defval=9, title="Signal Length")
maTypeInput = input.string("EMA", title="Signal MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], display = display.data_window)
trix = 10000 * ta.change(ta.ema(ta.ema(ta.ema(math.log(close), lengthInput), lengthInput), lengthInput))
signal = ma(trix, signalLegnthInput, maTypeInput)
trixPlot=plot(trix, color=color.yellow, title="TRIX")
signalPlot=plot(signal, color=color.aqua, title="Signal")
hline(0, color=color.gray, title="Zero")
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(trixPlot, midLinePlot, 50, 0, top_color = color.green, bottom_color = color.new(color.green, 100))
fill(trixPlot, midLinePlot, 0, -50, top_color = color.new(color.red, 100), bottom_color = color.red)
- TRIX 트레이딩 뷰 파인 스크립트 전략 소스
//@version=5
strategy(title="TRIX", shorttitle="TRIX", margin_long=100, margin_short=100, default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, commission_value=0.2, pyramiding=0)
import TradingView/ta/7 as ta7
import blackcat1402/pandas_ta/7 as pta
ma(source, length, _type) =>
switch _type
"SMA" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"DEMA" => ta7.dema(source,length)
"TEMA" => ta7.tema(source,length)
"FRAMA" => ta7.frama(source,length)
"T3" => ta7.t3(source,length)
"TRIMA" => ta7.trima(source,length)
"RMA" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"HMA" => ta.hma(source, length)
"VWMA" => ta.vwma(source * volume, length)
"ALMA" => pta.alma(source, length)
"JMA" => pta.jma(source, length)
"SINWMA" => pta.sinwma(source, length)
"FWMA" => pta.fwma(source, length)
"LINREG" => pta.linreg(source, length)
"SWMA" => pta.swma(source)
"YIDYA" => pta.vidya(source, length)
"VWAP" => pta.vwap(source)
"ZLMA" => pta.zlma(source, length)
lengthInput = input.int(defval=30, title="TRIX Length")
signalLegnthInput = input.int(defval=9, title="Signal Length")
maTypeInput = input.string("EMA", title="Signal MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], display = display.data_window)
strategySignal = input.string("TRIX-Signal Cross", title="Strategy Indicator", options = ["TRIX-Signal Cross", "TRIX-0 Cross", "Signal-0 Cross"])
trix = 10000 * ta.change(ta.ema(ta.ema(ta.ema(math.log(close), lengthInput), lengthInput), lengthInput))
signal = ma(trix, signalLegnthInput, maTypeInput)
trixPlot=plot(trix, color=color.yellow, title="TRIX")
signalPlot=plot(signal, color=color.aqua, title="Signal")
hline(0, color=color.gray, title="Zero")
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(trixPlot, midLinePlot, 50, 0, top_color = color.green, bottom_color = color.new(color.green, 100))
fill(trixPlot, midLinePlot, 0, -50, top_color = color.new(color.red, 100), bottom_color = color.red)
startDate = input.time(defval=timestamp("01 Jan 1970 00:00 +0000"), group = "Test Range")
finishDate = input.time(defval=timestamp("31 Dec 2025 24:00 +0000"), group = "Test Range")
time_condition = time >= startDate and time <= finishDate
if(time_condition)
if (strategySignal == "TRIX-Signal Cross")
if ta.crossover(trix, signal)
strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
if ta.crossunder(trix, signal)
strategy.close_all('매도')
if (strategySignal == "TRIX-0 Cross")
if ta.crossover(trix, 0)
strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
if ta.crossunder(trix, 0)
strategy.close_all('매도')
if (strategySignal == "Signal-0 Cross")
if ta.crossover(trix, 0)
strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
if ta.crossunder(trix, 0)
strategy.close_all('매도')
bgcolor(strategy.position_size > 0 ? color.new(color.yellow,90) : na)
- TRIX pandas-ta 소스
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr
data = fdr.DataReader('005930')
trix = ta.trix(close=data['Close'], length=18, signal=9)
data = pd.concat([data, trix], axis=1)
data.dropna(inplace=True)