Well Rounded Moving Average


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.


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) + alpha*nz(A)
  • b = nz (b) + alpha*nz(B)
  • 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 .


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.

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

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.

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

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 :

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.


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 :)


Become a Patreon and get access to exclusive technical indicators!

You can also check out some of the indicators I made for luxalgo :
Script de código aberto

Dentro do verdadeiro espírito TradingView, o autor deste script publicou ele como um script de código aberto, para que os traders possam compreender e checar ele. Um viva ao autor! Você pode usá-lo gratuitamente, mas a reutilização deste código em uma publicação é regida pelas Regras da Casa. Você pode favoritá-lo para usá-lo em um gráfico.

Aviso legal

As informações e publicações não devem ser e não constituem conselhos ou recomendações financeiras, de investimento, de negociação ou de qualquer outro tipo, fornecidas ou endossadas pela TradingView. Leia mais em Termos de uso.

Quer usar esse script no gráfico?