Price WMA 20 50 200 Stack

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 three weighted moving averages of the close, over 20, 50 and 200 bars.
  2. Buy when price and all three averages are in order at once: the close above the 20, the 20 above the 50, the 50 above the 200. The plain 20/50/200 stack asks only that the averages line up, and because the 20 lags price, that can still read bullish for a stretch after price has turned down. Putting the close at the top of the ladder means every horizon agrees on the bar the trade is opened.
  3. Sell when the 20 drops back below the 50 — the same exit as the rest of the stack family. Price slipping under the 20 is not an exit: it happens constantly inside a healthy trend, and selling there would cut every winner short.

Example Strategy

Pine Script

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

//@version=6
// Price WMA 20 50 200 Stack — 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("Price WMA 20 50 200 Stack", 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)
mid = ta.wma(close, 50)
slow = ta.wma(close, 200)
aligned = close > fast and fast > mid and mid > slow
enterNow = aligned and not aligned[1]
exitNow = fast < mid

// ── 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(mid, "WMA 50", color=#e0a03a)
plot(slow, "WMA 200", color=#8a92a0)