Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
- // © loxx
- //@version=5
- indicator("Ehlers Adaptive Relative Strength Index (RSI) [Loxx]", overlay = false, shorttitle="EARSIA [Loxx]", timeframe="", timeframe_gaps=true, max_bars_back = 3000)
- greencolor = #2DD204
- redcolor = #D2042D
- _f_hp(_src, max_len) =>
- var c = 360 * math.pi / 180
- _alpha = (1 - math.sin(c / max_len)) / math.cos(c / max_len)
- _hp = 0.0
- _hp := 0.5 * (1 + _alpha) * (_src - nz(_src[1])) + _alpha * nz(_hp[1])
- _hp
- _f_ess(_src, _len) =>
- var s = 1.414 //sqrt 2
- _a = math.exp(-s * math.pi / _len)
- _b = 2 * _a * math.cos(s * math.pi / _len)
- _c2 = _b
- _c3 = -_a * _a
- _c1 = 1 - _c2 - _c3
- _out = 0.0
- _out := _c1 * (_src + nz(_src[1])) / 2 + _c2 * nz(_out[1], nz(_src[1], _src)) + _c3 * nz(_out[2], nz(_src[2], nz(_src[1], _src)))
- [_out, _c1, _c2, _c3]
- _auto_dom(src, min_len, max_len, ave_len) =>
- var c = 2 * math.pi
- var s = 1.414 //sqrt 2
- avglen = ave_len
- [filt, _, _, _] = _f_ess(_f_hp(src, max_len), min_len)
- arr_size = max_len * 2
- var corr = array.new_float(arr_size, initial_value=0)
- var cospart = array.new_float(arr_size, initial_value=0)
- var sinpart = array.new_float(arr_size, initial_value=0)
- var sqsum = array.new_float(arr_size, initial_value=0)
- var r1 = array.new_float(arr_size, initial_value=0)
- var r2 = array.new_float(arr_size, initial_value=0)
- var pwr = array.new_float(arr_size, initial_value=0)
- for lag = 0 to max_len by 1
- m = avglen == 0 ? lag : avglen
- Sx = 0.0
- Sy = 0.0
- Sxx = 0.0
- Syy = 0.0
- Sxy = 0.0
- for i = 0 to m - 1 by 1
- x = nz(filt[i])
- y = nz(filt[lag + i])
- Sx += x
- Sy += y
- Sxx += x * x
- Sxy += x * y
- Syy += y * y
- Syy
- if (m * Sxx - Sx * Sx) * (m * Syy - Sy * Sy) > 0
- array.set(corr, lag, (m * Sxy - Sx * Sy) / math.sqrt((m * Sxx - Sx * Sx) * (m * Syy - Sy * Sy)))
- for period = min_len to max_len by 1
- array.set(cospart, period, 0)
- array.set(sinpart, period, 0)
- for n = ave_len to max_len by 1
- array.set(cospart, period, nz(array.get(cospart, period)) + nz(array.get(corr, n)) * math.cos(c * n / period))
- array.set(sinpart, period, nz(array.get(sinpart, period)) + nz(array.get(corr, n)) * math.sin(c * n / period))
- array.set(sqsum, period, math.pow(nz(array.get(cospart, period)), 2) + math.pow(nz(array.get(sinpart, period)), 2))
- for period = min_len to max_len by 1
- array.set(r2, period, nz(array.get(r1, period)))
- array.set(r1, period, 0.2 * math.pow(nz(array.get(sqsum, period)), 2) + 0.8 * nz(array.get(r2, period)))
- maxpwr = 0.0
- maxpwr := 0.991 * maxpwr
- for period = min_len to max_len by 1
- if nz(array.get(r1, period)) > maxpwr
- maxpwr := nz(array.get(r1, period))
- for period = ave_len to max_len by 1
- if maxpwr != 0
- array.set(pwr, period, nz(array.get(r1, period)) / maxpwr)
- spx = 0.0
- sp = 0.0
- for period = min_len to max_len by 1
- if nz(array.get(pwr, period)) >= 0.5
- spx += period * nz(array.get(pwr, period))
- sp += nz(array.get(pwr, period))
- dominantcycle = 0.0
- dominantcycle := sp != 0 ? spx / sp : dominantcycle
- dominantcycle := math.min(math.max(dominantcycle, min_len), max_len)
- dominantcycle
- auto_src = input.source(close, title='Auto Source', group = "Autocorrelation")
- auto_min = input.int(10, minval = 1, title='Auto Min Length', group = "Autocorrelation")
- auto_max = input.int(48, minval = 1, title='Auto Max Length', group = "Autocorrelation")
- auto_avg = input.int(3, minval = 1, title='Auto Average Length', group = "Autocorrelation")
- [filt, c1, c2, c3] = _f_ess(_f_hp(auto_src, auto_max), auto_min)
- masterdom = _auto_dom(auto_src, auto_min, auto_max, auto_avg)
- len_out_bp_rsi = masterdom < 1 ? 1 : masterdom
- cup = 0.0
- cdn = 0.0
- for i = 0 to int(len_out_bp_rsi / 2 - 1) by 1
- if filt[i] > filt[i + 1]
- cup := cup + (filt[i] - filt[i + 1])
- if filt[i] < filt[i + 1]
- cdn := cdn + (filt[i + 1] - filt[i])
- denom = cup + cdn
- rsiout = 0.0
- if denom != 0 and denom[1] != 0
- rsiout := c1 * (cup / denom + cup[1] / denom[1]) / 2 + c2 * rsiout[1] + c3 * rsiout[2]
- plot(rsiout, color = rsiout > rsiout[1] ? greencolor : redcolor, linewidth = 3)
- plot(0.8, color=color.new(color.gray, 30), linewidth=1, style=plot.style_circles, title = "Overbought")
- plot(0.5, color=color.new(color.gray, 30), linewidth=1, style=plot.style_circles, title = "Middle")
- plot(0.2, color=color.new(color.gray, 30), linewidth=1, style=plot.style_circles, title = "Oversold")
Advertisement
Add Comment
Please, Sign In to add comment