Files
QuanTAlib/lib/trends_IIR/coral/coral.pine
T

65 lines
2.2 KiB
Plaintext
Raw Normal View History

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Coral Filter (CORAL)", "CORAL", overlay=true)
//@function Calculates the Coral trend filter using 6 cascaded EMAs with polynomial combination
//@param source Series to smooth
//@param period Smoothing period (determines EMA alpha via di = (period-1)/2 + 1)
//@param cd Constant D — controls the polynomial weighting of cascaded EMAs (default 0.4)
//@returns Coral filter value from first bar
//@description The Coral filter (LazyBear, adapted from MT4) chains 6 EMA passes and linearly
// combines stages 3-6 using polynomial coefficients derived from 'cd'. This creates a smooth,
// low-lag trend line. Structure: 6× cascaded EMA → polynomial combination.
// di = (period - 1) / 2 + 1
// c1 = 2 / (di + 1) (EMA alpha)
// c2 = 1 - c1 (EMA complement)
// c3 = 3*(cd² + cd³)
// c4 = -3*(2*cd² + cd + cd³)
// c5 = 3*cd + 1 + cd³ + 3*cd²
// bfr = -cd³*i6 + c3*i5 + c4*i4 + c5*i3
// Note: c3 + c4 + c5 + (-cd³) = 1 (unity DC gain).
coral(series float source, simple int period, simple float cd = 0.4) =>
float di = (period - 1.0) / 2.0 + 1.0
float c1 = 2.0 / (di + 1.0)
float c2 = 1.0 - c1
// Polynomial combination coefficients from Constant D
float cd2 = cd * cd
float cd3 = cd2 * cd
float c3 = 3.0 * (cd2 + cd3)
float c4 = -3.0 * (2.0 * cd2 + cd + cd3)
float c5 = 3.0 * cd + 1.0 + cd3 + 3.0 * cd2
// 6 cascaded EMAs
var float i1 = 0.0
var float i2 = 0.0
var float i3 = 0.0
var float i4 = 0.0
var float i5 = 0.0
var float i6 = 0.0
i1 := c1 * source + c2 * i1
i2 := c1 * i1 + c2 * i2
i3 := c1 * i2 + c2 * i3
i4 := c1 * i3 + c2 * i4
i5 := c1 * i4 + c2 * i5
i6 := c1 * i5 + c2 * i6
// Polynomial combination of stages 3-6
float bfr = -cd3 * i6 + c3 * i5 + c4 * i4 + c5 * i3
bfr
// ---------- Main loop ----------
// Inputs
i_period = input.int(21, "Smoothing Period", minval=1)
i_cd = input.float(0.4, "Constant D", minval=0, maxval=1, step=0.01)
i_source = input.source(close, "Source")
// Calculation
coral_value = coral(i_source, period=i_period, cd=i_cd)
// Plot
plot(coral_value, "CORAL", color=color.yellow, linewidth=2)