0bps

Strategy vault / Mean reversion

Williams R Smoothed

From TradingView's description: Williams %R (%R) is a momentum-based oscillator used in technical analysis , primarily to identify overbought and oversold conditions. The %R is based on a comparison between the…

Author
ChaoZhang
Complexity
Starter · 58 lines
Parameters
5
Backtest bar
4h · intraday
Tested on
BTC/USDT · futures

From TradingView's description: Williams %R (%R) is a momentum-based oscillator used in technical analysis , primarily to identify overbought and oversold conditions. The %R is based on a comparison between the current close and the highest high for a user defined look back period. %R Oscillates between 0 and -100 (note the negative values) with readings closer to zero indicating more overbought conditions and readings closer to -100 indicating oversold. Typically %R can generate set ups based on overbought and oversold conditions as well overall changes in momentum.

What's special? This indicator adds two additional EMA lines to the original Williams %R indicator. Default EMA lengths are 5 and 13. The result is 2 smoother average lines, which are easier to read. This indicator includes:

  • signals for EMA crosses. EMA crosses can help indicate confirmed trend changes. Default colors are green and red
  • signals for trend reversals on the faster EMA line. Default colors are blue and orange

Alerts available for bullish / bearish crossovers and reversals.

Enjoy~~!

backtest

IMG

Parameters

NameDefaultWhat it controls
v_input_int_134length
v_input_15Smoothed %R Length
v_input_213Slow EMA Length
v_input_bool_1trueShow EMA Crossovers
v_input_bool_2trueShow trend reversals

Source Pine Script

/*backtest
start: 2022-02-08 00:00:00
end: 2022-05-08 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © platsn

//@version=5
indicator(title='Williams %R - Smoothed', shorttitle='The Smooth Willy')

// Williams %R
length = input.int(defval=34, minval=1)
upper = ta.highest(length)
lower = ta.lowest(length)

output = 100 * (close - upper) / (upper - lower)

fast_period = input(defval=5, title='Smoothed %R Length')
slow_period = input(defval=13, title='Slow EMA Length')

fast_ema = ta.wma(output,fast_period)
slow_ema = ta.ema(output,slow_period)

// Plot
//h1 = hline(-20, title='Upper Band')
//h2 = hline(-80, title='Lower Band')
//fill(h1, h2, title='Background', transp=90)

plot(output, title='%R', color=color.new(color.white, 80), linewidth=1)
plot(fast_ema, title='Smoothed %R', color=color.new(color.yellow, 0), linewidth=2)
plot(slow_ema, title='Slow EMA', color=color.new(color.aqua, 0), linewidth=2)

bullX = ta.crossover(fast_ema, slow_ema)
bearX = ta.crossunder(fast_ema, slow_ema)
bullreverse = fast_ema[2] > fast_ema[1] and fast_ema > fast_ema[1] and fast_ema < -30
bearreverse = fast_ema[2] < fast_ema[1] and fast_ema < fast_ema[1] and fast_ema > -70

plotX = input.bool(true, "Show EMA Crossovers")
plotRev = input.bool(true, "Show trend reversals")

//plotshape(plotX and bearX ,"Cross down", color=color.red, style=shape.triangledown, location = location.top, size =size.tiny, offset=-1) 
//plotshape(plotX and bullX ,"Cross up", color=color.green, style=shape.triangleup, location = location.bottom, size =size.tiny, offset=-1)
//plotshape(plotRev and bearreverse ,"Bear reversal", color=color.orange, style=shape.triangledown, location = location.top, size =size.tiny, offset=-1) 
//plotshape(plotRev and bullreverse ,"Bull reversal", color=color.blue, style=shape.triangleup, location = location.bottom, size =size.tiny, offset=-1)

//alertcondition(bearX,"Bearish Crossover", "Bearish cross on William %R")
//alertcondition(bullX,"Bullish Crossover", "Bullish cross on William %R")
//alertcondition(bearreverse,"Bearish Reversal", "Bearish Reversal on William %R")
//alertcondition(bullreverse,"Billish Reversal", "Bullish Reversal on William %R")

if plotRev and bullreverse
    strategy.entry("Enter Long", strategy.long)
else if plotRev and bearreverse
    strategy.entry("Enter Short", strategy.short)

Published by ChaoZhang on the FMZ strategy square · last modified 2022-05-09. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.

Build this with AgenKit

A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.

in Claude Code, Cursor, Codex & 4 more
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/Williams-R-Smoothed.md
  1. npx agenkit install engineering-kit in your project
  2. Paste the command into your agent and approve each phase
  3. Get tests, backtest, risk controls and a paper-trading switch

Understand it first

Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.

Related specs

esc

Try , , or .

↑↓ move↵ open