Source code for backtrader.indicators.contrib.momentum_candle_sign_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 (
    ATR,
    Indicator,
    Momentum,
)

__all__ = [
    "MomentumCandleSignIndicator",
]


[docs] class MomentumCandleSignIndicator(Indicator): """Emit ATR-offset buy/sell dots on open/close momentum crossovers.""" lines = ("sell_signal", "buy_signal", "momentum_open", "momentum_close") params = ( ("period", 12), ("atr_period", 15), ) def __init__(self): """Build open/close momentum and ATR sub-indicators and set min period.""" self.addminperiod(max(int(self.p.period), int(self.p.atr_period)) + 3) self.momentum_open = Momentum(self.data.open, period=int(self.p.period)) self.momentum_close = Momentum(self.data.close, period=int(self.p.period)) self.atr = ATR(self.data, period=int(self.p.atr_period))
[docs] def next(self): """Detect momentum crossovers and place ATR-offset signal dots.""" self.lines.sell_signal[0] = 0.0 self.lines.buy_signal[0] = 0.0 self.lines.momentum_open[0] = float(self.momentum_open[0]) self.lines.momentum_close[0] = float(self.momentum_close[0]) if len(self.data) < 2: return prev_open = float(self.momentum_open[-1]) prev_close = float(self.momentum_close[-1]) curr_open = float(self.momentum_open[0]) curr_close = float(self.momentum_close[0]) atr = float(self.atr[0]) if prev_open >= prev_close and curr_open < curr_close: self.lines.buy_signal[0] = float(self.data.low[0]) - atr * 3.0 / 8.0 if prev_open <= prev_close and curr_open > curr_close: self.lines.sell_signal[0] = float(self.data.high[0]) + atr * 3.0 / 8.0