How It Trades
- Compute the 20- and 50-bar weighted moving averages and their relative gap, (WMA20 − WMA50) / WMA50.
- Buy when the gap, rising from below, comes within 0.5% of zero: the fast average is about to overtake the slow one, so this acts one step before the actual crossover.
- Sell when the gap, falling from above, drops back within 0.5% of zero: exiting just before the bearish cross completes.
Example Strategy
Pine Script
Paste it into TradingView’s Pine Editor to run these rules on any chart.
//@version=6
// WMA 20 50 Proximity Crossover — 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 Proximity Crossover", 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)
gap = (fast - slow) / slow
// In when the gap rises into the 0.5% band around zero, out when it
// falls into it from above; the side holds until the next of those.
risingIn = gap[1] <= -0.005 and gap > -0.005
fallingIn = gap[1] >= 0.005 and gap < 0.005
var float held = 0.0
if risingIn
held := 1
if fallingIn
held := -1
inBand = held > 0
enterNow = inBand and not inBand[1]
exitNow = not inBand and inBand[1]
// ── 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)