From 8b0cf4e574390738ee33f7ff334dd5f5109b7819 Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Wed, 1 Apr 2026 18:37:11 +0900 Subject: feat(strategy): add technical indicators library (ATR, ADX, RSI, MACD, Bollinger, Stochastic, OBV) --- .../strategy-engine/strategies/indicators/volume.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 services/strategy-engine/strategies/indicators/volume.py (limited to 'services/strategy-engine/strategies/indicators/volume.py') diff --git a/services/strategy-engine/strategies/indicators/volume.py b/services/strategy-engine/strategies/indicators/volume.py new file mode 100644 index 0000000..323d427 --- /dev/null +++ b/services/strategy-engine/strategies/indicators/volume.py @@ -0,0 +1,21 @@ +"""Volume indicators: Volume SMA, Volume Ratio, OBV.""" +import pandas as pd +import numpy as np + + +def volume_sma(volumes: pd.Series, period: int = 20) -> pd.Series: + """Simple moving average of volume.""" + return volumes.rolling(window=period).mean() + + +def volume_ratio(volumes: pd.Series, period: int = 20) -> pd.Series: + """Current volume as ratio of average volume. >1 = above average.""" + avg = volume_sma(volumes, period) + return volumes / avg.replace(0, float("nan")) + + +def obv(closes: pd.Series, volumes: pd.Series) -> pd.Series: + """On-Balance Volume.""" + direction = np.sign(closes.diff()) + direction.iloc[0] = 0 + return (direction * volumes).cumsum() -- cgit v1.2.3