Source code for backtrader.indicators.contrib.renko_line_break

#!/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__ = [
    "RenkoLineBreak",
]


[docs] class RenkoLineBreak(Indicator): """Indicator that models renko-like box transitions.""" lines = ("upper", "lower", "boxes") params = ( ("min_box_size", 500), ("point", 0.01), ) def __init__(self): """Initialize box size and state.""" box_size = float(self.p.min_box_size) if box_size < 0: box_size = 300.0 self._box_size = box_size * float(self.p.point) self._seed_close = None self._initialized = False self._up = False self.addminperiod(1)
[docs] def next(self): """Update Renko upper/lower/box count states each bar.""" price = float(self.data.close[0]) if self._seed_close is None: self._seed_close = price self.lines.upper[0] = 0.0 self.lines.lower[0] = 0.0 self.lines.boxes[0] = 0.0 return if not self._initialized: if abs(price - self._seed_close) < self._box_size: self.lines.upper[0] = 0.0 self.lines.lower[0] = 0.0 self.lines.boxes[0] = 0.0 return if price > self._seed_close: self.lines.upper[0] = price self.lines.lower[0] = self._seed_close self.lines.boxes[0] = 1.0 self._up = True else: self.lines.upper[0] = self._seed_close self.lines.lower[0] = price self.lines.boxes[0] = -1.0 self._up = False self._initialized = True return prev_up = float(self.lines.upper[-1]) prev_dn = float(self.lines.lower[-1]) prev_boxes = float(self.lines.boxes[-1]) if price >= prev_up + self._box_size: self.lines.upper[0] = price self.lines.lower[0] = prev_up if self._up: self.lines.boxes[0] = prev_boxes + 1.0 else: self._up = True self.lines.boxes[0] = 1.0 return if price <= prev_dn - self._box_size: self.lines.upper[0] = prev_dn self.lines.lower[0] = price if self._up: self._up = False self.lines.boxes[0] = -1.0 else: self.lines.boxes[0] = prev_boxes - 1.0 return self.lines.upper[0] = prev_up self.lines.lower[0] = prev_dn self.lines.boxes[0] = prev_boxes