기본 전략 예제¶
이동평균, RSI, 볼린저밴드 등 기본 지표를 활용한 전략 예제 모음입니다. 각 예제는 바로 복사해서 수정할 수 있도록 완성된 코드로 작성되어 있습니다.
1. 골든크로스 / 데드크로스¶
가장 기본적인 이동평균 크로스오버 전략입니다.
version("1.0")
description("SMA 골든크로스/데드크로스 전략")
param("fast", "fast", 5)
param("slow", "slow", 20)
c = chart("1D")
fast_ma = ta.sma(c.close, script_params["fast"])
slow_ma = ta.sma(c.close, script_params["slow"])
c.line("Fast", fast_ma, color="orange")
c.line("Slow", slow_ma, color="blue")
if fast_ma.cross_up(slow_ma):
c.marker("BUY", color="green", position="below", shape="triangle")
buy(tag=f"골든크로스: {script_params['fast']}일선 > {script_params['slow']}일선")
elif fast_ma.cross_down(slow_ma):
c.marker("SELL", color="red", position="above", shape="triangle")
sell(tag=f"데드크로스: {script_params['fast']}일선 < {script_params['slow']}일선")
else:
hold()
2. RSI 과매수/과매도 전략¶
RSI가 극단 구간에 진입했다가 빠져나올 때 매매합니다.
version("1.0")
description("RSI 과매수/과매도 반전 전략")
param("period", "period", 14)
param("overbought", "overbought", 70)
param("oversold", "oversold", 30)
c = chart("1D")
rsi = ta.rsi(c.close, script_params["period"])
c.line("RSI", rsi, color="purple")
c.hline("과매수", script_params["overbought"], color="red")
c.hline("과매도", script_params["oversold"], color="green")
c.hline("중심", 50, color="gray")
ob = script_params["overbought"]
os_level = script_params["oversold"]
# 과매도 구간에서 탈출할 때 매수
if rsi[1] < os_level and rsi[0] >= os_level:
buy(tag=f"RSI 과매도 탈출: {rsi[0]:.1f}")
# 과매수 구간에서 탈출할 때 매도
elif rsi[1] > ob and rsi[0] <= ob:
sell(tag=f"RSI 과매수 탈출: {rsi[0]:.1f}")
else:
hold()
3. 볼린저밴드 반전 전략¶
볼린저밴드의 상하단을 지지/저항으로 활용합니다.
version("1.0")
description("볼린저밴드 평균회귀 전략")
param("bb_period", "bb period", 20)
param("bb_std", "bb std", 2.0)
c = chart("1D")
upper, mid, lower = ta.bbands(c.close, script_params["bb_period"], script_params["bb_std"])
c.line("BB Upper", upper, color="red")
c.line("BB Mid", mid, color="gray")
c.line("BB Lower", lower, color="green")
# 하단밴드 이탈 후 반등 → 매수
if c.close[1] < lower[1] and c.close[0] > lower[0]:
buy(tag="볼린저밴드 하단 반등")
# 상단밴드 이탈 후 반락 → 매도
elif c.close[1] > upper[1] and c.close[0] < upper[0]:
sell(tag="볼린저밴드 상단 반락")
else:
hold()
4. 이동평균 정배열 전략¶
3개의 이동평균이 정배열(단기 > 중기 > 장기)일 때 매수합니다.
version("1.0")
description("이동평균 정배열 전략")
c = chart("1D")
sma5 = ta.sma(c.close, 5)
sma20 = ta.sma(c.close, 20)
sma60 = ta.sma(c.close, 60)
c.line("SMA 5", sma5, color="red")
c.line("SMA 20", sma20, color="blue")
c.line("SMA 60", sma60, color="green")
# 정배열: 5일 > 20일 > 60일
bullish_align = sma5 > sma20 and sma20 > sma60
# 역배열: 5일 < 20일 < 60일
bearish_align = sma5 < sma20 and sma20 < sma60
if bullish_align and c.close > sma5:
buy(tag="이동평균 정배열 + 가격 > 5일선")
elif bearish_align:
sell(tag="이동평균 역배열")
else:
hold(tag="혼조세")
5. 거래량 돌파 전략¶
평균 거래량의 2배 이상 거래량과 함께 가격이 상승하면 매수합니다.
version("1.0")
description("거래량 돌파 전략")
param("vol_mult", "vol mult", 2.0)
c = chart("1D")
vol_sma = ta.sma(c.volume, 20)
sma20 = ta.sma(c.close, 20)
c.line("SMA 20", sma20, color="blue")
# 거래량 폭증 + 양봉 + 이평선 위
vol_surge = c.volume[0] > vol_sma[0] * script_params["vol_mult"]
bullish_candle = c.close[0] > c.open[0]
above_ma = c.close > sma20
if vol_surge and bullish_candle and above_ma:
c.marker("VOL!", color="green", position="below", shape="circle")
buy(tag=f"거래량 {c.volume[0]/vol_sma[0]:.1f}배 폭증 + 양봉")
elif c.close < sma20:
sell(tag="이평선 이탈")
else:
hold()
6. ATR 기반 추세 추종¶
ATR을 활용한 트레일링 스탑 기반 전략입니다.
version("1.0")
description("ATR 트레일링 스탑 전략")
param("atr_mult", "atr mult", 2.0)
param("atr_period", "atr period", 14)
c = chart("1D")
atr = ta.atr(c.high, c.low, c.close, script_params["atr_period"])
sma20 = ta.sma(c.close, 20)
# ATR 기반 채널
upper_band = sma20[0] + atr[0] * script_params["atr_mult"]
lower_band = sma20[0] - atr[0] * script_params["atr_mult"]
c.line("SMA 20", sma20, color="blue")
c.hline("Upper", upper_band, color="red")
c.hline("Lower", lower_band, color="green")
if c.close[0] > upper_band:
buy(tag="ATR 상단 채널 돌파")
elif c.close[0] < lower_band:
sell(tag="ATR 하단 채널 이탈")
else:
hold()
7. 청산 규칙 조합 (rule.*)¶
rule.*을 사용하면 청산 규칙을 선언적으로 조합할 수 있습니다.
version("1.0")
description("EMA 크로스 + 복합 청산 규칙")
rule.order_on("5T")
rule.stop_loss(pct=param("손절%", "손절 기준 퍼센트", 3))
rule.take_profit(pct=param("익절%", "익절 기준 퍼센트", 10), qty_ratio=0.5)
rule.trailing_stop(pct=param("트레일링%", "고점 대비 하락 허용", 2))
rule.close_before(minutes=param("장마감전(분)", "장마감 전 정리 시간", 10))
c = chart("5T")
fast = ta.ema(c.close, 9)
slow = ta.ema(c.close, 21)
c.line("빠른 EMA", fast, "#ff8a00")
c.line("느린 EMA", slow, "#2979ff")
if barstate("5T").is_confirmed:
if ta.crossover(fast, slow):
buy(qty=param("수량", 1), tag="golden_cross")
rule.stop_loss(3)— 3% 손실 시 자동 청산rule.take_profit(10, qty_ratio=0.5)— 10% 수익 시 절반 매도rule.trailing_stop(2)— 고점 대비 2% 하락 시 청산rule.close_before(10)— 장마감 10분 전 자동 청산- 사용자가 직접
sell()/exit()을 호출하면 rule보다 우선합니다