
Bạn có biết không? Chiến lược này hình dung 5 đường EMA là một “con sông”! Giống như con sông thực sự có đáy và mặt sông, khi 5 đường EMA được sắp xếp một cách gọn gàng, khu vực hình thành giữa chúng là “con sông xu hướng” của chúng ta.
Điều này cũng đơn giản như việc nhìn thấy dòng chảy - dòng sông chảy về đâu, và chúng ta sẽ đi về đâu.
Đâu là điểm thông minh nhất của chiến lược này? Nó không tăng giá khi giá tăng mạnh, mà là kiên nhẫn chờ đợi “đổi lại”!
Làm thế nào để thực hiện?
Giống như một con cá mập, không phải là con cá nhảy xuống khi nó nhảy cao nhất, mà là chờ nó bơi trở lại vùng nước quen thuộc!
Một trong những phần thân thiện nhất của chiến lược này là tính toán tự động kích thước vị trí:
Nó giống như dây an toàn trong xe hơi - không phải để tránh tai nạn, mà là để an toàn và tận hưởng niềm vui khi lái xe!
Nó giải quyết được 3 vấn đề lớn của các nhà giao dịch:
Chiến lược này đặc biệt phù hợp với những nhà giao dịch muốn “vận chiến một cách ổn định”. Nó không theo đuổi sự giàu có qua đêm, nhưng nó có thể giúp bạn kiếm tiền một cách ổn định trong xu hướng!
||
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")