...
Jurik Research, the real people who been doing real things by using the real instruments, while many others been reading books "How to become a billionaire in 2 days", watching 5687 hours videos of how to use RSI, and studying+applying machine learning to everything cuz suddenly it became trendy xD
...
This is my remake of the original Jurik Moving Average (JMA) based on all the info I managed to get my hands on, some stuff is dated back to 2008 or smth.
The whole point of this filter, the point missed by other attempts of its remakes even posted there on TV, is that it takes into account volatility and adjusts its speed based on it.
Think about it as an EMA, where the alpha parameter is dynamic.
Now, by all means I'm not claiming that's this is the perfect replica of the original algo. I've tested it a lot, looks like it's working legit...
Code: Select all
//@version=4
study('Jurik Moving Average', 'JMA', true, resolution='')
//pine_jma[
pine_jma(_src, _length, _phase) =>
lower_band = _src
upper_band = _src
del2 = abs(_src - lower_band[1])
del1 = abs(_src - upper_band[1])
vola = del1 == del2 ? 0 : max(del1, del2)
vola_sum = 0.0
vola_sum := nz(vola_sum[1]) + 0.1 * (vola - vola[10])
avg_len = 65
// avg_len = _length * 10
y = bar_index + 1
avg_vola = 0.0
avg_vola := if y <= avg_len + 1
nz(avg_vola[1]) + 2.0 * (vola_sum - nz(avg_vola[1]))/(avg_len + 1)
else
sma(vola_sum, avg_len)
len = 0.5 * (_length - 1)
len1 = max(log(sqrt(len)) / log(2) + 2, 0)
pow1 = max(len1 - 2, 0.5)
r_vola = avg_vola > 0 ? vola / avg_vola : 0
r_vola := if r_vola > pow(len1, 1 / pow1)
pow(len1, 1 / pow1)
else if r_vola < 1
1
else
r_vola
pow2 = pow(r_vola, pow1)
len2 = sqrt(len) * len1
bet = len2/(len2 + 1)
kv = pow(bet, sqrt(pow2))
lower_band := y == 1 ? _src : del2 < 0 ? _src : _src - kv * del2
upper_band := y == 1 ? _src : del1 < 0 ? _src : _src + kv * del1
beta = 0.45 * (len - 1) / (0.45 * (len - 1) + 2)
pr = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
alpha = pow(beta, pow2)
ma1 = 0.0
det0 = 0.0
jma = 0.0
det1 = 0.0
ma1 := (1 - alpha) * _src + alpha * nz(ma1[1])
det0 := (_src - ma1) * (1 - beta) + beta * nz(det0[1])
ma2 = ma1 + pr * det0
det1 := (ma2 - nz(jma[1])) * pow((1 - alpha), 2) + pow(alpha, 2) * nz(det1[1])
jma := nz(jma[1]) + det1
//]
source = input(close, 'Source', inline='1')
log = input(false, 'Log transform', inline='1')
length = input(13, inline='2')
phase = input(0, inline='2')
offset = input(0)
src = log ? log(source) : source
pre_jma = pine_jma(src, length, phase)
jma = log ? exp(pre_jma) : pre_jma
jma_color = jma > jma[1] ? color.blue : color.red
plot(jma, 'JMA', jma_color, 2, offset=offset)