"""Type stubs for the Wickra public API."""

from __future__ import annotations

from typing import Any, Mapping, Optional, Tuple, Union

import numpy as np
from numpy.typing import NDArray

__version__: str

CandleLike = Union[
    Tuple[float, float, float, float, float, int],
    Mapping[str, Any],
]

class SMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class EMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def alpha(self) -> float: ...
    @property
    def value(self) -> Optional[float]: ...

class WMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class SMMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class TRIMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class ADL:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class VolumePriceTrend:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class ChaikinMoneyFlow:
    def __init__(self, period: int = 20) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class ChaikinOscillator:
    def __init__(self, fast: int = 3, slow: int = 10) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...

class ForceIndex:
    def __init__(self, period: int = 13) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class EaseOfMovement:
    def __init__(self, period: int = 14, divisor: float = 100000000.0) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def divisor(self) -> float: ...

class SuperTrend:
    def __init__(self, atr_period: int = 10, multiplier: float = 3.0) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 2)`` with columns ``[value, direction]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def params(self) -> Tuple[int, float]: ...

class ChandelierExit:
    def __init__(self, period: int = 22, multiplier: float = 3.0) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 2)`` with columns ``[long_stop, short_stop]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def params(self) -> Tuple[int, float]: ...

class ChandeKrollStop:
    def __init__(
        self, atr_period: int = 10, atr_multiplier: float = 1.0, stop_period: int = 9
    ) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 2)`` with columns ``[stop_long, stop_short]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def params(self) -> Tuple[int, float, int]: ...

class AtrTrailingStop:
    def __init__(self, atr_period: int = 14, multiplier: float = 3.0) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def params(self) -> Tuple[int, float]: ...

class TypicalPrice:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class MedianPrice:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class WeightedClose:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class LinearRegression:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class LinRegSlope:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class AcceleratorOscillator:
    def __init__(
        self, ao_fast: int = 5, ao_slow: int = 34, signal_period: int = 5
    ) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def params(self) -> Tuple[int, int, int]: ...

class BalanceOfPower:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        open: NDArray[np.float64],
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class ChoppinessIndex:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class VerticalHorizontalFilter:
    def __init__(self, period: int = 28) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class TrueRange:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class ChaikinVolatility:
    def __init__(self, ema_period: int = 10, roc_period: int = 10) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...

class ZScore:
    def __init__(self, period: int = 20) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class LinRegAngle:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class BollingerBandwidth:
    def __init__(self, period: int = 20, multiplier: float = 2.0) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def multiplier(self) -> float: ...
    @property
    def value(self) -> Optional[float]: ...

class PercentB:
    def __init__(self, period: int = 20, multiplier: float = 2.0) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def multiplier(self) -> float: ...
    @property
    def value(self) -> Optional[float]: ...

class NATR:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class StdDev:
    def __init__(self, period: int = 20) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class UlcerIndex:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class HistoricalVolatility:
    def __init__(self, period: int = 20, trading_periods: int = 252) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class AroonOscillator:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class Vortex:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 2)`` with columns ``[plus, minus]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class MassIndex:
    def __init__(self, ema_period: int = 9, sum_period: int = 25) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class PPO:
    def __init__(self, fast: int = 12, slow: int = 26) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class DPO:
    def __init__(self, period: int = 20) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def shift(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class Coppock:
    def __init__(
        self, roc_long: int = 14, roc_short: int = 11, wma_period: int = 10
    ) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class StochRSI:
    def __init__(self, rsi_period: int = 14, stoch_period: int = 14) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class UltimateOscillator:
    def __init__(self, short: int = 7, mid: int = 14, long: int = 28) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class MOM:
    def __init__(self, period: int = 10) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class CMO:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class TSI:
    def __init__(self, long: int = 25, short: int = 13) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class PMO:
    def __init__(self, smoothing1: int = 35, smoothing2: int = 20) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...
    @property
    def value(self) -> Optional[float]: ...

class ZLEMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def lag(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class T3:
    def __init__(self, period: int, v: float = 0.7) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def volume_factor(self) -> float: ...
    @property
    def value(self) -> Optional[float]: ...

class VWMA:
    def __init__(self, period: int) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class RSI:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class MACD:
    def __init__(self, fast: int = 12, slow: int = 26, signal: int = 9) -> None: ...
    def update(self, value: float) -> Optional[Tuple[float, float, float]]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]:
        """Returns shape ``(n, 3)`` with columns ``[macd, signal, histogram]``. NaN during warmup."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int, int]: ...

class BollingerBands:
    def __init__(self, period: int = 20, multiplier: float = 2.0) -> None: ...
    def update(self, value: float) -> Optional[Tuple[float, float, float, float]]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]:
        """Returns shape ``(n, 4)`` with columns ``[upper, middle, lower, stddev]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...
    @property
    def multiplier(self) -> float: ...

class ATR:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class Stochastic:
    def __init__(self, k_period: int = 14, d_period: int = 3) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 2)`` with columns ``[k, d]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def periods(self) -> Tuple[int, int]: ...

class OBV:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def value(self) -> Optional[float]: ...

class DEMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class TEMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class HMA:
    def __init__(self, period: int) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class KAMA:
    def __init__(self, er_period: int = 10, fast: int = 2, slow: int = 30) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class CCI:
    def __init__(self, period: int = 20) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class ROC:
    def __init__(self, period: int = 10) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
    @property
    def period(self) -> int: ...

class WilliamsR:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class ADX:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 3)`` with columns ``[plus_di, minus_di, adx]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class MFI:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class TRIX:
    def __init__(self, period: int = 30) -> None: ...
    def update(self, value: float) -> Optional[float]: ...
    def batch(self, prices: NDArray[np.float64]) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class PSAR:
    def __init__(
        self, af_start: float = 0.02, af_step: float = 0.02, af_max: float = 0.20
    ) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class Keltner:
    def __init__(
        self, ema_period: int = 20, atr_period: int = 10, multiplier: float = 2.0
    ) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 3)`` with columns ``[upper, middle, lower]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class Donchian:
    def __init__(self, period: int = 20) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 3)`` with columns ``[upper, middle, lower]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class VWAP:
    def __init__(self) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class RollingVWAP:
    def __init__(self, period: int) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
        close: NDArray[np.float64],
        volume: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    @property
    def period(self) -> int: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class AwesomeOscillator:
    def __init__(self, fast: int = 5, slow: int = 34) -> None: ...
    def update(self, candle: CandleLike) -> Optional[float]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]: ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...

class Aroon:
    def __init__(self, period: int = 14) -> None: ...
    def update(self, candle: CandleLike) -> Optional[Tuple[float, float]]: ...
    def batch(
        self,
        high: NDArray[np.float64],
        low: NDArray[np.float64],
    ) -> NDArray[np.float64]:
        """Returns shape ``(n, 2)`` with columns ``[up, down]``."""
        ...
    def reset(self) -> None: ...
    def is_ready(self) -> bool: ...
    def warmup_period(self) -> int: ...
