COB fixes

This commit is contained in:
Dobromir Popov
2025-08-08 19:15:07 +03:00
parent 0e469c8e2f
commit be1753c96a
5 changed files with 875 additions and 31 deletions

View File

@ -1082,7 +1082,7 @@ class DataProvider:
try:
# For 1s timeframe, generate from WebSocket tick data
if timeframe == '1s':
logger.info(f"Generating 1s candles from WebSocket ticks for {symbol}")
# logger.deta(f"Generating 1s candles from WebSocket ticks for {symbol}")
return self._generate_1s_candles_from_ticks(symbol, limit)
# Convert symbol format
@ -1239,7 +1239,7 @@ class DataProvider:
if len(df) > limit:
df = df.tail(limit)
logger.info(f"Generated {len(df)} 1s candles from {len(recent_ticks)} ticks for {symbol}")
# logger.info(f"Generated {len(df)} 1s candles from {len(recent_ticks)} ticks for {symbol}")
return df
except Exception as e:
@ -1253,10 +1253,10 @@ class DataProvider:
# For 1s timeframe, try to generate from WebSocket ticks first
if timeframe == '1s':
logger.info(f"Attempting to generate 1s candles from WebSocket ticks for {symbol}")
# logger.info(f"Attempting to generate 1s candles from WebSocket ticks for {symbol}")
generated_df = self._generate_1s_candles_from_ticks(symbol, limit)
if generated_df is not None and not generated_df.empty:
logger.info(f"Successfully generated 1s candles from WebSocket ticks for {symbol}")
# logger.info(f"Successfully generated 1s candles from WebSocket ticks for {symbol}")
return generated_df
else:
logger.info(f"Could not generate 1s candles from ticks for {symbol}; trying Binance API")
@ -1338,10 +1338,10 @@ class DataProvider:
# For 1s timeframe, try generating from WebSocket ticks first
if timeframe == '1s':
logger.info(f"FALLBACK: Attempting to generate 1s candles from WebSocket ticks for {symbol}")
# logger.info(f"FALLBACK: Attempting to generate 1s candles from WebSocket ticks for {symbol}")
generated_data = self._generate_1s_candles_from_ticks(symbol, limit)
if generated_data is not None and not generated_data.empty:
logger.info(f"FALLBACK: Generated 1s candles from WebSocket ticks for {symbol}: {len(generated_data)} bars")
# logger.info(f"FALLBACK: Generated 1s candles from WebSocket ticks for {symbol}: {len(generated_data)} bars")
return generated_data
# ONLY try cached data
@ -4763,7 +4763,7 @@ class DataProvider:
seconds: int = 300,
bucket_radius: int = 10,
metric: str = 'imbalance'
) -> Tuple[List[datetime], List[float], List[List[float]]]:
) -> Tuple[List[datetime], List[float], List[List[float]], List[float]]:
"""
Build a 1s COB heatmap matrix for ±bucket_radius buckets around current price.
@ -4774,14 +4774,15 @@ class DataProvider:
times: List[datetime] = []
prices: List[float] = []
values: List[List[float]] = []
mids: List[float] = []
latest = self.get_latest_cob_data(symbol)
if not latest or 'stats' not in latest:
return times, prices, values
return times, prices, values, mids
mid = float(latest['stats'].get('mid_price', 0) or 0)
if mid <= 0:
return times, prices, values
return times, prices, values, mids
bucket_size = 1.0 if 'ETH' in symbol else 10.0
center = round(mid / bucket_size) * bucket_size
@ -4821,6 +4822,17 @@ class DataProvider:
except Exception:
continue
# Compute mid price for this snapshot
try:
best_bid = max((float(b[0]) for b in bids), default=0.0)
best_ask = min((float(a[0]) for a in asks), default=0.0)
if best_bid > 0 and best_ask > 0:
mids.append((best_bid + best_ask) / 2.0)
else:
mids.append(0.0)
except Exception:
mids.append(0.0)
row: List[float] = []
for p in prices:
b = float(bucket_map.get(p, {}).get('bid', 0.0))
@ -4833,10 +4845,10 @@ class DataProvider:
row.append(val)
values.append(row)
return times, prices, values
return times, prices, values, mids
except Exception as e:
logger.error(f"Error building COB heatmap matrix for {symbol}: {e}")
return [], [], []
return [], [], [], []
def get_combined_ohlcv_cob_data(self, symbol: str, timeframe: str = '1s', count: int = 60) -> dict:
"""