트렌드 리버 풀백 전략

EMA RSI ATR CHANDELIER
생성 날짜: 2025-09-05 09:02:58 마지막으로 수정됨: 2025-09-05 09:02:58
복사: 0 클릭수: 274
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

트렌드 리버 풀백 전략 트렌드 리버 풀백 전략

“트렌드 강”이란 무엇인가요?

이 전략은 5개의 EMA 평선을 하나의 ‘강’으로 상상합니다. 마치 실제 강이 강 바닥과 강변을 가지고 있는 것처럼, 5개의 평선이 정렬되면, 그 사이에 형성되는 지역은 우리의 ‘트렌드 강’입니다.

이것은 마치 물이 흐르는 방향을 보는 것과 같습니다. 강이 어디로 흐르든, 우리는 어디로 가든 말입니다.

핵심 전략: 물고기가 강으로 돌아와서 그물을 내리는 것

이 전략의 가장 똑똑한 부분은 무엇이었을까요? 가격이 급격히 상승하는 것을 쫓지 않고, “회복”을 기다린다는 것입니다!

어떻게 해야 할까요?

  • 다단계 신호: 상승 추세 + RSI≥60 + 물가 리버로 40% 깊이로 회전 + 재빨리 EMA를 돌파
  • 허공 신호: 하향 트렌드 + RSI≤40 + 가격이 40% 높이의 강으로 부딪히고 + 빠른 EMA를 다시 넘어갑니다.

마치 상어처럼, 물고기가 가장 높이 뛰어내릴 때 내려가는 것이 아니라, 익숙한 물로 돌아오는 것을 기다립니다!

리스크 관리: 매번 자본금의 1%만 투자하세요

이 전략의 가장 친근한 부분은 자동으로 포지션 크기를 계산하는 것입니다.

  • 매 거래의 위험은 자본금의 1%에 제한됩니다.
  • ATR 지표로 스톱로스를 설정합니다.
  • 이득과 손실의 비율이 2:1로 설정되어 있습니다.
  • 그리고 들러는 이윤을 보호하기 위해

이것은 자동차 안전벨트와 비슷합니다. 사고를 당하기 위해서가 아니라, 운전을 즐기기 위해서입니다.

왜 이 전략이 관심있는가?

이 세 가지 문제점을 해결했습니다.

  1. 추격과 추락: 다시 경기 시작을 기다리세요, 고비지 접시를 피하세요
  2. 얼마인지 모르겠네요.자동으로 포지션을 계산하고, 위험을 통제할 수 있습니다.
  3. 언제 달릴지 모르겠어요.“지속이 멈추고, 추적이 멈추고”

이 전략은 특히 “정확하게 승리”하려는 거래자들에게 적합합니다. 그것은 하룻밤 사이에 부자가 되는 것을 추구하지 않지만, 추세에서 안정적으로 돈을 벌 수 있습니다! 기억하십시오: 거래의 강에서 가장 중요한 것은 가장 빨리 수영하는 것이 아니라 가장 안정적으로 수영하는 것입니다.

||

🌊 What is “Trend River”? This Analogy is Brilliant!

You know what? This strategy imagines 5 EMA lines as a “river”! Just like a real river has riverbed and surface, when 5 EMAs align properly, the area between them forms our “trend river”. Key point! When the river direction is clear (bullish: fast line above, bearish: fast line below), that’s when our money-making opportunities arrive!

It’s as simple as watching water flow direction - wherever the river flows, that’s where we profit! 💰

🎯 Core Strategy: Wait for Fish to Return Before Casting the Net

What’s the smartest part of this strategy? It doesn’t chase prices during rallies, but patiently waits for “pullbacks”!

How does it work exactly?

  • Long signal: Uptrend + RSI≥60 + Price pulls back to 40% river depth + Re-breaks above fast EMA
  • Short signal: Downtrend + RSI≤40 + Price bounces to 40% river height + Re-breaks below fast EMA

It’s like fishing - you don’t cast when fish jump highest, but wait for them to return to familiar waters! 🎣

💡 Risk Management: Only Risk 1% Capital Each Time

Here’s the pitfall guide! The most thoughtful part of this strategy is automatic position sizing:

  • Each trade risks only 1% of capital
  • Uses ATR indicator for stop loss (2x ATR)
  • Risk-reward ratio set at 2:1 (earn 2 to risk 1)
  • Plus Chandelier trailing stop to protect profits

It’s like wearing a seatbelt while driving - not because you expect an accident, but to enjoy the ride with peace of mind! 🚗

🚀 Why is This Strategy Worth Attention?

Solves three major trader pain points:

  1. FOMO trading: Wait for pullbacks instead of buying tops
  2. Position sizing confusion: Auto-calculates position size with controlled risk
  3. Exit uncertainty: Has stop loss, take profit, and trailing stop

This strategy is perfect for traders who want “steady wins”. It doesn’t promise overnight riches, but helps you profit steadily in trends! Remember: In the river of trading, the most important thing isn’t swimming fastest, but swimming most steadily 🏊‍♀️

[/trans]

전략 소스 코드
/*backtest
start: 2025-01-20 08:00:00
end: 2025-09-03 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Trend River Pullback Strategy v1", 
     overlay=true, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.02, 
     pyramiding=0, calc_on_order_fills=true, calc_on_every_tick=true, margin_long=1, margin_short=1)
// ===== Inputs
// EMA river
emaFastLen   = input.int(8,   "EMA1 (fast)")
ema2Len      = input.int(13,  "EMA2")
emaMidLen    = input.int(21,  "EMA3 (middle)")
ema4Len      = input.int(34,  "EMA4")
emaSlowLen   = input.int(55,  "EMA5 (slow)")
// Pullback and momentum
rsiLen       = input.int(14, "RSI length")
rsiOB        = input.int(60, "RSI trend threshold (long)")
rsiOS        = input.int(40, "RSI trend threshold (short)")
pullbackPct  = input.float(40.0, "Pullback depth % of river width", minval=0, maxval=100)
// Risk management
riskPct      = input.float(1.0, "Risk per trade % of capital", step=0.1, minval=0.1)
atrLen       = input.int(14, "ATR length (stop/trailing)")
atrMultSL    = input.float(2.0, "ATR multiplier for stop", step=0.1)
tpRR         = input.float(2.0, "Take profit R-multiple", step=0.1)
// Trailing stop
useTrail     = input.bool(true, "Enable trailing stop (Chandelier)")
trailMult    = input.float(3.0, "ATR multiplier for trailing", step=0.1)
// ===== Calculations
ema1  = ta.ema(close, emaFastLen)
ema2  = ta.ema(close, ema2Len)
ema3  = ta.ema(close, emaMidLen)
ema4  = ta.ema(close, ema4Len)
ema5  = ta.ema(close, emaSlowLen)
// River: top/bottom as envelope of averages
riverTop = math.max(math.max(ema1, ema2), math.max(ema3, math.max(ema4, ema5)))
riverBot = math.min(math.min(ema1, ema2), math.min(ema3, math.min(ema4, ema5)))
riverMid = (riverTop + riverBot) / 2.0
riverWidth = riverTop - riverBot
// Trend conditions: EMA alignment
bullAligned = ema1 > ema2 and ema2 > ema3 and ema3 > ema4 and ema4 > ema5
bearAligned = ema1 < ema2 and ema2 < ema3 and ema3 < ema4 and ema4 < ema5
// Momentum
rsi = ta.rsi(close, rsiLen)
// Pullback into river
pullbackLevelBull = riverTop - riverWidth * (pullbackPct/100.0)
pullbackLevelBear = riverBot + riverWidth * (pullbackPct/100.0)
pullbackOkBull = bullAligned and rsi >= rsiOB and low <= pullbackLevelBull
pullbackOkBear = bearAligned and rsi <= rsiOS and high >= pullbackLevelBear
// Entry trigger: return to momentum (fast EMA crossover)
longTrig  = pullbackOkBull and ta.crossover(close, ema1)
shortTrig = pullbackOkBear and ta.crossunder(close, ema1)
// ATR for stops
atr = ta.atr(atrLen)
// ===== Position sizing by risk
capital   = strategy.equity
riskMoney = capital * (riskPct/100.0)
// Preliminary stop levels
longSL  = close - atrMultSL * atr
shortSL = close + atrMultSL * atr
// Tick value and size
tickValue = syminfo.pointvalue
// Avoid division by zero
slDistLong  = math.max(close - longSL, syminfo.mintick)
slDistShort = math.max(shortSL - close, syminfo.mintick)
// Number of contracts/lots
qtyLong  = riskMoney / (slDistLong * tickValue)
qtyShort = riskMoney / (slDistShort * tickValue)
// Limit: not less than 0
qtyLong  := math.max(qtyLong, 0)
qtyShort := math.max(qtyShort, 0)
// ===== Entries
if longTrig and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, qty=qtyLong)
if shortTrig and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, qty=qtyShort)
// ===== Exits: fixed TP by R and stop
// Store entry price
var float entryPrice = na
if strategy.position_size != 0 and na(entryPrice)
    entryPrice := strategy.position_avg_price
if strategy.position_size == 0
    entryPrice := na
// Targets
longTP  = na(entryPrice) ? na : entryPrice + tpRR * (entryPrice - longSL)
shortTP = na(entryPrice) ? na : entryPrice - tpRR * (shortSL - entryPrice)
// Trailing: Chandelier
trailLong  = close - trailMult * atr
trailShort = close + trailMult * atr
// Final exit levels
useTrailLong  = useTrail and strategy.position_size > 0
useTrailShort = useTrail and strategy.position_size < 0
// For long
if strategy.position_size > 0
    stopL = math.max(longSL, na)
    tStop = useTrailLong ? trailLong : longSL
    strategy.exit("L-Exit", from_entry="Long", stop=tStop, limit=longTP)
// For short
if strategy.position_size < 0
    stopS = math.min(shortSL, na)
    tStopS = useTrailShort ? trailShort : shortSL
    strategy.exit("S-Exit", from_entry="Short", stop=tStopS, limit=shortTP)
// ===== Visuals
plot(ema1,  "EMA1",  display=display.all, linewidth=1)
plot(ema2,  "EMA2",  display=display.all, linewidth=1)
plot(ema3,  "EMA3",  display=display.all, linewidth=2)
plot(ema4,  "EMA4",  display=display.all, linewidth=1)
plot(ema5,  "EMA5",  display=display.all, linewidth=1)
plot(riverTop, "River Top",  style=plot.style_linebr, linewidth=1)
plot(riverBot, "River Bot",  style=plot.style_linebr, linewidth=1)
fill(plot1=plot(riverTop,  display=display.none), plot2=plot(riverBot, display=display.none), title="River Fill", transp=80)
plot(longTP,  "Long TP",  style=plot.style_linebr)
plot(shortTP, "Short TP", style=plot.style_linebr)
plot(useTrailLong  ? trailLong  : na, "Trail Long",  style=plot.style_linebr)
plot(useTrailShort ? trailShort : na, "Trail Short", style=plot.style_linebr)
// Signal markers
plotshape(longTrig,  title="Long Trigger",  style=shape.triangleup,   location=location.belowbar, size=size.tiny, text="L")
plotshape(shortTrig, title="Short Trigger", style=shape.triangledown, location=location.abovebar, size=size.tiny, text="S")
// ===== Alerts
alertcondition(longTrig,  title="Long Signal",  message="Long signal: trend aligned + pullback + momentum")
alertcondition(shortTrig, title="Short Signal", message="Short signal: trend aligned + pullback + momentum")