
この戦略は5つのEMA均線を”川”として考えます. 川の底と川面があるように,5つの均線が整列すると,その間の領域が”トレンド川”になります. 焦点を絞りましょう. 川の方向が明確になったとき (多頭:快線上,空頭:快線下) 稼ぐチャンスです.
川の流れの方向を見るのと 同じくらい簡単です 川の流れがどこへ行くか,私たちもどこへ行くか
この戦略の最も賢いところは,価格が急上昇した時に上昇を促すのではなく,忍耐強く”逆調”を待つことです.
具体的にはどうでしょうか?
魚が飛び上がった時に落ちるのではなく 慣れた水域に戻るまで待つように!
この戦略の最も親切なところは,ポジションの大きさを自動的に計算することです.
車の安全帯のようなものです 事故を避けるためではなく,安全で楽しい運転をするために!
取引者の3つの痛みを解決しました.
この戦略は”安定して勝ちたい”トレーダーに特に適しています. 一夜にして金持ちになるのではなく,トレンドの中で安定して儲けるのに役立ちます.
||
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")