/////////////////////////////////////////////////////// // // SaherElm IT Center Hull butterfly Oscillator // --------------------------------------------- // saherelm implementation of above oscillator ... // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // //@version=5 indicator(title="SaherElm Hull butterfly Oscillator", shorttitle = "XS_HUBF_OSC", overlay = false) // // START Inputs .... // // HUBFSrc = input.source(defval = close, title = "Source") // HUBFLength = input.int(defval = 11, title = "Length") // HUBFMult = input.float(defval = 2.0, title = "Levels Multiplier") // // END Inputs .... // // // START Functions .... // // // END Functions .... // // // START Calculations .... // // var bullishColor = color.lime var bullishColor1 = color.new(bullishColor, 50) // var bearishColor = color.red var bearishColor1 = color.new(bearishColor, 50) // var HUBFShortLen = int(HUBFLength / 2) var HUBFHullLen = int(math.sqrt(HUBFLength)) // var HUBFDen1 = HUBFShortLen * (HUBFShortLen + 1) / 2 var HUBFDen2 = HUBFLength * (HUBFLength + 1) / 2 var HUBFDen3 = HUBFHullLen * (HUBFHullLen + 1) / 2 // var HUBFLcwaCoeffs = array.new_float(HUBFHullLen, 0) var HUBFHullCoeffs = array.new_float(0) // if barstate.isfirst // // Linearly combined WMA coeffs ... for i = 0 to HUBFLength - 1 // HUBFSum1 = math.max(HUBFShortLen - i, 0) HUBFSum2 = HUBFLength - i // array.unshift(HUBFLcwaCoeffs, 2 * (HUBFSum1 / HUBFDen1) - (HUBFSum2 / HUBFDen2)) // // Zero padding of linearly combined WMA coeffs ... for i = 0 to HUBFHullLen - 2 array.unshift(HUBFLcwaCoeffs, 0) // // WMA convolution of linearly combined WMA coeffs ... for i = HUBFHullLen to array.size(HUBFLcwaCoeffs) - 1 // HUBFSum3 = 0.0 for j = i - HUBFHullLen to i - 1 HUBFSum3 += array.get(HUBFLcwaCoeffs, j) * (i - j) // array.unshift(HUBFHullCoeffs, HUBFSum3 / HUBFDen3) // var HUBFOs = 0 var HUBFLen = array.size(HUBFHullCoeffs) - 1 // HUBFHma = 0.0 HUBFInvHma = 0.0 // for i = 0 to HUBFLen HUBFHma += HUBFSrc[i] * array.get(HUBFHullCoeffs, i) HUBFInvHma += HUBFSrc[HUBFLen - i] * array.get(HUBFHullCoeffs, i) // HUBFHso = HUBFHma - HUBFInvHma // HUBFCmean = ta.cum(math.abs(HUBFHso)) / bar_index * HUBFMult // HUBFOs := ta.cross(HUBFHso, HUBFCmean) or ta.cross(HUBFHso, - HUBFCmean) ? 0 : HUBFHso < HUBFHso[1] and HUBFHso > HUBFCmean ? -1 : HUBFHso > HUBFHso[1] and HUBFHso < -HUBFCmean ? 1 : HUBFOs // HUBFCss0 = color.from_gradient(HUBFHso, 0, HUBFCmean, bullishColor1, bullishColor) HUBFCss1 = color.from_gradient(HUBFHso, - HUBFCmean, 0, bearishColor, bearishColor1) HUBFCss = HUBFHso > 0 ? HUBFCss0 : HUBFCss1 // // END Calculations .... // // // START Plots .... // // // Oscillator line/histogram ... plot(series = HUBFHso, title = "Hull Butterfly", color = HUBFCss, style = plot.style_histogram) plot(series = HUBFHso, title = "Hull Butterfly", color = chart.fg_color) // // Bullish Dots ... plot(series = HUBFOs > HUBFOs[1] and HUBFOs == 1 ? HUBFHso : na, title = "Bullish Dot", color = bullishColor, linewidth = 2, style = plot.style_columns) // // Bearish Dots ... plot(series = HUBFOs < HUBFOs[1] and HUBFOs == -1 ? HUBFHso : na, title = "Bearish Dot", color = bearishColor, linewidth = 2, style = plot.style_columns) // // Levels ... plot(series = HUBFCmean, color = color.gray, editable = false) plot(series = HUBFCmean / 2, color = color.gray, editable = false) plot(series = -HUBFCmean / 2, color = color.gray, editable = false) plot(series = -HUBFCmean, color = color.gray, editable = false) // // END Plots .... // // // START Alerts ... // // // END Alerts ... // ////////////////////////////////////////////////////// // TODOS: // ------- // - [] //////////////////////////////////////////////////////