Source code for backtrader.indicators.contrib.laguerre_roc_indicator
#!/usr/bin/env python
"""Functional-test indicators migrated to contrib.
Generated from a single functional strategy module to preserve file-local
helper functions and constants without cross-test name collisions.
"""
from .. import Indicator
__all__ = [
"LaguerreRocIndicator",
]
[docs]
class LaguerreRocIndicator(Indicator):
"""Laguerre ROC indicator emitting value, midline, and color."""
lines = ("lroc", "midline", "color")
params = (
("vperiod", 5),
("gamma", 0.5),
("up_level", 0.75),
("dn_level", 0.25),
("point", 0.01),
)
def __init__(self):
"""Initialize rolling state and warm-up period."""
self.addminperiod(int(self.p.vperiod) + 4)
self._initialized = False
self._l0 = self._l1 = self._l2 = self._l3 = None
[docs]
def next(self):
"""Calculate laguerre recursive values and output normalized ROC color."""
if len(self.data) <= int(self.p.vperiod):
self.lines.lroc[0] = 0.5
self.lines.midline[0] = 0.5
self.lines.color[0] = 2
return
reference = float(self.data.close[-int(self.p.vperiod)])
if reference == 0:
roc = float(self.p.point)
else:
roc = (float(self.data.close[0]) - reference) / reference + float(self.p.point)
gamma = float(self.p.gamma)
if not self._initialized:
self._l0 = self._l1 = self._l2 = self._l3 = roc
self._initialized = True
l0_prev, l1_prev, l2_prev, l3_prev = self._l0, self._l1, self._l2, self._l3
l0 = (1.0 - gamma) * roc + gamma * l0_prev
l1 = -gamma * l0 + l0_prev + gamma * l1_prev
l2 = -gamma * l1 + l1_prev + gamma * l2_prev
l3 = -gamma * l2 + l2_prev + gamma * l3_prev
cu = 0.0
cd = 0.0
if l0 >= l1:
cu += l0 - l1
else:
cd += l1 - l0
if l1 >= l2:
cu += l1 - l2
else:
cd += l2 - l1
if l2 >= l3:
cu += l2 - l3
else:
cd += l3 - l2
lroc = cu / (cu + cd) if (cu + cd) != 0 else 0.5
color = 2
if lroc > float(self.p.up_level):
color = 4
elif lroc > 0.5:
color = 3
if lroc < float(self.p.dn_level):
color = 0
elif lroc < 0.5:
color = 1
self.lines.lroc[0] = lroc
self.lines.midline[0] = 0.5
self.lines.color[0] = color
self._l0, self._l1, self._l2, self._l3 = l0, l1, l2, l3