Add trend MACD spot strategy

This commit is contained in:
Codex
2026-06-21 09:15:38 +03:00
parent f19856ca6e
commit 8a211acf98
18 changed files with 593 additions and 81 deletions
+11 -2
View File
@@ -15,7 +15,7 @@ from crypto_spot_bot.models import Candle, Ticker, utc_now
from crypto_spot_bot.storage import Storage
POPULAR_FALLBACK = ["BTCUSDT", "ETHUSDT", "SOLUSDT", "XRPUSDT", "DOGEUSDT", "LTCUSDT"]
POPULAR_FALLBACK = ["BTCUSDT", "ETHUSDT", "SOLUSDT"]
def _float(value: Any, default: float = 0.0) -> float:
@@ -34,6 +34,7 @@ class MarketData:
self.instruments: dict[str, Instrument] = {}
self.tickers: dict[str, Ticker] = {}
self.candles: dict[str, list[Candle]] = {}
self.trend_candles: dict[str, list[Candle]] = {}
self.orderbook_top: dict[str, tuple[float, float]] = {}
self.patterns: dict[str, dict[str, Any]] = {}
self.forecasts: dict[str, dict[str, Any]] = {}
@@ -77,6 +78,13 @@ class MarketData:
)
add_indicators(candles)
self.candles[symbol] = candles
trend_candles = self.client.klines(
symbol=symbol,
interval=self.settings.trend_interval,
limit=self.settings.trend_kline_limit,
)
add_indicators(trend_candles)
self.trend_candles[symbol] = trend_candles
bid, ask = self.client.orderbook_top(symbol)
self.orderbook_top[symbol] = (bid, ask)
if symbol in self.tickers:
@@ -101,7 +109,7 @@ class MarketData:
try:
async with websockets.connect(self.settings.websocket_url, ping_interval=20) as ws:
self.ws_connected = True
await ws.send(websocket_subscribe_message(self.symbols))
await ws.send(websocket_subscribe_message(self.symbols, self.settings.base_interval))
self.storage.event("Поток данных Bybit подключен")
async for raw in ws:
self.last_ws_message_at = utc_now()
@@ -215,6 +223,7 @@ class MarketData:
{
"ticker": self.tickers[symbol].as_dict() if symbol in self.tickers else None,
"candles": [candle.as_dict() for candle in self.candles.get(symbol, [])[-120:]],
"trend_candles": [candle.as_dict() for candle in self.trend_candles.get(symbol, [])[-5:]],
"pattern": self.patterns.get(symbol),
"forecast": self.forecasts.get(symbol),
"instrument": asdict(self.instruments[symbol]) if symbol in self.instruments else None,