In the world of technical analysis, traders often have to choose between standard trend indicators (like Moving Averages) and oscillators (like RSI). The Mean Deviation Loop [by Lyro RS] breaks this dichotomy by combining both concepts into a single, sophisticated hybrid system.
This indicator is designed to filter market noise using Mean Absolute Deviation (MAD) and an iterative “For Loop” scoring system. By comparing current price action against a wide range of historical data points simultaneously, it produces a robust trend signal that adapts to changing volatility.
This tool is divided into two components for ProRealTime:
What makes this indicator complex and powerful is that it does not rely on a single comparison (e.g., is Close > MA?). Instead, it uses a computing cycle (a Loop) to perform a “poll” of historical data.
Most indicators (like Bollinger Bands) use Standard Deviation. While effective, Standard Deviation squares the errors, which can cause the indicator to overreact to extreme outliers (spikes). This system uses Mean Absolute Deviation (MAD).
MAD is often considered more robust for trend identification because it treats volatility more linearly, providing a smoother reaction to price changes without the lag caused by extreme volatility spikes.
The core of this indicator is the For Loop logic. Imagine asking 50 people if they think the price is high. If 45 say “yes,” the trend is strong. The indicator does exactly this:
loopFrom (e.g., 10 bars ago) to loopTo (e.g., 60 bars ago).
The result is a Score. If the score is high, it means the current price dominates the majority of the recent history.
The indicator offers three distinct calculation modes via the signalMode parameter, allowing you to adapt the sensitivity to your trading style:
This mode mimics the classic Bollinger Band logic but uses MAD instead of Standard Deviation.
This uses the scoring system described above.
threshLFL).threshSFL).
This is the default and most recommended mode. It calculates the average of both the Bollinger score and the For Loop score.
To make this complex data easy to read, the Price indicator includes a real-time Dashboard anchored to the top-right of your chart.
It displays the current status of all three engines simultaneously:
This allows you to see the “market consensus” at a glance.
The indicator is highly customizable. Here are the key parameters you can tweak:
loopTo (e.g., to 100) makes the Loop Score smoother and more long-term.
This system requires two separate indicators to function fully.
//---------------------------------------------
//PRC_Mean Deviation Loop [Lyro RS]_PRICE
//version = 0
//04.02.2026
//Iván González @ www.prorealcode.com
//Sharing ProRealTime knowledge
//---------------------------------------------
// --- PARAMETROS ---
//---------------------------------------------
src = close
// Modo senal: 1=Bollinger Bands, 2=For Loop, 3=Combined
signalMode = 3
// Tipo MA: 1=SMA 2=EMA 3=WMA 4=VWMA 5=DEMA 6=TEMA
// 7=RMA 8=HMA 9=LSMA 10=SMMA 11=ZLEMA 12=KAMA 13=T3
// -- Bollinger Bands --
maTypeBB = 2
madLenBB = 25
madMultP = 1.4
madMultN = 1.0
// -- For Loop --
maTypeFL = 2
madLenFL = 10
loopFrom = 10
loopTo = 60
threshLFL = 23
threshSFL = 3
// -- Combined Signal --
threshLC = 0.0
threshSC = 0.0
// -- Tabla --
showTable = 1
// -- Colores: 1=Classic 2=Mystic 3=Accented 4=Royal --
colorMode = 2
useCustomCol = 0
custUpR = 0
custUpG = 255
custUpB = 0
custDnR = 255
custDnG = 0
custDnB = 0
//---------------------------------------------
// SETUP COLORES
//---------------------------------------------
IF colorMode = 1 THEN
upR = 0
upG = 230
upB = 118
dnR = 136
dnG = 14
dnB = 79
ELSIF colorMode = 2 THEN
upR = 48
upG = 253
upB = 207
dnR = 225
dnG = 23
dnB = 183
ELSIF colorMode = 3 THEN
upR = 150
upG = 24
upB = 247
dnR = 255
dnG = 0
dnB = 120
ELSIF colorMode = 4 THEN
upR = 255
upG = 193
upB = 7
dnR = 103
dnG = 58
dnB = 183
ENDIF
IF useCustomCol = 1 THEN
upR = custUpR
upG = custUpG
upB = custUpB
dnR = custDnR
dnG = custDnG
dnB = custDnB
ENDIF
//---------------------------------------------
// PRE-CALCULO: 13 MAs de src con periodo BB
//---------------------------------------------
bbSMA = Average[madLenBB](src)
bbEMA = ExponentialAverage[madLenBB](src)
bbWMA = WeightedAverage[madLenBB](src)
bbVWMA = summation[madLenBB](src * volume) / summation[madLenBB](volume)
bbDEMA = DEMA[madLenBB](src)
bbTEMA = TEMA[madLenBB](src)
bbRMA = WilderAverage[madLenBB](src)
bbHMA = average[madLenBB, 7](src)
bbLSMA = LinearRegression[madLenBB](src)
bbSMMA = WilderAverage[madLenBB](src)
bbZLEMA = average[madLenBB, 8](src)
// KAMA BB (fast=2, slow=30)
IF barindex < madLenBB THEN
bbKAMA = src
ELSE
numKbb = abs(src - src[madLenBB])
denKbb = summation[madLenBB](abs(src - src[1]))
IF denKbb > 0 THEN
erKbb = numKbb / denKbb
ELSE
erKbb = 0
ENDIF
scKbb = erKbb * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKbb = scKbb * scKbb
bbKAMA = aKbb * src + (1 - aKbb) * bbKAMA[1]
ENDIF
// T3 BB (hot=0.5)
eT1bb = ExponentialAverage[madLenBB](src)
eT2bb = ExponentialAverage[madLenBB](eT1bb)
eT3bb = ExponentialAverage[madLenBB](eT2bb)
eT4bb = ExponentialAverage[madLenBB](eT3bb)
eT5bb = ExponentialAverage[madLenBB](eT4bb)
eT6bb = ExponentialAverage[madLenBB](eT5bb)
bbT3 = -0.125 * eT6bb + 1.125 * eT5bb - 3.375 * eT4bb + 3.375 * eT3bb
//---------------------------------------------
// PRE-CALCULO: 13 MAs de src con periodo FL
//---------------------------------------------
flSMA = Average[madLenFL](src)
flEMA = ExponentialAverage[madLenFL](src)
flWMA = WeightedAverage[madLenFL](src)
flVWMA = summation[madLenFL](src * volume) / summation[madLenFL](volume)
flDEMA = DEMA[madLenFL](src)
flTEMA = TEMA[madLenFL](src)
flRMA = WilderAverage[madLenFL](src)
flHMA = average[madLenFL, 7](src)
flLSMA = LinearRegression[madLenFL](src)
flSMMA = WilderAverage[madLenFL](src)
flZLEMA = average[madLenFL, 8](src)
// KAMA FL
IF barindex < madLenFL THEN
flKAMA = src
ELSE
numKfl = abs(src - src[madLenFL])
denKfl = summation[madLenFL](abs(src - src[1]))
IF denKfl > 0 THEN
erKfl = numKfl / denKfl
ELSE
erKfl = 0
ENDIF
scKfl = erKfl * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKfl = scKfl * scKfl
flKAMA = aKfl * src + (1 - aKfl) * flKAMA[1]
ENDIF
// T3 FL (hot=0.5)
eT1fl = ExponentialAverage[madLenFL](src)
eT2fl = ExponentialAverage[madLenFL](eT1fl)
eT3fl = ExponentialAverage[madLenFL](eT2fl)
eT4fl = ExponentialAverage[madLenFL](eT3fl)
eT5fl = ExponentialAverage[madLenFL](eT4fl)
eT6fl = ExponentialAverage[madLenFL](eT5fl)
flT3 = -0.125 * eT6fl + 1.125 * eT5fl - 3.375 * eT4fl + 3.375 * eT3fl
//---------------------------------------------
// SELECTOR MA BB
//---------------------------------------------
IF maTypeBB = 1 THEN
avgBB = bbSMA
ELSIF maTypeBB = 2 THEN
avgBB = bbEMA
ELSIF maTypeBB = 3 THEN
avgBB = bbWMA
ELSIF maTypeBB = 4 THEN
avgBB = bbVWMA
ELSIF maTypeBB = 5 THEN
avgBB = bbDEMA
ELSIF maTypeBB = 6 THEN
avgBB = bbTEMA
ELSIF maTypeBB = 7 THEN
avgBB = bbRMA
ELSIF maTypeBB = 8 THEN
avgBB = bbHMA
ELSIF maTypeBB = 9 THEN
avgBB = bbLSMA
ELSIF maTypeBB = 10 THEN
avgBB = bbSMMA
ELSIF maTypeBB = 11 THEN
avgBB = bbZLEMA
ELSIF maTypeBB = 12 THEN
avgBB = bbKAMA
ELSIF maTypeBB = 13 THEN
avgBB = bbT3
ENDIF
//---------------------------------------------
// SELECTOR MA FL
//---------------------------------------------
IF maTypeFL = 1 THEN
avgFL = flSMA
ELSIF maTypeFL = 2 THEN
avgFL = flEMA
ELSIF maTypeFL = 3 THEN
avgFL = flWMA
ELSIF maTypeFL = 4 THEN
avgFL = flVWMA
ELSIF maTypeFL = 5 THEN
avgFL = flDEMA
ELSIF maTypeFL = 6 THEN
avgFL = flTEMA
ELSIF maTypeFL = 7 THEN
avgFL = flRMA
ELSIF maTypeFL = 8 THEN
avgFL = flHMA
ELSIF maTypeFL = 9 THEN
avgFL = flLSMA
ELSIF maTypeFL = 10 THEN
avgFL = flSMMA
ELSIF maTypeFL = 11 THEN
avgFL = flZLEMA
ELSIF maTypeFL = 12 THEN
avgFL = flKAMA
ELSIF maTypeFL = 13 THEN
avgFL = flT3
ENDIF
//---------------------------------------------
// MAD CALCULO BB + BANDAS (necesario para scoring BB y Combined)
//---------------------------------------------
madBB = 0
FOR i = 0 TO madLenBB - 1 DO
madBB = madBB + abs(src[i] - avgBB)
NEXT
madBB = madBB / madLenBB
bbPosBand = avgBB + madBB * madMultP
bbNegBand = avgBB - madBB * madMultN
//---------------------------------------------
// MAD CALCULO FL
//---------------------------------------------
madFL = 0
FOR i = 0 TO madLenFL - 1 DO
madFL = madFL + abs(src[i] - avgFL)
NEXT
madFL = madFL / madLenFL
//---------------------------------------------
// SERIES DERIVADAS + MAs
//---------------------------------------------
srcXmad = src * madFL
IF maTypeFL = 1 THEN
maSTM = Average[madLenFL](srcXmad)
maM2 = Average[madLenFL](madFL)
ELSIF maTypeFL = 2 THEN
maSTM = ExponentialAverage[madLenFL](srcXmad)
maM2 = ExponentialAverage[madLenFL](madFL)
ELSIF maTypeFL = 3 THEN
maSTM = WeightedAverage[madLenFL](srcXmad)
maM2 = WeightedAverage[madLenFL](madFL)
ELSIF maTypeFL = 4 THEN
maSTM = summation[madLenFL](srcXmad * volume) / summation[madLenFL](volume)
maM2 = summation[madLenFL](madFL * volume) / summation[madLenFL](volume)
ELSIF maTypeFL = 5 THEN
maSTM = DEMA[madLenFL](srcXmad)
maM2 = DEMA[madLenFL](madFL)
ELSIF maTypeFL = 6 THEN
maSTM = TEMA[madLenFL](srcXmad)
maM2 = TEMA[madLenFL](madFL)
ELSIF maTypeFL = 7 THEN
maSTM = WilderAverage[madLenFL](srcXmad)
maM2 = WilderAverage[madLenFL](madFL)
ELSIF maTypeFL = 8 THEN
maSTM = average[madLenFL, 7](srcXmad)
maM2 = average[madLenFL, 7](madFL)
ELSIF maTypeFL = 9 THEN
maSTM = LinearRegression[madLenFL](srcXmad)
maM2 = LinearRegression[madLenFL](madFL)
ELSIF maTypeFL = 10 THEN
maSTM = WilderAverage[madLenFL](srcXmad)
maM2 = WilderAverage[madLenFL](madFL)
ELSIF maTypeFL = 11 THEN
maSTM = average[madLenFL, 8](srcXmad)
maM2 = average[madLenFL, 8](madFL)
ELSIF maTypeFL = 12 THEN
// KAMA de series derivadas
IF barindex < madLenFL THEN
kamaSTM = srcXmad
kamaM2 = madFL
ELSE
nKs = abs(srcXmad - srcXmad[madLenFL])
dKs = summation[madLenFL](abs(srcXmad - srcXmad[1]))
IF dKs > 0 THEN
erKs = nKs / dKs
ELSE
erKs = 0
ENDIF
scKs = erKs * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKs = scKs * scKs
kamaSTM = aKs * srcXmad + (1 - aKs) * kamaSTM[1]
nKm = abs(madFL - madFL[madLenFL])
dKm = summation[madLenFL](abs(madFL - madFL[1]))
IF dKm > 0 THEN
erKm = nKm / dKm
ELSE
erKm = 0
ENDIF
scKm = erKm * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKm = scKm * scKm
kamaM2 = aKm * madFL + (1 - aKm) * kamaM2[1]
ENDIF
maSTM = kamaSTM
maM2 = kamaM2
ELSIF maTypeFL = 13 THEN
// T3 de series derivadas (hot=0.5)
e1s = ExponentialAverage[madLenFL](srcXmad)
e2s = ExponentialAverage[madLenFL](e1s)
e3s = ExponentialAverage[madLenFL](e2s)
e4s = ExponentialAverage[madLenFL](e3s)
e5s = ExponentialAverage[madLenFL](e4s)
e6s = ExponentialAverage[madLenFL](e5s)
maSTM = -0.125 * e6s + 1.125 * e5s - 3.375 * e4s + 3.375 * e3s
e1m = ExponentialAverage[madLenFL](madFL)
e2m = ExponentialAverage[madLenFL](e1m)
e3m = ExponentialAverage[madLenFL](e2m)
e4m = ExponentialAverage[madLenFL](e3m)
e5m = ExponentialAverage[madLenFL](e4m)
e6m = ExponentialAverage[madLenFL](e5m)
maM2 = -0.125 * e6m + 1.125 * e5m - 3.375 * e4m + 3.375 * e3m
ENDIF
// MAD weighted source
IF maM2 <> 0 THEN
mwSrc = maSTM / maM2
ELSE
mwSrc = src
ENDIF
//---------------------------------------------
// FOR LOOP SCORING
//---------------------------------------------
madFLsc = 0
FOR i = loopFrom TO loopTo DO
IF mwSrc > mwSrc[i] THEN
madFLsc = madFLsc + 1
ELSE
madFLsc = madFLsc - 1
ENDIF
NEXT
//---------------------------------------------
// SCORING
//---------------------------------------------
// BB Score
IF src CROSSES OVER bbPosBand THEN
bbScore = 1
ENDIF
IF src CROSSES UNDER bbNegBand THEN
bbScore = -1
ENDIF
// FL Score
IF madFLsc CROSSES OVER threshLFL THEN
flScore = 1
ENDIF
IF madFLsc CROSSES UNDER threshSFL THEN
flScore = -1
ENDIF
// Combined Signal
cSignal = (bbScore + flScore) / 2.0
IF cSignal CROSSES OVER threshLC THEN
combScore = 1
ENDIF
IF cSignal CROSSES UNDER threshSC THEN
combScore = -1
ENDIF
// Score final
IF signalMode = 1 THEN
score = bbScore
ELSIF signalMode = 2 THEN
score = flScore
ELSIF signalMode = 3 THEN
score = combScore
ENDIF
//---------------------------------------------
// DETECCION DE SENALES
//---------------------------------------------
longSig = (score = 1 AND score[1] <> 1)
shortSig = (score = -1 AND score[1] <> -1)
//---------------------------------------------
// COLORES
//---------------------------------------------
// Color MA segun bbScore
IF bbScore = 1 THEN
rBB = upR
gBB = upG
bBB = upB
ELSIF bbScore = -1 THEN
rBB = dnR
gBB = dnG
bBB = dnB
ELSE
rBB = 128
gBB = 128
bBB = 128
ENDIF
//---------------------------------------------
// SENALES VISUALES
//---------------------------------------------
atrOff = averagetruerange[14] * 0.5
IF longSig THEN
DRAWTEXT("▲ Long", barindex, low - atrOff) coloured(upR, upG, upB)
ENDIF
IF shortSig THEN
DRAWTEXT("▼ Short", barindex, high + atrOff) coloured(dnR, dnG, dnB)
ENDIF
//---------------------------------------------
// TABLA INFORMATIVA
//---------------------------------------------
IF islastbarupdate AND showTable = 1 THEN
DRAWTEXT("MAD Trend Modes", -200, -30, Dialog, Bold, 12) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(0, 0, 0)
IF bbScore = 1 THEN
DRAWTEXT("BB: Long ▲", -200, -50, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(upR, upG, upB)
ELSIF bbScore = -1 THEN
DRAWTEXT("BB: Short ▼", -200, -50, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(dnR, dnG, dnB)
ELSE
DRAWTEXT("BB: ---", -200, -50, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(128, 128, 128)
ENDIF
IF flScore = 1 THEN
DRAWTEXT("FL: Up ▲", -200, -70, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(upR, upG, upB)
ELSIF flScore = -1 THEN
DRAWTEXT("FL: Down ▼", -200, -70, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(dnR, dnG, dnB)
ELSE
DRAWTEXT("FL: ---", -200, -70, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(128, 128, 128)
ENDIF
IF combScore = 1 THEN
DRAWTEXT("Comb: Up-Trend ▲", -200, -90, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(upR, upG, upB)
ELSIF combScore = -1 THEN
DRAWTEXT("Comb: Down-Trend ▼", -200, -90, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(dnR, dnG, dnB)
ELSE
DRAWTEXT("Comb: ---", -200, -90, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(128, 128, 128)
ENDIF
ENDIF
//---------------------------------------------
// RETURN (bandas + MA sobre precio)
//---------------------------------------------
RETURN avgBB coloured(rBB, gBB, bBB,50) style(line,5) AS "MA", bbPosBand coloured(upR, upG, upB) AS "Upper Band", bbNegBand coloured(dnR, dnG, dnB) AS "Lower Band"
//---------------------------------------------
//PRC_Mean Deviation Loop [Lyro RS]_PANEL
//version = 0
//04.02.2026
//Iván González @ www.prorealcode.com
//Sharing ProRealTime knowledge
//---------------------------------------------
// --- PARAMETROS ---
//---------------------------------------------
src = close
// Modo senal: 1=Bollinger Bands, 2=For Loop, 3=Combined
signalMode = 3
// Tipo MA: 1=SMA 2=EMA 3=WMA 4=VWMA 5=DEMA 6=TEMA
// 7=RMA 8=HMA 9=LSMA 10=SMMA 11=ZLEMA 12=KAMA 13=T3
// -- Bollinger Bands --
maTypeBB = 2
madLenBB = 25
madMultP = 1.4
madMultN = 1.0
// -- For Loop --
maTypeFL = 2
madLenFL = 10
loopFrom = 10
loopTo = 60
threshLFL = 23
threshSFL = 3
// -- Combined Signal --
threshLC = 0.0
threshSC = 0.0
// -- Tabla --
showTable = 1
// -- Colores: 1=Classic 2=Mystic 3=Accented 4=Royal --
colorMode = 2
useCustomCol = 0
custUpR = 0
custUpG = 255
custUpB = 0
custDnR = 255
custDnG = 0
custDnB = 0
//---------------------------------------------
// SETUP COLORES
//---------------------------------------------
IF colorMode = 1 THEN
upR = 0
upG = 230
upB = 118
dnR = 136
dnG = 14
dnB = 79
ELSIF colorMode = 2 THEN
upR = 48
upG = 253
upB = 207
dnR = 225
dnG = 23
dnB = 183
ELSIF colorMode = 3 THEN
upR = 150
upG = 24
upB = 247
dnR = 255
dnG = 0
dnB = 120
ELSIF colorMode = 4 THEN
upR = 255
upG = 193
upB = 7
dnR = 103
dnG = 58
dnB = 183
ENDIF
IF useCustomCol = 1 THEN
upR = custUpR
upG = custUpG
upB = custUpB
dnR = custDnR
dnG = custDnG
dnB = custDnB
ENDIF
//---------------------------------------------
// PRE-CALCULO: 13 MAs de src con periodo BB
//---------------------------------------------
bbSMA = Average[madLenBB](src)
bbEMA = ExponentialAverage[madLenBB](src)
bbWMA = WeightedAverage[madLenBB](src)
bbVWMA = summation[madLenBB](src * volume) / summation[madLenBB](volume)
bbDEMA = DEMA[madLenBB](src)
bbTEMA = TEMA[madLenBB](src)
bbRMA = WilderAverage[madLenBB](src)
bbHMA = average[madLenBB, 7](src)
bbLSMA = LinearRegression[madLenBB](src)
bbSMMA = WilderAverage[madLenBB](src)
bbZLEMA = average[madLenBB, 8](src)
// KAMA BB (fast=2, slow=30)
IF barindex < madLenBB THEN
bbKAMA = src
ELSE
numKbb = abs(src - src[madLenBB])
denKbb = summation[madLenBB](abs(src - src[1]))
IF denKbb > 0 THEN
erKbb = numKbb / denKbb
ELSE
erKbb = 0
ENDIF
scKbb = erKbb * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKbb = scKbb * scKbb
bbKAMA = aKbb * src + (1 - aKbb) * bbKAMA[1]
ENDIF
// T3 BB (hot=0.5)
eT1bb = ExponentialAverage[madLenBB](src)
eT2bb = ExponentialAverage[madLenBB](eT1bb)
eT3bb = ExponentialAverage[madLenBB](eT2bb)
eT4bb = ExponentialAverage[madLenBB](eT3bb)
eT5bb = ExponentialAverage[madLenBB](eT4bb)
eT6bb = ExponentialAverage[madLenBB](eT5bb)
bbT3 = -0.125 * eT6bb + 1.125 * eT5bb - 3.375 * eT4bb + 3.375 * eT3bb
//---------------------------------------------
// PRE-CALCULO: 13 MAs de src con periodo FL
//---------------------------------------------
flSMA = Average[madLenFL](src)
flEMA = ExponentialAverage[madLenFL](src)
flWMA = WeightedAverage[madLenFL](src)
flVWMA = summation[madLenFL](src * volume) / summation[madLenFL](volume)
flDEMA = DEMA[madLenFL](src)
flTEMA = TEMA[madLenFL](src)
flRMA = WilderAverage[madLenFL](src)
flHMA = average[madLenFL, 7](src)
flLSMA = LinearRegression[madLenFL](src)
flSMMA = WilderAverage[madLenFL](src)
flZLEMA = average[madLenFL, 8](src)
// KAMA FL
IF barindex < madLenFL THEN
flKAMA = src
ELSE
numKfl = abs(src - src[madLenFL])
denKfl = summation[madLenFL](abs(src - src[1]))
IF denKfl > 0 THEN
erKfl = numKfl / denKfl
ELSE
erKfl = 0
ENDIF
scKfl = erKfl * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKfl = scKfl * scKfl
flKAMA = aKfl * src + (1 - aKfl) * flKAMA[1]
ENDIF
// T3 FL (hot=0.5)
eT1fl = ExponentialAverage[madLenFL](src)
eT2fl = ExponentialAverage[madLenFL](eT1fl)
eT3fl = ExponentialAverage[madLenFL](eT2fl)
eT4fl = ExponentialAverage[madLenFL](eT3fl)
eT5fl = ExponentialAverage[madLenFL](eT4fl)
eT6fl = ExponentialAverage[madLenFL](eT5fl)
flT3 = -0.125 * eT6fl + 1.125 * eT5fl - 3.375 * eT4fl + 3.375 * eT3fl
//---------------------------------------------
// SELECTOR MA BB
//---------------------------------------------
IF maTypeBB = 1 THEN
avgBB = bbSMA
ELSIF maTypeBB = 2 THEN
avgBB = bbEMA
ELSIF maTypeBB = 3 THEN
avgBB = bbWMA
ELSIF maTypeBB = 4 THEN
avgBB = bbVWMA
ELSIF maTypeBB = 5 THEN
avgBB = bbDEMA
ELSIF maTypeBB = 6 THEN
avgBB = bbTEMA
ELSIF maTypeBB = 7 THEN
avgBB = bbRMA
ELSIF maTypeBB = 8 THEN
avgBB = bbHMA
ELSIF maTypeBB = 9 THEN
avgBB = bbLSMA
ELSIF maTypeBB = 10 THEN
avgBB = bbSMMA
ELSIF maTypeBB = 11 THEN
avgBB = bbZLEMA
ELSIF maTypeBB = 12 THEN
avgBB = bbKAMA
ELSIF maTypeBB = 13 THEN
avgBB = bbT3
ENDIF
//---------------------------------------------
// SELECTOR MA FL
//---------------------------------------------
IF maTypeFL = 1 THEN
avgFL = flSMA
ELSIF maTypeFL = 2 THEN
avgFL = flEMA
ELSIF maTypeFL = 3 THEN
avgFL = flWMA
ELSIF maTypeFL = 4 THEN
avgFL = flVWMA
ELSIF maTypeFL = 5 THEN
avgFL = flDEMA
ELSIF maTypeFL = 6 THEN
avgFL = flTEMA
ELSIF maTypeFL = 7 THEN
avgFL = flRMA
ELSIF maTypeFL = 8 THEN
avgFL = flHMA
ELSIF maTypeFL = 9 THEN
avgFL = flLSMA
ELSIF maTypeFL = 10 THEN
avgFL = flSMMA
ELSIF maTypeFL = 11 THEN
avgFL = flZLEMA
ELSIF maTypeFL = 12 THEN
avgFL = flKAMA
ELSIF maTypeFL = 13 THEN
avgFL = flT3
ENDIF
//---------------------------------------------
// MAD CALCULO BB + BANDAS (necesario para scoring BB y Combined)
//---------------------------------------------
madBB = 0
FOR i = 0 TO madLenBB - 1 DO
madBB = madBB + abs(src[i] - avgBB)
NEXT
madBB = madBB / madLenBB
bbPosBand = avgBB + madBB * madMultP
bbNegBand = avgBB - madBB * madMultN
//---------------------------------------------
// MAD CALCULO FL
//---------------------------------------------
madFL = 0
FOR i = 0 TO madLenFL - 1 DO
madFL = madFL + abs(src[i] - avgFL)
NEXT
madFL = madFL / madLenFL
//---------------------------------------------
// SERIES DERIVADAS + MAs
//---------------------------------------------
srcXmad = src * madFL
IF maTypeFL = 1 THEN
maSTM = Average[madLenFL](srcXmad)
maM2 = Average[madLenFL](madFL)
ELSIF maTypeFL = 2 THEN
maSTM = ExponentialAverage[madLenFL](srcXmad)
maM2 = ExponentialAverage[madLenFL](madFL)
ELSIF maTypeFL = 3 THEN
maSTM = WeightedAverage[madLenFL](srcXmad)
maM2 = WeightedAverage[madLenFL](madFL)
ELSIF maTypeFL = 4 THEN
maSTM = summation[madLenFL](srcXmad * volume) / summation[madLenFL](volume)
maM2 = summation[madLenFL](madFL * volume) / summation[madLenFL](volume)
ELSIF maTypeFL = 5 THEN
maSTM = DEMA[madLenFL](srcXmad)
maM2 = DEMA[madLenFL](madFL)
ELSIF maTypeFL = 6 THEN
maSTM = TEMA[madLenFL](srcXmad)
maM2 = TEMA[madLenFL](madFL)
ELSIF maTypeFL = 7 THEN
maSTM = WilderAverage[madLenFL](srcXmad)
maM2 = WilderAverage[madLenFL](madFL)
ELSIF maTypeFL = 8 THEN
maSTM = average[madLenFL, 7](srcXmad)
maM2 = average[madLenFL, 7](madFL)
ELSIF maTypeFL = 9 THEN
maSTM = LinearRegression[madLenFL](srcXmad)
maM2 = LinearRegression[madLenFL](madFL)
ELSIF maTypeFL = 10 THEN
maSTM = WilderAverage[madLenFL](srcXmad)
maM2 = WilderAverage[madLenFL](madFL)
ELSIF maTypeFL = 11 THEN
maSTM = average[madLenFL, 8](srcXmad)
maM2 = average[madLenFL, 8](madFL)
ELSIF maTypeFL = 12 THEN
// KAMA de series derivadas
IF barindex < madLenFL THEN
kamaSTM = srcXmad
kamaM2 = madFL
ELSE
nKs = abs(srcXmad - srcXmad[madLenFL])
dKs = summation[madLenFL](abs(srcXmad - srcXmad[1]))
IF dKs > 0 THEN
erKs = nKs / dKs
ELSE
erKs = 0
ENDIF
scKs = erKs * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKs = scKs * scKs
kamaSTM = aKs * srcXmad + (1 - aKs) * kamaSTM[1]
nKm = abs(madFL - madFL[madLenFL])
dKm = summation[madLenFL](abs(madFL - madFL[1]))
IF dKm > 0 THEN
erKm = nKm / dKm
ELSE
erKm = 0
ENDIF
scKm = erKm * (2.0 / 3.0 - 2.0 / 31.0) + 2.0 / 31.0
aKm = scKm * scKm
kamaM2 = aKm * madFL + (1 - aKm) * kamaM2[1]
ENDIF
maSTM = kamaSTM
maM2 = kamaM2
ELSIF maTypeFL = 13 THEN
// T3 de series derivadas (hot=0.5)
e1s = ExponentialAverage[madLenFL](srcXmad)
e2s = ExponentialAverage[madLenFL](e1s)
e3s = ExponentialAverage[madLenFL](e2s)
e4s = ExponentialAverage[madLenFL](e3s)
e5s = ExponentialAverage[madLenFL](e4s)
e6s = ExponentialAverage[madLenFL](e5s)
maSTM = -0.125 * e6s + 1.125 * e5s - 3.375 * e4s + 3.375 * e3s
e1m = ExponentialAverage[madLenFL](madFL)
e2m = ExponentialAverage[madLenFL](e1m)
e3m = ExponentialAverage[madLenFL](e2m)
e4m = ExponentialAverage[madLenFL](e3m)
e5m = ExponentialAverage[madLenFL](e4m)
e6m = ExponentialAverage[madLenFL](e5m)
maM2 = -0.125 * e6m + 1.125 * e5m - 3.375 * e4m + 3.375 * e3m
ENDIF
// MAD weighted source
IF maM2 <> 0 THEN
mwSrc = maSTM / maM2
ELSE
mwSrc = src
ENDIF
//---------------------------------------------
// FOR LOOP SCORING
//---------------------------------------------
madFLsc = 0
FOR i = loopFrom TO loopTo DO
IF mwSrc > mwSrc[i] THEN
madFLsc = madFLsc + 1
ELSE
madFLsc = madFLsc - 1
ENDIF
NEXT
//---------------------------------------------
// SCORING
//---------------------------------------------
// BB Score
IF src CROSSES OVER bbPosBand THEN
bbScore = 1
ENDIF
IF src CROSSES UNDER bbNegBand THEN
bbScore = -1
ENDIF
// FL Score
IF madFLsc CROSSES OVER threshLFL THEN
flScore = 1
ENDIF
IF madFLsc CROSSES UNDER threshSFL THEN
flScore = -1
ENDIF
// Combined Signal
cSignal = (bbScore + flScore) / 2.0
IF cSignal CROSSES OVER threshLC THEN
combScore = 1
ENDIF
IF cSignal CROSSES UNDER threshSC THEN
combScore = -1
ENDIF
// Score final
IF signalMode = 1 THEN
score = bbScore
ELSIF signalMode = 2 THEN
score = flScore
ELSIF signalMode = 3 THEN
score = combScore
ENDIF
//---------------------------------------------
// DETECCION DE SENALES
//---------------------------------------------
longSig = (score = 1 AND score[1] <> 1)
shortSig = (score = -1 AND score[1] <> -1)
//---------------------------------------------
// COLORES
//---------------------------------------------
// Color linea FL segun flScore
IF flScore = 1 THEN
rFL = upR
gFL = upG
bFL = upB
ELSIF flScore = -1 THEN
rFL = dnR
gFL = dnG
bFL = dnB
ELSE
rFL = 128
gFL = 128
bFL = 128
ENDIF
//---------------------------------------------
// SENALES VISUALES
//---------------------------------------------
IF longSig THEN
DRAWPOINT(barindex, madFLsc, 3) coloured(upR, upG, upB)
ENDIF
IF shortSig THEN
DRAWPOINT(barindex, madFLsc, 3) coloured(dnR, dnG, dnB)
ENDIF
//---------------------------------------------
// TABLA INFORMATIVA
//---------------------------------------------
IF islastbarupdate AND showTable = 1 THEN
DRAWTEXT("MAD Trend Modes", -200, -30, Dialog, Bold, 12) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(0, 0, 0)
IF bbScore = 1 THEN
DRAWTEXT("BB: Long ▲", -200, -50, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(upR, upG, upB)
ELSIF bbScore = -1 THEN
DRAWTEXT("BB: Short ▼", -200, -50, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(dnR, dnG, dnB)
ELSE
DRAWTEXT("BB: ---", -200, -50, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(128, 128, 128)
ENDIF
IF flScore = 1 THEN
DRAWTEXT("FL: Up ▲", -200, -70, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(upR, upG, upB)
ELSIF flScore = -1 THEN
DRAWTEXT("FL: Down ▼", -200, -70, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(dnR, dnG, dnB)
ELSE
DRAWTEXT("FL: ---", -200, -70, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(128, 128, 128)
ENDIF
IF combScore = 1 THEN
DRAWTEXT("Comb: Up-Trend ▲", -200, -90, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(upR, upG, upB)
ELSIF combScore = -1 THEN
DRAWTEXT("Comb: Down-Trend ▼", -200, -90, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(dnR, dnG, dnB)
ELSE
DRAWTEXT("Comb: ---", -200, -90, Dialog, Standard, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) coloured(128, 128, 128)
ENDIF
ENDIF
//---------------------------------------------
// FILL entre oscilador y cero
//---------------------------------------------
zeroLine = 0
COLORBETWEEN(madFLsc, zeroLine, rFL, gFL, bFL, 40)
//---------------------------------------------
// RETURN (oscilador + thresholds en panel separado)
//---------------------------------------------
RETURN madFLsc coloured(rFL, gFL, bFL) AS "MAD For Loop", threshLFL coloured(upR, upG, upB) AS "Long Threshold", threshSFL coloured(dnR, dnG, dnB) AS "Short Threshold", zeroLine coloured(150, 150, 150) style(dottedline2) AS "Zero"