TradingView
alexgrover
15 Mei 2019 pukul 16.34

Well Rounded Moving Average 

PalladiumOANDA

Deskripsi

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.



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.

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

Komentar
aaahopper
You will never be replaced :)
Mupsje
Still Nice to use.
I'v converted it into v5 .

```
//@version=5
indicator('Well Rounded Moving Average', shorttitle='WRMA', overlay=true)

// Input parameters
length = input(title='Length', defval=14)
src = input(title='Source', defval=close)
smo = input(title='Extra Smooth', defval=false)

// Constants
alpha = 2 / (length + 1)

// Variables
var a = 0.0
var b = 0.0
var A = 0.0
var B = 0.0

// Calculations
p1 = smo ? length / 4 : 1
p2 = smo ? length / 4 : length / 2

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

// Plotting
plot(y, color=color.new(color.yellow, 0), linewidth=2)
```
theheirophant
learned alot from your write ups. always great stuff!!! sad to see you go, but focus on life mate... you will always be a legend here!
alexgrover
@theheirophant, I'm thankful to your words, i don't really care about being a legend but it means a lot when someone learn from my scripts, i hope people will still learn from my ideas and mistakes :)
cajole
Nice idea and writeup!
kamayapaint
hi.this very nice moving average.How can I add an alarm as "Buy when cut up" and "Sell when cut down".
henryph24
how can I migrate this to v4 pls
analyst_charles
Hi! Why are you using version2?
alexgrover
@emjccrypto, Hi, its an habit i have, i used version2 for a long time and when using recursion you don't need to declare the variable like in version 3, you can just use nz() and this save some time.
Lebih lanjut