WMA 20 50 ATR Trailing Stop

How this strategy trades, what it scored, and the measurements the score was read from: every symbol and timeframe, on real and resampled history.

How It Trades

  1. Compute the 20- and 50-bar weighted moving averages and the 22-bar average range.
  2. Buy when the 20-bar WMA crosses above the 50-bar.
  3. While in the trade, track the highest close since entry and trail a stop 3 average ranges below it: the stop only ever moves up.
  4. Sell on whichever comes first: the averages crossing back down, or price hitting the trailing stop, locking in profit on a sharp reversal without waiting for the slow averages to cross.

Example Strategy

Pine Script

Paste it into TradingView’s Pine Editor to run these rules on any chart.

//@version=6
// WMA 20 50 ATR Trailing Stop — sort.finance. Fills at the signal bar's close, 0.02% fee a side,
// whole account per trade, as the backtest. History and indicator warm-up
// differ from the site's, so expect close to the same trades, not identical.
strategy("WMA 20 50 ATR Trailing Stop", overlay=true,
     initial_capital=100, default_qty_type=strategy.percent_of_equity,
     default_qty_value=100, commission_type=strategy.commission.percent,
     commission_value=0.02, process_orders_on_close=true, pyramiding=0)

// The bar the current position opened on, and the bar the last one closed on.
var int entryBar = na
var int exitBar = -1

// ── Signals ──────────────────────────────────────────────────────────────
fast = ta.wma(close, 20)
slow = ta.wma(close, 50)
rangeAverage = ta.sma(ta.tr(true), 22)
above = fast > slow
// The stop trails the highest close since entry by three average
// true ranges; flat, the high-water mark is the bar's own close.
var float highestClose = na
highestClose := strategy.position_size == 0 ? close : math.max(highestClose, close)
stopLevel = highestClose - 3.0 * rangeAverage
enterNow = above and not above[1]
exitNow = (above[1] and not above) or close <= stopLevel

// ── Orders ───────────────────────────────────────────────────────────────
// Open on the first bar the entry holds while flat; close on the first
// later bar the exit holds; never reopen on the bar a position closed.
inTrade = strategy.position_size != 0
if inTrade and bar_index > entryBar and exitNow
    strategy.close("Long")
    exitBar := bar_index
else if not inTrade and bar_index > exitBar and enterNow
    strategy.entry("Long", strategy.long)
    entryBar := bar_index

// ── Drawing ──────────────────────────────────────────────────────────────
plot(fast, "WMA 20", color=#4d8dff)
plot(slow, "WMA 50", color=#e0a03a)
plot(strategy.position_size != 0 ? stopLevel : na, "Trailing Stop", color=#b54a48, style=plot.style_linebr)