summaryrefslogtreecommitdiff
path: root/services/strategy-engine/tests/test_volume_profile_strategy.py
diff options
context:
space:
mode:
Diffstat (limited to 'services/strategy-engine/tests/test_volume_profile_strategy.py')
-rw-r--r--services/strategy-engine/tests/test_volume_profile_strategy.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/services/strategy-engine/tests/test_volume_profile_strategy.py b/services/strategy-engine/tests/test_volume_profile_strategy.py
index 71f0eca..f40261c 100644
--- a/services/strategy-engine/tests/test_volume_profile_strategy.py
+++ b/services/strategy-engine/tests/test_volume_profile_strategy.py
@@ -125,3 +125,56 @@ def test_volume_profile_reset_clears_state():
# After reset, should not have enough data
result = strategy.on_candle(make_candle(100.0, 10.0))
assert result is None
+
+
+def test_volume_profile_hvn_detection():
+ """Feed clustered volume at specific price levels to produce HVN nodes."""
+ strategy = VolumeProfileStrategy()
+ strategy.configure({"lookback_period": 20, "num_bins": 10, "value_area_pct": 0.7})
+
+ # Create a profile with very high volume at price ~100 and low volume elsewhere
+ # Prices range from 90 to 110, heavy volume concentrated at 100
+ candles_data = []
+ # Low volume at extremes
+ for p in [90, 91, 92, 109, 110]:
+ candles_data.append((p, 1.0))
+ # Very high volume around 100
+ for _ in range(15):
+ candles_data.append((100, 100.0))
+
+ for price, vol in candles_data:
+ strategy.on_candle(make_candle(price, vol))
+
+ # Access the internal method to verify HVN detection
+ result = strategy._compute_value_area()
+ assert result is not None
+ poc, va_low, va_high, hvn_levels, lvn_levels = result
+
+ # The bin containing price ~100 should have very high volume -> HVN
+ assert len(hvn_levels) > 0
+ # At least one HVN should be near 100
+ assert any(abs(h - 100) < 5 for h in hvn_levels)
+
+
+def test_volume_profile_reset_thorough():
+ """Verify all state is cleared on reset."""
+ strategy = VolumeProfileStrategy()
+ strategy.configure({"lookback_period": 10, "num_bins": 5})
+
+ # Build up state
+ for _ in range(10):
+ strategy.on_candle(make_candle(100.0, 10.0))
+ # Set below/above VA flags
+ strategy.on_candle(make_candle(50.0, 1.0)) # below VA
+ strategy.on_candle(make_candle(200.0, 1.0)) # above VA
+
+ strategy.reset()
+
+ # Verify all state cleared
+ assert len(strategy._candles) == 0
+ assert strategy._was_below_va is False
+ assert strategy._was_above_va is False
+
+ # Should not produce signal since no data
+ result = strategy.on_candle(make_candle(100.0, 10.0))
+ assert result is None