OPEN-SOURCE SCRIPT

Well Rounded Moving Average

Introduction

There are tons of filters, way to many, and some of them are redundant in the sense they produce the same results as others. The task to find an optimal filter is still a big challenge among technical analysis and engineering, a good filter is the Kalman filter who is one of the more precise filters out there. The optimal filter theorem state that : The optimal estimator has the form of a linear observer , this in short mean that an optimal filter must use measurements of the inputs and outputs, and this is what does the Kalman filter. I have tried myself to Kalman filters with more or less success as well as understanding optimality by studying Linear–quadratic–Gaussian control, i failed to get a complete understanding of those subjects but today i present a moving average filter (WRMA) constructed with all the knowledge i have in control theory and who aim to provide a very well response to market price, this mean low lag for fast decision timing and low overshoots for better precision.

Construction

An good filter must use information about its output, this is what exponential smoothing is about, simple exponential smoothing (EMA) is close to a simple moving average and can be defined as :

output = output(1) + α(input - output(1))

where α (alpha) is a smoothing constant, typically equal to 2/(Period+1) for the EMA.

This approach can be further developed by introducing more smoothing constants and output control (See double/triple exponential smoothing - alpha-beta filter).

The moving average i propose will use only one smoothing constant, and is described as follow :

  • a = nz(a[1]) + alpha*nz(A[1])
  • b = nz(b[1]) + alpha*nz(B[1])
  • y = ema(a + b,p1)
  • A = src - y
  • B = src - ema(y,p2)


The filter is divided into two components a and b (more terms can add more control/effects if chosen well), a adjust itself to the output error and is responsive while b is independent of the output and is mainly smoother, adding those components together create an output y, A is the output error and B is the error of an exponential moving average.

Comparison

There are a lot of low-lag filters out there, but the overshoots they induce in order to reduce lag is not a great effect. The first comparison is with a least square moving average, a moving average who fit a line in a price window of period length.

snapshot

Lsma in blue and WRMA in red with both length = 100. The lsma is a bit smoother but induce terrible overshoots

snapshot

ZLMA in blue and WRMA in red with both length = 100. The lag difference between each moving average is really low while VWRMA is way more precise.

snapshot

Hull MA in blue and WRMA in red with both length = 100. The Hull MA have similar overshoots than the LSMA.

snapshot

Reduced overshoots moving average (ROMA) in blue and WRMA in red with both length = 100. ROMA is an indicator i have made to reduce the overshoots of a LSMA, but at the end WRMA still reduce way more the overshoots while being smoother and having similar lag.

I have added a smoother version, just activate the extra smooth option in the indicator settings window. Here the result with length = 200 :

snapshot

This result is a little bit similar to a 2 order Butterworth filter. Our filter have more overshoots which in this case could be useful to reduce the error with edges since other low pass filters tend to smooth their amplitude thus reducing edge estimation precision.

Conclusions

I have presented a well rounded filter in term of smoothness/stability and reactivity. Try to add more terms to have different results, you could maybe end up with interesting results, if its the case share them with the community :)

As for control theory i have seen neural networks integrated to Kalman flters which leaded to great accuracy, AI is everywhere and promise to be a game a changer in real time data smoothing. So i asked myself if it was possible for a neural networks to develop pinescript indicators, if yes then i could be replaced by AI ? Brrr how frightening.

Thanks for reading :)

Exponential Moving Average (EMA)filterkalmanLeast Squares Moving Average (LSMA)Moving Averagesnolagovershootsmoothingzerolag

Open-source script

In true TradingView spirit, the author of this script has published it open-source, so traders can understand and verify it. Cheers to the author! You may use it for free, but reuse of this code in publication is governed by House rules. You can favorite it to use it on a chart.

Want to use this script on a chart?


Check out the indicators we are making at luxalgo: tradingview.com/u/LuxAlgo/
Also on:

Disclaimer