Indicator ยท Pine Script v5 ยท Own pane

Hurst Spectral Analysis Oscillator

by mikeyhu70

A Pine Script v5 indicator in a separate pane that plots cycle waves from Hurst-style bandpass filters applied to the hl2 price.

View on GitHub

GitHub stars1on the repository
Pine versionv5runs as is
Lines of code237
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update6 months ago15 Apr 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

237 lines of Pine Script v5 from Hurst/Hurst Spectral Analysis Oscillator.txt, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

Hurst Spectral Analysis Oscillator.txt
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

//@version=5
indicator('Hurst Spectral Analysis Oscillator', overlay=false, format=format.price, precision=3) 

//-------------------------------Inputs-------------------------------//
source = input(hl2, 'Source', group="Bandpass Settings")
bandWidth = input.float(0.025, 'Bandwidth', minval=0.0, maxval=1.0, group="Bandpass Settings")
periodBandpassh = input.float(4.3, '5 Day      ', minval=2, inline="1", group="Cycle Settings")
periodBandpassf = input.float(8.5, '10 Day    ', minval=2, inline="2", group="Cycle Settings")
periodBandpass2 = input.float(17, '20 Day    ', minval=2, inline="3", group="Cycle Settings")
periodBandpass4 = input.float(34.1, '40 Day    ', minval=2, inline="4", group="Cycle Settings")
periodBandpass8 = input.float(68.2, '80 Day    ', minval=2, inline="5", group="Cycle Settings")
periodBandpass16 = input.float(136.4, '20 Week ', minval=2, inline="6", group="Cycle Settings")
periodBandpass32 = input.float(272.8, '40 Week ', minval=2, inline="7", group="Cycle Settings")
periodBandpass64 = input.float(545.6, '18 Month', minval=2, inline="8", group="Cycle Settings")
periodBandpass128 = input.float(1636.8, '54 Month', minval=2, inline="9", group="Cycle Settings")
periodBandpass256 = input.float(3273.6, '9 Year    ', minval=2, inline="10", group="Cycle Settings")
periodBandpass512 = input.float(6547.2, '18 Year  ', minval=2, inline="11", group="Cycle Settings")


// Color Selection
fld18y = #5E0F0B
fld9y = #DB241A
fld54m = #D47A35
fld18m = #C4B727
fld40w = #62E322
fld20w = #3C8A15
fld80 = #67A5A8
fld40 = #161861
fld20 = #9658E1
fld10 = #D15C7B
fld5 = #E386C2
fld2 = #B80D18
fld1 = #FF7F50
fld5h = #FFB836
fld0 = color.gray

//colh = input.color(color.purple, " ", inline="1", group="Cycle Settings")
//colf = input.color(color.blue, " ", inline="2", group="Cycle Settings")
//col2 = input.color(color.aqua, " ", inline="3", group="Cycle Settings")
//col4 = input.color(color.green, " ", inline="4", group="Cycle Settings")
//col8 = input.color(color.yellow, " ", inline="5", group="Cycle Settings")
//col16 = input.color(color.orange, " ", inline="6", group="Cycle Settings")
//col32 = input.color(color.red, " ", inline="7", group="Cycle Settings")
//col64 = input.color(#856c44, " ", inline="8", group="Cycle Settings")
//col128 = input.color(color.black, " ", inline="9", group="Cycle Settings")
//col256 = input.color(color.gray, " ", inline="10", group="Cycle Settings")
//col512 = input.color(color.white, " ", inline="11", group="Cycle Settings")
//colcompu = input.color(color.new(#00ff0a, 70), "Composite Model Candle Colors", inline="12", group="Cycle Settings") 
//colcompd = input.color(color.new(#ff0000, 70), " ", inline="12", group="Cycle Settings") 

colh = input.color(fld5, " ", inline="1", group="Cycle Settings")
colf = input.color(fld10, " ", inline="2", group="Cycle Settings")
col2 = input.color(fld20, " ", inline="3", group="Cycle Settings")
col4 = input.color(fld40, " ", inline="4", group="Cycle Settings")
col8 = input.color(fld80, " ", inline="5", group="Cycle Settings")
col16 = input.color(fld20w, " ", inline="6", group="Cycle Settings")
col32 = input.color(fld40w, " ", inline="7", group="Cycle Settings")
col64 = input.color(fld18m, " ", inline="8", group="Cycle Settings")
col128 = input.color(fld54m, " ", inline="9", group="Cycle Settings")
col256 = input.color(fld9y, " ", inline="10", group="Cycle Settings")
col512 = input.color(fld18y, " ", inline="11", group="Cycle Settings")
colcompu = input.color(color.new(#00ff0a, 70), "Composite Model Candle Colors", inline="12", group="Cycle Settings") 
colcompd = input.color(color.new(#ff0000, 70), " ", inline="12", group="Cycle Settings") 


// Composite Selection
comph = input.bool(false, "Composite", inline="1", group="Cycle Settings")
compf = input.bool(true, "Composite", inline="2", group="Cycle Settings")
comp2 = input.bool(true, "Composite", inline="3", group="Cycle Settings")
comp4 = input.bool(true, "Composite", inline="4", group="Cycle Settings")
comp8 = input.bool(true, "Composite", inline="5", group="Cycle Settings")
comp16 = input.bool(true, "Composite", inline="6", group="Cycle Settings")
comp32 = input.bool(false, "Composite", inline="7", group="Cycle Settings")
comp64 = input.bool(false, "Composite", inline="8", group="Cycle Settings")
comp128 = input.bool(false, "Composite", inline="9", group="Cycle Settings")
comp256 = input.bool(false, "Composite", inline="10", group="Cycle Settings")
comp512 = input.bool(false, "Composite", inline="11", group="Cycle Settings")
// Analysis Inputs
mode_sig_in = input.string(title='Bandpass Analysis Mode?', defval='Auto', options=['Auto', 'Manual'])
_sig_in = input.string("20 Day", "Bandpass for Analysis", options=["5 Day", "10 Day", "20 Day", "40 Day", "80 Day", "20 Week", "40 Week", "18 Month", "54 Month", "9 Year", "18 Year", "None"], group="Analysis Settings")
decimals = input.int(2, 'Price Decimals', minval=0, maxval=10, group="Analysis Settings")
position = input.string(position.bottom_center, "Analysis Position", [position.top_center, position.top_right, position.middle_right, position.bottom_right, position.bottom_center, position.bottom_left, position.middle_left, position.top_left], group="Analysis Settings")
size = input.string(size.small, "Text Size", [size.tiny, size.small, size.normal, size.large, size.huge], group="Analysis Settings")
tableposy = input.string(defval='top', title='Chart Location', options=['bottom', 'middle', 'top'], inline='chartpos')
tableposx = input.string(defval='right', title='', options=['left', 'center', 'right'], inline='chartpos')
showtable = input.bool(defval = true, title = "Show Forecast Table")

auto_sig_in = timeframe.period == 'M' ? "10 Day" : timeframe.period == 'W' ? "20 Day" : timeframe.period == 'D' ? "20 Day": timeframe.period == '240' ? "20 Day" : timeframe.period == '120' ? "40 Day" : timeframe.period == '60' ? "80 Day" : timeframe.period == '30' ? "20 Week" : timeframe.period == '15' ? "40 Week" : timeframe.period == '10' ? "40 Week": timeframe.period == '5' ? "40 Week" : "40 Day"

sig_in  = mode_sig_in == 'Auto' ? auto_sig_in : _sig_in

//-------------------------------Functions & Calculations-------------------------------//
// @TMPascoe found & offered this bandpass by @HPotter found here https://www.tradingview.com/script/A1jhw5fG-Bandpass-Filter/
//      @BarefootJoey turned the code into a function and made it accept float Period
bpf(Series, float Period, Delta) =>
    float tmpbpf = na 
    var beta = math.cos(3.14 * (360 / Period) / 180)
    var gamma = 1 / math.cos(3.14 * (720 * Delta / Period) / 180)
    var alpha = gamma - math.sqrt(gamma * gamma - 1)
    tmpbpf := 0.5 * (1 - alpha) * (Series - Series[2]) + beta * (1 + alpha) * nz(tmpbpf[1]) - alpha * nz(tmpbpf[2])
// Individual Bandpass Filters
BPFh = bpf(source, periodBandpassh, bandWidth)
BPFf = bpf(source, periodBandpassf, bandWidth)
BPF2 = bpf(source, periodBandpass2, bandWidth)
BPF4 = bpf(source, periodBandpass4, bandWidth)
BPF8 = bpf(source, periodBandpass8, bandWidth)
BPF16 = bpf(source, periodBandpass16, bandWidth)
BPF32 = bpf(source, periodBandpass32, bandWidth)
BPF64 = bpf(source, periodBandpass64, bandWidth)
BPF128 = bpf(source, periodBandpass128, bandWidth)
BPF256 = bpf(source, periodBandpass256, bandWidth)
BPF512 = bpf(source, periodBandpass512, bandWidth)
// Composite
compBPF = (comph?BPFh:0) + (compf?BPFf:0) + (comp2?BPF2:0) + (comp4?BPF4:0) + (comp8?BPF8:0) + (comp16?BPF16:0) + (comp32?BPF32:0) + (comp64?BPF64:0) + (comp128?BPF128:0) + (comp256?BPF256:0) + (comp512?BPF512:0)
col = ta.change(compBPF) > 0 ? colcompu : colcompd

// Cycle Analysis
// Truncate Decimals
truncate(number, pricedecimals) =>
    factor = math.pow(10, pricedecimals)
    int(number * factor) / factor

// Switch output/plot for analytics
sig_out = sig_in == "5 Day" ? BPFh : sig_in == "10 Day" ? BPFf : sig_in == "20 Day" ? BPF2 : sig_in == "40 Day" ? BPF4 : sig_in == "80 Day" ? BPF8 : sig_in == "20 Week" ? BPF16 : sig_in == "40 Week" ? BPF32 : sig_in == "18 Month" ? BPF64 : sig_in == "54 Month" ? BPF128 : sig_in == "9 Year" ? BPF256 : sig_in == "18 Year" ? BPF512 : na
period_out = sig_in == "5 Day" ? periodBandpassh : sig_in == "10 Day" ? periodBandpassf : sig_in == "20 Day" ? periodBandpass2 : sig_in == "40 Day" ? periodBandpass4 : sig_in == "80 Day" ? periodBandpass8 : sig_in == "20 Week" ? periodBandpass16 : sig_in == "40 Week" ? periodBandpass32 : sig_in == "18 Month" ? periodBandpass64 : sig_in == "54 Month" ? periodBandpass128 : sig_in == "9 Year" ? periodBandpass256 : sig_in == "18 Year" ? periodBandpass512 : 1 // :na 
col_out = sig_in == "5 Day" ? colh : sig_in == "10 Day" ? colf : sig_in == "20 Day" ? col2 : sig_in == "40 Day" ? col4 : sig_in == "80 Day" ? col8 : sig_in == "20 Week" ? col16 : sig_in == "40 Week" ? col32 : sig_in == "18 Month" ? col64 : sig_in == "54 Month" ? col128 : sig_in == "9 Year" ? col256 : sig_in == "18 Year" ? col512 : color.gray

// Highs/Lows
hi = sig_out[2]<sig_out[1] and sig_out[1]>sig_out
lo = sig_out[2]>sig_out[1] and sig_out[1]<sig_out

// Define Crosses
midcross = ta.cross(sig_out, 0)
midcrossbars = ta.barssince(midcross)
midcrossbars2 = ta.barssince(midcross)[1]
last_wavelength = ta.barssince(midcross) - ta.barssince(midcross)
// Bars Since Last Amp Hi & Lo
xhi = ta.barssince(hi)
xlo = ta.barssince(lo)

// Wavelength   
wavelength = math.round(math.abs(xhi-xlo)*2)

// Last Amp Hi & Lo
bpfphi = ta.highest(sig_out,math.round(period_out))
bpfamphi = ta.valuewhen(bpfphi, sig_out, 0)
bpfplo = ta.lowest(sig_out,math.round(period_out))
bpfamplo = ta.valuewhen(bpfplo, sig_out, 0)
tot_amp = bpfphi - bpfplo
// Estimates/Forecasts
next_peak = -math.abs(xhi-wavelength)
next_trough = -math.abs(xlo-wavelength)
next_node = math.abs(xhi-xlo)-midcrossbars
// Highlight background of next peak/node/trough
next_peak_col = color.new(color.red,hi?75:100)
next_node_col = color.new(color.gray, midcross?75:100)
next_trough_col = color.new(color.green, lo?75:100)

// Sentiment 
amp_sent = bpfphi>math.abs(bpfplo)?"๐ŸŸข":bpfphi<math.abs(bpfplo)?"๐Ÿ”ด":"โšช"
bbwavelen = wavelength>period_out?"๐ŸŸข":wavelength<period_out?"๐Ÿ”ด":"โšช"
bbpt = -next_peak<-next_trough?"Bullish๐ŸŸข":-next_peak>-next_trough?"Bearish๐Ÿ”ด":"Neutralโšช"

// Analytics Tooltip ๐Ÿ“๐Ÿงฎโณ๐ŸŽฐ๐Ÿค–๐ŸŽญ๐Ÿ”ฎ๐Ÿ“ˆ๐Ÿ“‰๐Ÿ”๐ŸŒŠ๐Ÿ”ด๐ŸŸขโšช
labeltt= "๐Ÿ”„ Cycle: " + str.tostring(sig_in) + "/" + str.tostring(period_out) + " bars" +
 "\n๐Ÿ“ Period (โŠบ): ~" + str.tostring(math.abs(xhi-xlo)) + " bars" +
 "\n๐ŸŒŠ Wavelength (ฮป): ~" + str.tostring(wavelength) + " bars " + bbwavelen +
 "\nโš– Delta (โˆ†) Amplitude (ยช): " + str.tostring(truncate(tot_amp, decimals)) + " " + amp_sent +
 "\n๐Ÿ“ˆ Peak (ยช): " + str.tostring(truncate(bpfphi, decimals)) + ", " + str.tostring(xhi) + " bars ago" + 
 "\n๐Ÿ”€ Node: " + str.tostring(midcrossbars) + " bars ago" +
 "\n๐Ÿ“‰ Trough (ยช): " + str.tostring(truncate(bpfplo, decimals)) + ", " + str.tostring(xlo) + " bars ago" + 
 "\n\n๐Ÿ”ฎ Estimates: " + bbpt +
 "\n๐Ÿ“ˆ Next Peak: " + str.tostring(-next_peak) + "ish bars " +
 "\n๐Ÿ”€ Next Node: " + str.tostring(next_node) + "ish bars" + 
 "\n๐Ÿ“‰ Next Trough: " + str.tostring(-next_trough) + "ish bars " 

labeltt2= "๐Ÿ”„ Cycle: " + str.tostring(sig_in) + "/" + str.tostring(period_out) + " bars" +
 "\n๐Ÿ“ Period (โŠบ): ~" + str.tostring(math.abs(xhi-xlo)) + " bars" +
 "\n๐ŸŒŠ Wavelength (ฮป): ~" + str.tostring(wavelength) + " bars " + bbwavelen +
 "\n\n๐Ÿ”ฎ Estimates: " + bbpt +
 "\n๐Ÿ“ˆ Next Peak: " + str.tostring(-next_peak) + "ish bars " +
 "\n๐Ÿ”€ Next Node: " + str.tostring(next_node) + "ish bars" + 
 "\n๐Ÿ“‰ Next Trough: " + str.tostring(-next_trough) + "ish bars " 


// ------------------------------- Plots, Displays, Outputs -------------------------------//
plot(0, "Midline", color.new(color.gray,30), style=plot.style_histogram, display=display.none)
//plot(BPFh, '5 Day', color=color.new(colh, 0), linewidth=sig_in == "5 Day" ? 3 : 1, display=display.none)
//plot(BPFf, '10 Day', color=color.new(colf, 0), linewidth=sig_in == "10 Day" ? 3 : 1, display=display.none)
//plot(BPF2, '20 Day', color=color.new(col2, 0), linewidth=sig_in == "20 Day" ? 3 : 1, display=display.all)
//plot(BPF4, '40 Day', color=color.new(col4, 0), linewidth=sig_in == "40 Day" ? 3 : 1, display=display.none)
//plot(BPF8, '80 Day', color=color.new(col8, 0), linewidth=sig_in == "80 Day" ? 3 : 1, display=display.none)
//plot(BPF16, '20 Week', color=color.new(col16, 0), linewidth=sig_in == "20 Week" ? 3 : 1, display=display.none)
//plot(BPF32, '40 Week', color=color.new(col32, 0), linewidth=sig_in == "40 Week" ? 3 : 1, display=display.none)
//plot(BPF64, '18 Month', color=color.new(col64, 0), linewidth=sig_in == "18 Month" ? 3 : 1, display=display.none)
//plot(BPF128, '54 Month', color=color.new(col128, 0), linewidth=sig_in == "54 Month" ? 3 : 1, display=display.none)
//plot(BPF256, '9 Year', color=color.new(col256, 0), linewidth=sig_in == "9 Year" ? 3 : 1, display=display.none)
//plot(BPF512, '18 Year', color=color.new(col512, 0), linewidth=sig_in == "18 Year" ? 3 : 1, display=display.none)

plot(BPFh, '5 Day', color=color.new(colh, 0), linewidth=3, display=display.none)
plot(BPFf, '10 Day', color=color.new(colf, 0), linewidth=3, display=display.none)
plot(BPF2, '20 Day', color=color.new(col2, 0), linewidth=3, display=display.all)
plot(BPF4, '40 Day', color=color.new(col4, 0), linewidth=3, display=display.all)
plot(BPF8, '80 Day', color=color.new(col8, 0), linewidth=3, display=display.all)
plot(BPF16, '20 Week', color=color.new(col16, 0), linewidth=3, display=display.none)
plot(BPF32, '40 Week', color=color.new(col32, 0), linewidth=3, display=display.none)
plot(BPF64, '18 Month', color=color.new(col64, 0), linewidth=3, display=display.none)
plot(BPF128, '54 Month', color=color.new(col128, 0), linewidth=3, display=display.none)
plot(BPF256, '9 Year', color=color.new(col256, 0), linewidth=3, display=display.none)
plot(BPF512, '18 Year', color=color.new(col512, 0), linewidth=3, display=display.none)

plotcandle(compBPF[1], ta.lowest(compBPF,1), math.min(compBPF,compBPF[1]), compBPF, color=col, wickcolor=color.new(col,100), bordercolor=col, title='Composite Candles', display=display.none)

bgcolor(color=next_peak_col, title="Peak Estimate", offset=wavelength)
bgcolor(color=next_node_col, title="Node Estimate", offset=wavelength)
bgcolor(color=next_trough_col, title="Trough Estimate", offset=wavelength)

plotshape(hi, "Actual Peak", shape.triangledown, location.top, color.rgb(255, 0, 0, 33), size=size.tiny, display=display.none) 
plotshape(lo, "Actual Trough", shape.triangleup, location.bottom, color.rgb(0, 255, 8, 33), size=size.tiny, display=display.none) 

var table Ticker = na
table.delete(Ticker)
Ticker := table.new(position, 1, 1)
if barstate.islast
    table.cell(Ticker, 0, 0, 
      text = "๐Ÿ”„ Cycle Analysis", 
      text_size = size, 
      text_color = color.new(col_out,0),
      tooltip = sig_in!="None"?labeltt:"No Bandpass selected. Double click to open & change Settings.")


var srtable = table.new(position = tableposy + '_' + tableposx, columns = 5, rows= 11, frame_width = 0, frame_color = color.gray, border_width = 1, border_color = color.gray)
if showtable
    table.cell(srtable, 0, 0, text = labeltt2, text_color = color.white, bgcolor = color.new(color.gray,100), text_size = size.small)
    table.merge_cells(srtable, 0, 0, 3, 0)

Overview

A single bandwidth setting is shared by all filters, and each cycle has its own period, from 5 days through weeks and months up to 18 years. Colours distinguish the cycles. This is the simpler, earlier form of the oscillator and has no trade signals.

Details

Published by

mikeyhu70 on GitHub

Type

Indicator, Pine Script v5

Draws

Separate pane below the chart

Category

Oscillators & momentum

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Sourcesourcehl2source
Bandwidthfloat0.025bandWidth
5 Day float4.3periodBandpassh
10 Day float8.5periodBandpassf
20 Day float17periodBandpass2
40 Day float34.1periodBandpass4
80 Day float68.2periodBandpass8
20 Week float136.4periodBandpass16
40 Week float272.8periodBandpass32
18 Monthfloat545.6periodBandpass64
54 Monthfloat1636.8periodBandpass128
9 Year float3273.6periodBandpass256
Show all 40 settings
SettingTypeDefaultVariable
18 Year float6547.2periodBandpass512
colorfld5colh
colorfld10colf
colorfld20col2
colorfld40col4
colorfld80col8
colorfld20wcol16
colorfld40wcol32
colorfld18mcol64
colorfld54mcol128
colorfld9ycol256
colorfld18ycol512
Composite Model Candle Colorscolorcolor.new(#00ff0a, 70)colcompu
colorcolor.new(#ff0000, 70)colcompd
Compositeboolfalsecomph
Compositebooltruecompf
Compositebooltruecomp2
Compositebooltruecomp4
Compositebooltruecomp8
Compositebooltruecomp16
Compositeboolfalsecomp32
Compositeboolfalsecomp64
Compositeboolfalsecomp128
Compositeboolfalsecomp256
Compositeboolfalsecomp512
Bandpass Analysis Mode?stringAutomode_sig_in
Bandpass for Analysisstring20 Day_sig_in
Price Decimalsint2decimals
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

Asymmetrical RSI

by everget
948 stars

Asymmetrical RSI is an indicator that computes a custom relative strength index from the rate of change of a user-selected source. It plots the resulting ARSI line in a separate pane with color coding that turns green above the overbought level and red below t

Indicator v4 Oscillators & momentum
Updated 11 days ago ยท GPL-3.0 GitHub repository of Asymmetrical RSI

This indicator calculates momentum setups based on the Relative Strength Index (RSI) and plots in a separate pane. It offers multiple scanning modes such as Continuous Break, Continuous Retracement, Flip Break, Flip Retracement, and both regular and hidden div

Indicator v6 Oscillators & momentumDivergence Repaints
Updated 1 year ago ยท MPL-2.0 GitHub repository of Momentum Setup - RSI Directional Momentum Indicator

Beep Boop

by magic8bot
409 stars

This indicator calculates a modified MACD oscillator and signal line alongside a trend EMA filter, plotting the output as a stylized column histogram in a separate pane. Instead of plotting true MACD distance, it quantifies positive and negative histogram mome

Indicator v4 Oscillators & momentumTrend
Updated 3 years ago ยท MIT GitHub repository of Beep Boop

This indicator plots the Average Directional Index in a separate pane and colors the line teal or maroon according to whether plus DI is above minus DI. A horizontal key level and a silver background mark periods when ADX exceeds that threshold. With labels en

Indicator v4 TrendOscillators & momentum
Updated 2 months ago ยท None stated GitHub repository of Directional Movement Index [Alorse]
261 stars

This indicator demonstrates an experimental graph-style scatter visualization within a separate pane using Pine Script arrays. It tracks two features across recent bars: the single-bar price change and a scaled 14-period Relative Strength Index. Values are loa

Indicator v4 Oscillators & momentum
Updated 4 years ago ยท None stated GitHub repository of Example: Graph Style - 4th Dimension RSI

KDๆŒ‡ๆจ™

by TaichiS
219 stars

This script calculates and plots a Stochastic Oscillator (KD indicator) in a separate chart pane. It determines the fast stochastic value over a 9-period lookback, then applies a 3-period Simple Moving Average (SMA) to create the %K line, and a second 3-period

Indicator v4 Oscillators & momentum
Updated 5 years ago ยท None stated GitHub repository of KDๆŒ‡ๆจ™

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers