Mean Deviation Loop

Category: Indicators By: Iván González Created: February 11, 2026, 9:04 AM
February 11, 2026, 9:04 AM
Indicators
0 Comments

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:

  1. Price Overlay: Displays the trend line, volatility bands, and real-time signals.
  2. Panel Oscillator: Displays the underlying scoring momentum and cycle thresholds.

 

The Concept: “Polling” the Past

 

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.

 

1. The Math: MAD vs. Standard Deviation

 

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.

 

2. The “For Loop” Scoring System

 

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:

 

  • It calculates a “MAD-Weighted Source” (a volatility-adjusted price).
  • It then runs a loop from loopFrom (e.g., 10 bars ago) to loopTo (e.g., 60 bars ago).
  • For every bar in that past range where the current value is higher, it adds +1 point.
  • For every bar where it is lower, it subtracts -1 point.

 

The result is a Score. If the score is high, it means the current price dominates the majority of the recent history.

 

Signal Modes

 

The indicator offers three distinct calculation modes via the signalMode parameter, allowing you to adapt the sensitivity to your trading style:

 

Mode 1: Bollinger Bands (Volatility Breakout)

 

This mode mimics the classic Bollinger Band logic but uses MAD instead of Standard Deviation.

  • Bullish (+1): Price crosses over the Upper Band.
  • Bearish (-1): Price crosses under the Lower Band.

Mode 2: For Loop (Iterative Momentum)

 

This uses the scoring system described above.

  • Bullish (+1): The Loop Score crosses over the Long Threshold (threshLFL).
  • Bearish (-1): The Loop Score crosses under the Short Threshold (threshSFL).
  • Note: This mode is excellent for identifying cyclical shifts in momentum.

Mode 3: Combined (The Hybrid Approach)

 

This is the default and most recommended mode. It calculates the average of both the Bollinger score and the For Loop score.

  • A signal is generated only when both the price structure (Bands) and the historical momentum (Loop) agree.
  • This acts as a powerful filter against false breakouts in ranging markets.

On-Chart Dashboard

 

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:

  • BB: Shows if the Price/Band logic is Long or Short.
  • FL: Shows if the Loop Score is Up or Down.
  • Comb: Shows the final Combined Trend signal.

 

This allows you to see the “market consensus” at a glance.

Configuration & Settings

 

The indicator is highly customizable. Here are the key parameters you can tweak:

  • src: The price source (default is Close).
  • signalMode: 1 (BB), 2 (For Loop), or 3 (Combined).
  • maType: Choose the smoothing algorithm for the calculations. You have access to 13 different types, including:
  • 1 = SMA (Simple)
  • 2 = EMA (Exponential – Default)
  • 8 = HMA (Hull – very fast)
  • 12 = KAMA (Adaptive)
  • 13 = T3 (Tillson)
  • loopFrom / loopTo: Defines the range of the historical “poll”. Increasing loopTo (e.g., to 100) makes the Loop Score smoother and more long-term.
  • threshLFL / threshSFL: The trigger levels for the For Loop oscillator.
  • colorMode: Changes the visual theme.
  • 1=Classic, 2=Mystic (Default), 3=Accented, 4=Royal.

Installation

 

This system requires two separate indicators to function fully.

  1. Price Indicator: Add this to your main price chart. It handles the bands, the moving average, the text signals, and the dashboard.
  2. Panel Indicator: Add this below your chart. It visualizes the Loop Oscillator, helping you see the strength of the trend and potential exhaustion points (when the oscillator hits extremes).

 

//---------------------------------------------
//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"

Download
Filename: PRC_Mean-Deviation-Loop_panel.itf
Downloads: 66
Download
Filename: PRC_Mean-Deviation-Loop_price.itf
Downloads: 68
Iván González Master
Currently debugging life, so my bio is on hold. Check back after the next commit for an update.
Author’s Profile

Comments

Logo Logo
Loading...