Re: Advanced Algorithmic Filtering: The Fractal Adaptive Moving Average (FRAMA) + MQL Code
Posted: Sat Sep 12, 2026 4:17 pm
The Pine Script Implementation
This script builds an ATR channel around KAMA and paints arrows when a candle successfully closes outside the volatility bands.
This script builds an ATR channel around KAMA and paints arrows when a candle successfully closes outside the volatility bands.
Code: Select all
//@version=5
indicator("KAMA + ATR Breakout Channel", overlay=true)
// --- KAMA Inputs ---
kLength = input.int(14, "KAMA Lookback", group="KAMA Settings")
kFast = input.int(2, "KAMA Fast EMA", group="KAMA Settings")
kSlow = input.int(30, "KAMA Slow EMA", group="KAMA Settings")
// --- Channel Inputs ---
atrLen = input.int(14, "ATR Length", group="Channel Settings")
atrMult = input.float(2.0, "ATR Multiplier", step=0.1, group="Channel Settings")
// ==========================================
// KAMA CALCULATION
// ==========================================
direction = math.abs(close - close[kLength])
volatility = math.sum(math.abs(close - close[1]), kLength)
er = volatility != 0 ? direction / volatility : 0
fastAlpha = 2 / (kFast + 1)
slowAlpha = 2 / (kSlow + 1)
sc = math.pow((er * (fastAlpha - slowAlpha)) + slowAlpha, 2)
var float kama = na
kama := na(kama[1]) ? close : kama[1] + sc * (close - kama[1])
// ==========================================
// ATR BANDS CALCULATION
// ==========================================
// Using built-in ATR for pure volatility distance
currentAtr = ta.atr(atrLen)
upperBand = kama + (currentAtr * atrMult)
lowerBand = kama - (currentAtr * atrMult)
// ==========================================
// PLOTTING & SIGNALS
// ==========================================
// Draw KAMA and Channels
plot(kama, color=color.rgb(41, 98, 255), linewidth=2, title="KAMA Base")
uPlot = plot(upperBand, color=color.new(color.gray, 50), title="Upper ATR Band")
lPlot = plot(lowerBand, color=color.new(color.gray, 50), title="Lower ATR Band")
fill(uPlot, lPlot, color=color.new(color.rgb(41, 98, 255), 92), title="Channel Fill")
// Breakout Logic (Close outside the bands)
longBreakout = ta.crossover(close, upperBand)
shortBreakout = ta.crossunder(close, lowerBand)
// Paint signals on the chart
plotshape(longBreakout, title="Long Breakout", style=shape.triangleup, location=location.belowbar, color=color.rgb(0, 230, 119), size=size.small)
plotshape(shortBreakout, title="Short Breakout", style=shape.triangledown, location=location.abovebar, color=color.rgb(255, 82, 82), size=size.small)