//@version=5 indicator("Step Generalized Double DEMA (ATR based) [Loxx]", shorttitle="SGDDEMAATRB [Loxx]", overlay = true, timeframe="", timeframe_gaps = true) import loxx/loxxexpandedsourcetypes/4 greencolor = #2DD204 redcolor = #D2042D gdema(float price, float period, float volumeFactor)=> float vol = (volumeFactor > 0) ? (volumeFactor > 1) ? 1 : volumeFactor : 0.01 float volpl = vol + 1 float alpha = 2.0 / (1.0 + (period > 1 ? period : 1)) float winst1 = 0., float winst2 = 0., float winst3 = 0., float winst4 = 0. winst1 := nz(winst1[1]) + alpha * (price - nz(winst1[1])) winst2 := nz(winst2[1]) + alpha * (winst1 - nz(winst2[1])) winst3 := nz(winst3[1]) + alpha * ((winst1 * volpl - winst2 * vol) - nz(winst3[1])) winst4 := nz(winst4[1]) + alpha * (winst3 - nz(winst4[1])) winst = winst3 * volpl - winst4 * vol winst smthtype = input.string("Kaufman", "Heiken-Ashi Better Smoothing", options = ["AMA", "T3", "Kaufman"], group= "Source Settings") srcoption = input.string("Close", "Source", group= "Source Settings", options = ["Close", "Open", "High", "Low", "Median", "Typical", "Weighted", "Average", "Average Median Body", "Trend Biased", "Trend Biased (Extreme)", "HA Close", "HA Open", "HA High", "HA Low", "HA Median", "HA Typical", "HA Weighted", "HA Average", "HA Average Median Body", "HA Trend Biased", "HA Trend Biased (Extreme)", "HAB Close", "HAB Open", "HAB High", "HAB Low", "HAB Median", "HAB Typical", "HAB Weighted", "HAB Average", "HAB Average Median Body", "HAB Trend Biased", "HAB Trend Biased (Extreme)"]) per = input.int(14, "Double DEMA period", group = "Basic Settings") vf = input.float(.7, "Double DEMA volume factor", step = 0.1, minval = 0.1, group = "Basic Settings") mult = input.float(20, "Step Size in % of ATR", group = "Basic Settings") atrper = input.int(50, "ATR Period", group = "Basic Settings") showSigs = input.bool(true, "Show signals?", group= "UI Options") colorbars = input.bool(true, "Color bars?", group = "UI Options") kfl=input.float(0.666, title="* Kaufman's Adaptive MA (KAMA) Only - Fast End", group = "Moving Average Inputs") ksl=input.float(0.0645, title="* Kaufman's Adaptive MA (KAMA) Only - Slow End", group = "Moving Average Inputs") amafl = input.int(2, title="* Adaptive Moving Average (AMA) Only - Fast", group = "Moving Average Inputs") amasl = input.int(30, title="* Adaptive Moving Average (AMA) Only - Slow", group = "Moving Average Inputs") haclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) haopen = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open) hahigh = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high) halow = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low) hamedian = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hl2) hatypical = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hlc3) haweighted = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hlcc4) haaverage = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, ohlc4) float src = switch srcoption "Close" => loxxexpandedsourcetypes.rclose() "Open" => loxxexpandedsourcetypes.ropen() "High" => loxxexpandedsourcetypes.rhigh() "Low" => loxxexpandedsourcetypes.rlow() "Median" => loxxexpandedsourcetypes.rmedian() "Typical" => loxxexpandedsourcetypes.rtypical() "Weighted" => loxxexpandedsourcetypes.rweighted() "Average" => loxxexpandedsourcetypes.raverage() "Average Median Body" => loxxexpandedsourcetypes.ravemedbody() "Trend Biased" => loxxexpandedsourcetypes.rtrendb() "Trend Biased (Extreme)" => loxxexpandedsourcetypes.rtrendbext() "HA Close" => loxxexpandedsourcetypes.haclose(haclose) "HA Open" => loxxexpandedsourcetypes.haopen(haopen) "HA High" => loxxexpandedsourcetypes.hahigh(hahigh) "HA Low" => loxxexpandedsourcetypes.halow(halow) "HA Median" => loxxexpandedsourcetypes.hamedian(hamedian) "HA Typical" => loxxexpandedsourcetypes.hatypical(hatypical) "HA Weighted" => loxxexpandedsourcetypes.haweighted(haweighted) "HA Average" => loxxexpandedsourcetypes.haaverage(haaverage) "HA Average Median Body" => loxxexpandedsourcetypes.haavemedbody(haclose, haopen) "HA Trend Biased" => loxxexpandedsourcetypes.hatrendb(haclose, haopen, hahigh, halow) "HA Trend Biased (Extreme)" => loxxexpandedsourcetypes.hatrendbext(haclose, haopen, hahigh, halow) "HAB Close" => loxxexpandedsourcetypes.habclose(smthtype, amafl, amasl, kfl, ksl) "HAB Open" => loxxexpandedsourcetypes.habopen(smthtype, amafl, amasl, kfl, ksl) "HAB High" => loxxexpandedsourcetypes.habhigh(smthtype, amafl, amasl, kfl, ksl) "HAB Low" => loxxexpandedsourcetypes.hablow(smthtype, amafl, amasl, kfl, ksl) "HAB Median" => loxxexpandedsourcetypes.habmedian(smthtype, amafl, amasl, kfl, ksl) "HAB Typical" => loxxexpandedsourcetypes.habtypical(smthtype, amafl, amasl, kfl, ksl) "HAB Weighted" => loxxexpandedsourcetypes.habweighted(smthtype, amafl, amasl, kfl, ksl) "HAB Average" => loxxexpandedsourcetypes.habaverage(smthtype, amafl, amasl, kfl, ksl) "HAB Average Median Body" => loxxexpandedsourcetypes.habavemedbody(smthtype, amafl, amasl, kfl, ksl) "HAB Trend Biased" => loxxexpandedsourcetypes.habtrendb(smthtype, amafl, amasl, kfl, ksl) "HAB Trend Biased (Extreme)" => loxxexpandedsourcetypes.habtrendbext(smthtype, amafl, amasl, kfl, ksl) => haclose multout = mult/100.0 atr = ta.atr(atrper) val = gdema(src, per, vf) stepSize = multout * atr _diff = val - nz(val[1]) val := nz(val[1]) + ((_diff < stepSize and _diff > -stepSize) ? 0 : (_diff / stepSize) * stepSize) goLong_pre = ta.crossover(val, val[1]) goShort_pre = ta.crossunder(val, val[1]) contSwitch = 0 contSwitch := nz(contSwitch[1]) contSwitch := goLong_pre ? 1 : goShort_pre ? -1 : contSwitch goLong = goLong_pre and ta.change(contSwitch) goShort = goShort_pre and ta.change(contSwitch) plot(val,"SGDDEMA", color = contSwitch == 1 ? greencolor : redcolor, linewidth = 3) barcolor(colorbars ? contSwitch == 1 ? greencolor : redcolor : na) plotshape(showSigs and goLong, title = "Long", color = color.yellow, textcolor = color.yellow, text = "Long", style = shape.triangleup, location = location.belowbar, size = size.tiny) plotshape(showSigs and goShort, title = "Short", color = color.fuchsia, textcolor = color.fuchsia, text = "Short", style = shape.triangledown, location = location.abovebar, size = size.tiny) alertcondition(goLong, title = "Long", message = "Step Generalized Double DEMA (ATR based) [Loxx]: Uptrend\nSymbol: {{ticker}}\nPrice: {{close}}") alertcondition(goShort, title = "Short", message = "Step Generalized Double DEMA (ATR based) [Loxx]]: Downtrend\nSymbol: {{ticker}}\nPrice: {{close}}")