Page 1 of 2
Moving Average Bounce Scalping
Posted: Fri Aug 21, 2026 10:03 pm
by Fairman
In a market that's already established a clear trend, price frequently pulls back to a key moving average — commonly the 20 or 50 period exponential moving average — before resuming its original direction. This pullback-and-continuation behavior is one of the more reliable, repeatable patterns available to trend-following scalpers.
The key discipline here is waiting for genuine confirmation of the bounce rather than anticipating it. Watch for a candle that closes clearly in the direction of the established trend, right around the moving average, ideally with some added conviction — a full-bodied candle rather than a hesitant, indecisive one.
Enter in the direction of the broader trend once that confirmation candle closes, placing your stop-loss beyond the most recent swing low (for a long entry) or swing high (for a short entry). This stop placement respects the actual market structure rather than an arbitrary distance from the moving average itself.
This approach tends to underperform in genuinely choppy, range-bound conditions where there's no clear trend for price to "continue" after the pullback — so it's worth confirming on a higher timeframe that a real trend is actually in place before relying on this setup, rather than applying it indiscriminately to every touch of a moving average.
Re: Moving Average Bounce Scalping
Posted: Sat Aug 22, 2026 1:21 pm
by PTScalper
Hi Fairman,
yeah moving average can be usefull especially from H4 charts with combination of fibonacci retracement.
It gives you good sign, where market could be little bit more volatile around some important support or resistance.
Because activity means volatility and volatility means opportunity

Re: Moving Average Bounce Scalping
Posted: Sun Aug 23, 2026 11:01 pm
by Fairman
PTScalper wrote: Sat Aug 22, 2026 1:21 pm
Hi Fairman,
yeah moving average can be usefull especially from H4 charts with combination of fibonacci retracement.
It gives you good sign, where market could be little bit more volatile around some important support or resistance.
Because activity means volatility and volatility means opportunity
I like how you structured your response
I also gained a couple things
Activity means volatility and volatility means opportunity
That’s a masterpiece
Re: Moving Average Bounce Scalping
Posted: Mon Aug 24, 2026 8:17 pm
by PTScalper
Fairman wrote: Sun Aug 23, 2026 11:01 pm
PTScalper wrote: Sat Aug 22, 2026 1:21 pm
Hi Fairman,
yeah moving average can be usefull especially from H4 charts with combination of fibonacci retracement.
It gives you good sign, where market could be little bit more volatile around some important support or resistance.
Because activity means volatility and volatility means opportunity
I like how you structured your response
I also gained a couple things
Activity means volatility and volatility means opportunity
That’s a masterpiece
HI Fairman,
yeah i heard very similar quote at presentation of trader from Goldman Sachs, very smart guy.
Re: Moving Average Bounce Scalping
Posted: Sun Sep 13, 2026 7:46 pm
by LondonScalper
Fairman wrote:waiting for genuine confirmation of the bounce rather than anticipating it
This is the whole game on MA-bounce scalps. Anticipating the touch is how you buy the knife; waiting for a close back in trend direction around the 20/50 EMA is slower and usually cleaner.
I run this mostly on M5/M15 with H1/H4 bias clear. Stop beyond the swing that defines the pullback, not a fixed pip distance from the average — averages move, structure is the invalidation. In chop, the same bounce pattern is just a whip; I want higher-TF slope and room toward a next level.
Combining with Fib retracements on H4, as PTScalper mentioned, can help map where a pullback “should” find interest — still secondary to the confirmation close.
Quiet question for the thread: how many candles do you allow the price to lean on the EMA before you call the bounce failed and walk away?
Re: Moving Average Bounce Scalping
Posted: Tue Sep 22, 2026 6:06 pm
by PTScalper
As i promised i prepared some script, which will explain this strategy.
Pine script:
Code: Select all
//@version=5
strategy("EMA Pullback & Continuation", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// --- Inputs ---
emaFastLen = input.int(20, title="Fast EMA (Pullback Target)")
emaSlowLen = input.int(50, title="Slow EMA (Trend Direction)")
emaTrendLen = input.int(200, title="200 EMA (Macro Trend Filter)")
swingLookback = input.int(5, title="Swing High/Low Lookback (Stops)")
riskReward = input.float(2.0, title="Risk/Reward Ratio")
// --- Indicators ---
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
emaTrend = ta.ema(close, emaTrendLen)
plot(emaFast, color=color.new(color.blue, 0), title="20 EMA")
plot(emaSlow, color=color.new(color.orange, 0), title="50 EMA")
plot(emaTrend, color=color.new(color.gray, 50), title="200 EMA")
// --- Market Structure & Trend Filters ---
// Ensure price and moving averages are stacked in the direction of the trend
bullishTrend = close > emaTrend and emaFast > emaSlow
bearishTrend = close < emaTrend and emaFast < emaSlow
// --- Pullback & Conviction Logic ---
// Long: Price touches or dips below 20 EMA, but closes above it.
// Conviction: Candle is bullish and body makes up more than 50% of the total candle range.
pulledBackLong = low <= emaFast and close > emaFast
bullishConviction = (close > open) and ((close - open) / (high - low) > 0.5)
longCondition = bullishTrend and pulledBackLong and bullishConviction
// Short: Price touches or spikes above 20 EMA, but closes below it.
// Conviction: Candle is bearish and body makes up more than 50% of the total candle range.
pulledBackShort = high >= emaFast and close < emaFast
bearishConviction = (open > close) and ((open - close) / (high - low) > 0.5)
shortCondition = bearishTrend and pulledBackShort and bearishConviction
// --- Execution & Risk Management ---
var float stopLoss = na
var float takeProfit = na
// Long Entry
if longCondition and strategy.position_size == 0
// Stop loss placed at the lowest low of the last N candles
stopLoss := ta.lowest(low, swingLookback)
// Calculate risk to project the take profit target
risk = close - stopLoss
takeProfit := close + (risk * riskReward)
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", "Long", stop=stopLoss, limit=takeProfit)
// Short Entry
if shortCondition and strategy.position_size == 0
// Stop loss placed at the highest high of the last N candles
stopLoss := ta.highest(high, swingLookback)
// Calculate risk to project the take profit target
risk = stopLoss - close
takeProfit := close - (risk * riskReward)
strategy.entry("Short", strategy.short)
strategy.exit("Exit Short", "Short", stop=stopLoss, limit=takeProfit)
Re: Moving Average Bounce Scalping
Posted: Tue Sep 22, 2026 6:07 pm
by PTScalper
Strategy Mechanics Breakdown
1. The "Higher Timeframe" Trend Filter
Instead of forcing you to check multiple timeframes manually, the script uses a 200-period EMA combined with the relationship between the 20 and 50 EMAs. For a long setup to trigger, the 20 EMA must be above the 50 EMA, and the current price must be above the 200 EMA. This inherently filters out choppy, range-bound environments where the moving averages intertwine.
2. The Pullback & Conviction Trigger
The script isolates the exact "pullback-and-continuation" behavior using two strict rules:
The Touch: The wick (low/high) must pierce or touch the 20 EMA, proving the market actually pulled back to the mean.
The Conviction: The candle must close back in the direction of the trend, and the body of the candle must account for more than 50% of its total high-to-low range. This mathematically filters out indecisive doji candles or weak closes, ensuring buyers (or sellers) have actually regained control.
Re: Moving Average Bounce Scalping
Posted: Tue Sep 22, 2026 6:07 pm
by PTScalper
3. Dynamic Market-Structure Stops
Stop losses are not based on arbitrary percentages or a fixed distance from the EMA. The script uses a ta.lowest (for longs) and ta.highest (for shorts) lookback function. When the conviction candle closes, the algorithm looks back at the last 5 candles (adjustable in inputs) to find the absolute swing low or high, and places the stop there.
4. Risk-to-Reward Targeting
Once the market structure stop is identified, the script calculates the exact pip/point risk on the trade. It then automatically projects a Take Profit order at a 1:2 Risk/Reward ratio (e.g., risking $50 to make $100). You can adjust this ratio directly in the TradingView settings menu based on your preferred scalping targets.
Re: Moving Average Bounce Scalping
Posted: Tue Sep 22, 2026 6:08 pm
by PTScalper
Here is update Pine script more in Pro Level:
Code: Select all
//@version=5
strategy("EMA Pullback & Trailing Continuation", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// --- Inputs ---
emaFastLen = input.int(20, title="Fast EMA (Pullback Target)")
emaSlowLen = input.int(50, title="Slow EMA (Trend Direction)")
emaTrendLen = input.int(200, title="200 EMA (Macro Trend Filter)")
swingLookback = input.int(5, title="Swing High/Low Lookback (Initial Stop)")
// New Inputs for Trailing Stop
trailAtrMult = input.float(2.5, title="Trailing ATR Multiplier")
atrLen = input.int(14, title="ATR Length")
// --- Indicators ---
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
emaTrend = ta.ema(close, emaTrendLen)
atr = ta.atr(atrLen)
plot(emaFast, color=color.new(color.blue, 0), title="20 EMA")
plot(emaSlow, color=color.new(color.orange, 0), title="50 EMA")
plot(emaTrend, color=color.new(color.gray, 50), title="200 EMA")
// --- Market Structure & Trend Filters ---
bullishTrend = close > emaTrend and emaFast > emaSlow
bearishTrend = close < emaTrend and emaFast < emaSlow
// --- Pullback & Conviction Logic ---
pulledBackLong = low <= emaFast and close > emaFast
bullishConviction = (close > open) and ((close - open) / (high - low) > 0.5)
longCondition = bullishTrend and pulledBackLong and bullishConviction
pulledBackShort = high >= emaFast and close < emaFast
bearishConviction = (open > close) and ((open - close) / (high - low) > 0.5)
shortCondition = bearishTrend and pulledBackShort and bearishConviction
// --- Execution & Risk Management ---
var float stopLoss = na
// 1. Initial Entries and Market Structure Stop Placement
if longCondition and strategy.position_size == 0
stopLoss := ta.lowest(low, swingLookback)
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", "Long", stop=stopLoss)
if shortCondition and strategy.position_size == 0
stopLoss := ta.highest(high, swingLookback)
strategy.entry("Short", strategy.short)
strategy.exit("Exit Short", "Short", stop=stopLoss)
// 2. Dynamic ATR Trailing Logic (Executes only while in an active trade)
if strategy.position_size > 0
// Calculate trail level from the current highest point
trailLevel = high - (atr * trailAtrMult)
// Ratchet Mechanism: Stop loss can only move UP, never down
if trailLevel > stopLoss
stopLoss := trailLevel
// Continually update the exit order with the new stop
strategy.exit("Exit Long", "Long", stop=stopLoss)
if strategy.position_size < 0
// Calculate trail level from the current lowest point
trailLevel = low + (atr * trailAtrMult)
// Ratchet Mechanism: Stop loss can only move DOWN, never up
if trailLevel < stopLoss
stopLoss := trailLevel
// Continually update the exit order with the new stop
strategy.exit("Exit Short", "Short", stop=stopLoss)
// 3. Visual Feedback for the Trailing Stop
plot(strategy.position_size != 0 ? stopLoss : na, color=color.fuchsia, style=plot.style_linebr, linewidth=2, title="Active Trailing Stop")
Re: Moving Average Bounce Scalping
Posted: Tue Sep 22, 2026 6:09 pm
by PTScalper
Key Modifications
ATR-Based Volatility Trailing:
The fixed Take Profit logic has been replaced with an Average True Range (ATR) trailing stop. By subtracting a multiple of the ATR (default 2.5) from the current bar's high (for long trades), the stop loss dynamically adjusts to current market volatility. This allows the trend breathing room to pull back slightly without knocking you out prematurely.
The "Ratchet" Mechanism:
In the execution block, the script calculates a new trailLevel on every bar. The crucial part is the if trailLevel > stopLoss (for longs) condition. This ensures the stop loss can only move favorably in the direction of your trade. If price drops, the stop loss holds its ground.
Hybrid Stop Loss Placement:
The strategy still uses the structural swing low/high (swingLookback) for the initial stop placement upon entry. The ATR trailing stop only begins pulling the stop-loss forward once the trend pushes far enough to create a trail level that exceeds that initial structural risk.
Visual Tracking Line:
A plot function has been added at the bottom. When you enter a trade, a fuchsia line will appear on the chart showing exactly where your trailing stop is dynamically holding. When the trade exits, the line vanishes.