Initial TradeBot implementation
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
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
|
||||
Reference in New Issue
Block a user