summaryrefslogtreecommitdiff
path: root/services/strategy-engine/strategies/indicators/volume.py
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-01 18:37:11 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-01 18:37:11 +0900
commit8b0cf4e574390738ee33f7ff334dd5f5109b7819 (patch)
tree371f4d99581e5aad26658a2ff5f7792efcb9f6ab /services/strategy-engine/strategies/indicators/volume.py
parentb23aef3a9947d4d3d8e87b595ecf547159df7289 (diff)
feat(strategy): add technical indicators library (ATR, ADX, RSI, MACD, Bollinger, Stochastic, OBV)
Diffstat (limited to 'services/strategy-engine/strategies/indicators/volume.py')
-rw-r--r--services/strategy-engine/strategies/indicators/volume.py21
1 files changed, 21 insertions, 0 deletions
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()