
이것은 여러 기술 지표들을 결합한 트렌드 추적 전략으로, 주로 빠른 느린 지수 이동 평균 (EMA) 교차, 슈퍼 트렌드 트렌드 지표, 그리고 상대적으로 강한 지표 (RSI) 를 사용하여 거래 기회를 식별한다. 이 전략은 지표들의 유기적인 결합을 통해 트렌드 추적에 기초하여 동력을 필터링하고, ATR을 동적으로 스톱 포지션을 조정하는 동시에, 완전한 거래 시스템을 구현한다.
이 전략은 트레이딩 신호를 확인하기 위해 세 가지 필터링 메커니즘을 사용합니다.
이 전략은 또한 ATR 기반의 동적 중지 손실 차단 시스템을 포함하고 있으며, 시장의 변동성에 따라 자동으로 위험 관리 매개 변수를 조정할 수 있습니다. 또한 시간 필터를 통해 거래 기간을 제한하여 낮은 유동성 기간의 거래를 방지합니다.
이 전략은 여러 기술 지표와 필터링 조건을 결합하여 비교적 완전한 거래 시스템을 구축한다. 그것의 핵심 장점은 여러 확인 메커니즘과 동적 위험 관리에 있다. 그러나 또한 변수 최적화 및 거래 비용과 같은 문제에 주의를 기울여야 한다. 지속적인 최적화 및 개선으로 이 전략은 다양한 시장 환경에서 안정적인 성능을 유지할 것으로 보인다.
/*backtest
start: 2024-11-19 00:00:00
end: 2024-12-18 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="Supertrend + EMA Crossover with RSI Filter", shorttitle="ST_EMA_RSI", overlay=true)
// Input parameters for EMA
fastEMA = input.int(3, title="Fast EMA Period", minval=1)
slowEMA = input.int(6, title="Slow EMA Period", minval=1)
atrLength = input.int(3, title="ATR Length", minval=1)
// Using a fixed multiplier for Supertrend calculation
stMultiplier = 1
// Stop loss and take profit multipliers
stopLossATR = input.float(2.5, title="Stop Loss ATR Multiplier", minval=0.1, step=0.1)
takeProfitATR = input.float(4, title="Take Profit ATR Multiplier", minval=0.1, step=0.1)
// RSI inputs
rsiLength = input.int(10, title="RSI Length", minval=1)
rsiOverbought = input.float(65, title="RSI Overbought Level", minval=50.0, maxval=100.0)
rsiOversold = input.float(30.0, title="RSI Oversold Level", minval=0.0, maxval=50.0)
// Declare the RSI plot toggle input as a global variable
bool rsiPlotEnabled = input.bool(true, title="Show RSI in separate panel")
// Time filter inputs
i_startTime = input(title="Start Filter", defval=timestamp("01 Jan 2023 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime = input(title="End Filter", defval=timestamp("28 Apr 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")
// Date/time filtering logic
inDateRange = true
// Calculate EMAs
fastEMALine = ta.ema(close, fastEMA)
slowEMALine = ta.ema(close, slowEMA)
// Calculate ATR
atr = ta.atr(atrLength)
// Calculate Supertrend using fixed multiplier
up = high - (stMultiplier * atr)
dn = low + (stMultiplier * atr)
var float trendUp = na
var float trendDown = na
var int trend = na
trendUp := na(trendUp[1]) ? up : (close[1] > trendUp[1] ? math.min(up, trendUp[1]) : up)
trendDown := na(trendDown[1]) ? dn : (close[1] < trendDown[1] ? math.max(dn, trendDown[1]) : dn)
trend := close > nz(trendUp[1]) ? 1 : close < nz(trendDown[1]) ? -1 : nz(trend[1], 1)
supertrend = trend == 1 ? trendUp : trendDown
// Calculate RSI
myRSI = ta.rsi(close, rsiLength)
// Entry conditions with RSI filter
longEntryCondition = ta.crossover(fastEMALine, slowEMALine) and (trend == 1) and (myRSI < rsiOverbought)
shortEntryCondition = ta.crossunder(fastEMALine, slowEMALine) and (trend == -1) and (myRSI > rsiOversold)
// Strategy entries
if inDateRange and longEntryCondition and strategy.position_size <= 0
strategy.entry("Long", strategy.long)
if inDateRange and shortEntryCondition and strategy.position_size >= 0
strategy.entry("Short", strategy.short)
// Stops and targets
if strategy.position_size > 0
longStopLoss = strategy.position_avg_price - stopLossATR * atr
longTakeProfit = strategy.position_avg_price + takeProfitATR * atr
strategy.exit("Long SL/TP", "Long", stop=longStopLoss, limit=longTakeProfit)
if strategy.position_size < 0
shortStopLoss = strategy.position_avg_price + stopLossATR * atr
shortTakeProfit = strategy.position_avg_price - takeProfitATR * atr
strategy.exit("Short SL/TP", "Short", stop=shortStopLoss, limit=shortTakeProfit)
// Plot EMAs and Supertrend
plot(fastEMALine, title="Fast EMA", color=color.new(color.blue, 0))
plot(slowEMALine, title="Slow EMA", color=color.new(color.red, 0))
plot(trend == 1 ? supertrend : na, title="Supertrend Up", color=color.green, style=plot.style_linebr)
plot(trend == -1 ? supertrend : na, title="Supertrend Down", color=color.red, style=plot.style_linebr)
// Plot RSI and hlines
plot(rsiPlotEnabled ? myRSI : na, title="RSI", color=color.new(color.purple, 0))
hline(rsiOverbought, "Overbought", color=color.red, linestyle=hline.style_dotted)
hline(rsiOversold, "Oversold", color=color.green, linestyle=hline.style_dotted)
// Plot entry signals
plotshape(longEntryCondition, title="Long Entry Signal", style=shape.triangleup, location=location.belowbar, size=size.tiny, color=color.new(color.green, 0))
plotshape(shortEntryCondition, title="Short Entry Signal", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=color.new(color.red, 0))