Source code for backtrader.indicators.contrib.trigger_line
#!/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__ = [
"TriggerLine",
]
[docs]
class TriggerLine(Indicator):
"""Trigger-line indicator tracking momentum-driven main and signal lines."""
lines = ("main", "signal")
params = (
("rperiod", 24),
("lsma_period", 6),
("price", "close"),
)
def __init__(self):
"""Initialize indicator coefficients and warmup."""
self.addminperiod(int(self.p.rperiod) + 3)
self.lengthvar = (int(self.p.rperiod) + 1) / 3.0
self.kr = 6.0 / (float(self.p.rperiod) * (float(self.p.rperiod) + 1.0))
self.klsma = 2.0 / (float(self.p.lsma_period) + 1.0)
def _price(self, index=0):
p = str(self.p.price).lower()
if p == "open":
return float(self.data.open[index])
if p == "high":
return float(self.data.high[index])
if p == "low":
return float(self.data.low[index])
if p == "median":
return (float(self.data.high[index]) + float(self.data.low[index])) / 2.0
if p == "typical":
return (
float(self.data.high[index])
+ float(self.data.low[index])
+ float(self.data.close[index])
) / 3.0
if p == "weighted":
return (
float(self.data.high[index])
+ float(self.data.low[index])
+ 2.0 * float(self.data.close[index])
) / 4.0
return float(self.data.close[index])
[docs]
def next(self):
"""Compute main and signal values for current bar."""
total = 0.0
rp = int(self.p.rperiod)
for iii in range(rp, 0, -1):
idx = -(rp - iii)
total += (iii - self.lengthvar) * self._price(idx)
main = total * self.kr
prev_main = float(self.lines.main[-1]) if len(self) > 1 else main
self.lines.main[0] = main
self.lines.signal[0] = prev_main + (main - prev_main) * self.klsma