Source code for backtrader.indicators.contrib.rd_trend_trigger_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 (
ExponentialMovingAverage,
Indicator,
)
__all__ = [
"RDTrendTriggerIndicator",
]
[docs]
class RDTrendTriggerIndicator(Indicator):
"""Custom indicator that derives normalized range-trend trigger values."""
lines = ("value",)
params = (
("regress", 15),
("t3_length", 5),
("t3_phase", 70),
)
def __init__(self):
"""Initialize helper buffers and required warmup length."""
self._ema = ExponentialMovingAverage(self.lines.value, period=max(1, int(self.p.t3_length)))
self.addminperiod(int(self.p.regress) * 2 + int(self.p.t3_length) + 3)
[docs]
def next(self):
"""Compute trend trigger value from rolling high/low comparisons."""
regress = int(self.p.regress)
highs_recent = [float(self.data.high[-i]) for i in range(regress)]
highs_older = [float(self.data.high[-regress - i]) for i in range(regress)]
lows_recent = [float(self.data.low[-i]) for i in range(regress)]
lows_older = [float(self.data.low[-regress - i]) for i in range(regress)]
highest_high_recent = max(highs_recent)
highest_high_older = max(highs_older)
lowest_low_recent = min(lows_recent)
lowest_low_older = min(lows_older)
buy_power = highest_high_recent - lowest_low_older
sell_power = highest_high_older - lowest_low_recent
denom = buy_power + sell_power
ttf = ((buy_power - sell_power) / (0.5 * denom) * 100.0) if denom else 0.0
prev = float(self.lines.value[-1]) if len(self) > 0 else ttf
period = max(1, int(self.p.t3_length))
alpha = 2.0 / (period + 1.0)
self.lines.value[0] = alpha * ttf + (1.0 - alpha) * prev