This indicator plots a standard EMA/EMA baseline and a selected DEMA or ZLEMA oscillator with an EMA or DEMA signal. Defaults are the short 3/5/3 fixture settings, not recommended trading parameters. Enable the step fixture to reproduce the table, then inspect Fixture step bar in the Data Window. Synthetic mode disables alerts.
An independent public-formula audit. Compare values in TradingView before using a market alert; syntax checking does not validate trading performance.pine
//@version=6
indicator("Zero-lag MACD calculation audit", overlay=false, precision=6, max_bars_back=500)
fastLen = input.int(3, "Fast length", minval=1, maxval=100)
slowLen = input.int(5, "Slow length", minval=2, maxval=100)
signalLen = input.int(3, "Signal length", minval=1, maxval=100)
oscillator = input.string("DEMA", "Selected oscillator", options=["DEMA", "ZLEMA"])
signalType = input.string("DEMA", "Selected signal", options=["EMA", "DEMA"])
fixture = input.bool(false, "Use 100 to 110 step fixture")
if fastLen >= slowLen
runtime.error("Fast length must be below slow length.")
emaSeed(float x, int n) =>
float value = na
float alpha = 2.0 / (n + 1.0)
value := na(x) ? na : na(value[1]) ? x : alpha * x + (1.0 - alpha) * value[1]
value
dema(float x, int n) =>
float first = emaSeed(x, n)
2.0 * first - emaSeed(first, n)
zlema(float x, int n) =>
int lag = int(math.floor((n - 1) / 2.0))
emaSeed(2.0 * x - x[lag], n)
source = fixture ? (bar_index < 60 ? 100.0 : 110.0) : close
standard = emaSeed(source, fastLen) - emaSeed(source, slowLen)
standardSignal = emaSeed(standard, signalLen)
demaFast = dema(source, fastLen)
demaSlow = dema(source, slowLen)
zlemaFast = zlema(source, fastLen)
zlemaSlow = zlema(source, slowLen)
selectedFast = oscillator == "DEMA" ? demaFast : zlemaFast
selectedSlow = oscillator == "DEMA" ? demaSlow : zlemaSlow
selected = selectedFast - selectedSlow
emaSignal = emaSeed(selected, signalLen)
demaSignal = dema(selected, signalLen)
selectedSignal = signalType == "EMA" ? emaSignal : demaSignal
histogram = selected - selectedSignal
plot(standard, "Standard EMA MACD", color=color.gray)
plot(standardSignal, "Standard EMA signal", color=color.silver)
plot(selected, "Selected MACD", color=color.blue, linewidth=2)
plot(selectedSignal, "Selected signal", color=color.orange, linewidth=2)
plot(histogram, "Selected histogram", style=plot.style_histogram, color=histogram >= 0 ? color.teal : color.red)
plot(selectedFast, "Selected fast average", display=display.data_window)
plot(selectedSlow, "Selected slow average", display=display.data_window)
plot(standard - standardSignal, "Standard histogram", display=display.data_window)
plot(bar_index - 59, "Fixture step bar", display=display.data_window)
hline(0, "Zero", color=color.gray)
crossUp = ta.crossover(selected, selectedSignal)
crossDown = ta.crossunder(selected, selectedSignal)
ready = not na(selectedSignal[1]) and not fixture
alertcondition(ready and barstate.isconfirmed and crossUp, "Confirmed MACD cross up", "Selected MACD crossed above its signal on a closed chart bar.")
alertcondition(ready and barstate.isconfirmed and crossDown, "Confirmed MACD cross down", "Selected MACD crossed below its signal on a closed chart bar.")