78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from crypto_spot_bot.models import Candle
|
|
from crypto_spot_bot.patterns import PatternAnalyzer
|
|
|
|
|
|
def _candles_for_pullback() -> list[Candle]:
|
|
candles = []
|
|
for index in range(40):
|
|
close = 100 + index * 0.2
|
|
candles.append(
|
|
Candle(
|
|
timestamp=index,
|
|
open=close - 0.1,
|
|
high=close + 0.4,
|
|
low=close - 0.4,
|
|
close=close,
|
|
volume=100,
|
|
ema_20=close - 0.2,
|
|
ema_50=close - 1.0,
|
|
ema_200=close - 2.0,
|
|
rsi_14=48,
|
|
atr_14=1.0,
|
|
volume_ma_20=100,
|
|
)
|
|
)
|
|
latest = candles[-1]
|
|
latest.close = latest.ema_20 * 1.005
|
|
latest.open = latest.close + 0.1
|
|
return candles
|
|
|
|
|
|
def _candles_for_stabilized_drop() -> list[Candle]:
|
|
candles = []
|
|
closes = [98.0, 97.3, 96.6, 95.9, 95.2, 94.8, 94.55, 94.42, 94.38, 94.40, 94.45, 94.56]
|
|
for index in range(40):
|
|
close = 101 - index * 0.08
|
|
if index >= 28:
|
|
close = closes[index - 28]
|
|
rsi = 42
|
|
if index >= 28:
|
|
rsi = 30 + max(0, index - 34)
|
|
candles.append(
|
|
Candle(
|
|
timestamp=index,
|
|
open=close - 0.12,
|
|
high=close + 0.25,
|
|
low=close - 0.26,
|
|
close=close,
|
|
volume=120,
|
|
ema_20=close + 0.35,
|
|
ema_50=close + 0.75,
|
|
ema_200=close + 1.4,
|
|
rsi_14=rsi,
|
|
atr_14=0.45,
|
|
volume_ma_20=100,
|
|
)
|
|
)
|
|
candles[-1].open = candles[-1].close - 0.20
|
|
candles[-1].low = candles[-1].close - 0.26
|
|
return candles
|
|
|
|
|
|
def test_pattern_analyzer_detects_trend_pullback() -> None:
|
|
result = PatternAnalyzer().analyze(_candles_for_pullback())
|
|
|
|
assert result.label == "трендовый откат"
|
|
assert result.score > 0.7
|
|
assert "откат к средней" in result.tags
|
|
|
|
|
|
def test_pattern_analyzer_detects_stabilized_drop() -> None:
|
|
result = PatternAnalyzer().analyze(_candles_for_stabilized_drop())
|
|
|
|
assert result.label == "стабилизация после падения"
|
|
assert result.score >= 0.58
|
|
assert "стабилизация после падения" in result.tags
|