
¿Sabías que esta estrategia imagina a los 5 EMA como un “río”? Al igual que los ríos reales tienen un lecho y un río, cuando los 5 EMA están alineados, la zona que se forma entre ellos es nuestro “río de tendencia”.
Es tan sencillo como ver la dirección de la corriente: a donde va el río, vamos nosotros.
¿Cuál es la parte más inteligente de esta estrategia? ¡No es subir cuando los precios están en alza, sino esperar pacientemente a que se “reajusten”!
¿Cómo funciona esto?
Como los tiburones, no bajan cuando están en su punto más alto, sino que esperan a que vuelvan a nadar en aguas conocidas.
¡La guía para evitar cavidades ya está aquí! La parte más familiar de esta estrategia es el cálculo automático del tamaño de la posición:
¡Es como el cinturón de seguridad en un auto - no para tener un accidente, sino para estar seguro y disfrutar de la conducción!
La solución a los tres problemas de los comerciantes:
Esta estrategia es especialmente adecuada para los comerciantes que quieren “ganar de manera estable”. No busca la riqueza de la noche a la mañana, pero puede ayudarlo a ganar dinero de manera estable en la tendencia! Recuerde: en el río del comercio, lo más importante no es nadar más rápido, sino nadar más estable.
||
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! 💰
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?
It’s like fishing - you don’t cast when fish jump highest, but wait for them to return to familiar waters! 🎣
Here’s the pitfall guide! The most thoughtful part of this strategy is automatic position sizing:
It’s like wearing a seatbelt while driving - not because you expect an accident, but to enjoy the ride with peace of mind! 🚗
Solves three major trader pain points:
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")