fix bug: trade time is valid. (修复BUG:持仓时间为空的问题)

This commit is contained in:
guopengfa
2026-01-17 00:31:44 +08:00
parent ce11f7ad67
commit 889e5acae5
6 changed files with 449 additions and 13 deletions
+4 -4
View File
@@ -140,10 +140,10 @@ class BaseDataSource(ABC):
if klines:
latest_time = datetime.fromtimestamp(klines[-1]['time'])
time_diff = (datetime.now() - latest_time).total_seconds()
# logger.info(
# f"{self.name}: {symbol} 获取 {len(klines)} 条数据, "
# f"最新时间: {latest_time}, 延迟: {time_diff:.0f}秒"
# )
logger.info(
f"{self.name}: {symbol} 获取 {len(klines)} 条数据, "
f"最新时间: {latest_time}, 延迟: {time_diff:.0f}"
)
# 检查数据是否过旧
max_diff = TIMEFRAME_SECONDS.get(timeframe, 3600) * 2
@@ -84,7 +84,7 @@ class CryptoDataSource(BaseDataSource):
else:
symbol_pair = symbol
# logger.info(f"获取加密货币K线: {symbol_pair}, 周期: {ccxt_timeframe}, 条数: {limit}")
logger.info(f"获取加密货币K线: {symbol_pair}, 周期: {ccxt_timeframe}, 条数: {limit}")
ohlcv = self._fetch_ohlcv(symbol_pair, ccxt_timeframe, limit, before_time, timeframe)
@@ -136,7 +136,7 @@ class CryptoDataSource(BaseDataSource):
since = int(start_time.timestamp() * 1000)
end_ms = before_time * 1000
# logger.info(f"历史数据请求: since={since//1000}, end={before_time}, 时间跨度={total_seconds/86400:.1f}天")
logger.info(f"历史数据请求: since={since//1000}, end={before_time}, 时间跨度={total_seconds/86400:.1f}")
# 分页获取数据,直到覆盖完整时间范围
all_ohlcv = []
@@ -160,20 +160,21 @@ class CryptoDataSource(BaseDataSource):
last_timestamp = batch[-1][0]
# 如果最后一条数据时间超过了结束时间,或者返回数据少于请求量,说明已经获取完毕
if last_timestamp >= end_ms or len(batch) < batch_limit:
# if last_timestamp >= end_ms or len(batch) < batch_limit:
if last_timestamp >= end_ms:
break
# 下次从最后一条的下一个时间点开始
timeframe_ms = TIMEFRAME_SECONDS.get(timeframe, 86400) * 1000
current_since = last_timestamp + timeframe_ms
# logger.info(f"分页获取中: 已获取 {len(all_ohlcv)} 条, 继续从 {datetime.fromtimestamp(current_since/1000)}")
logger.info(f"分页获取中: 已获取 {len(all_ohlcv)} 条, 继续从 {datetime.fromtimestamp(current_since/1000)}")
ohlcv = all_ohlcv
else:
ohlcv = self.exchange.fetch_ohlcv(symbol_pair, ccxt_timeframe, limit=limit)
# logger.info(f"CCXT 返回 {len(ohlcv) if ohlcv else 0} 条数据")
logger.info(f"CCXT 返回 {len(ohlcv) if ohlcv else 0} 条数据")
return ohlcv
except Exception as e:
@@ -200,7 +201,7 @@ class CryptoDataSource(BaseDataSource):
since = int((datetime.now() - timedelta(seconds=total_seconds)).timestamp() * 1000)
ohlcv = self.exchange.fetch_ohlcv(symbol_pair, ccxt_timeframe, since=since, limit=limit)
# logger.info(f"CCXT 备用方法返回 {len(ohlcv) if ohlcv else 0} 条数据")
logger.info(f"CCXT 备用方法返回 {len(ohlcv) if ohlcv else 0} 条数据")
return ohlcv
except Exception as e:
logger.error(f"CCXT fallback method also failed: {str(e)}")
@@ -596,7 +596,7 @@ class TradingExecutor:
if not klines or len(klines) < 2:
logger.error(f"Strategy {strategy_id} failed to fetch K-lines")
return
logger.info(rf'Strategy {strategy_id} kline number: {len(klines)}')
logger.info(rf'Strategy {strategy_id} history kline number: {len(klines)}')
# 转换为DataFrame
df = self._klines_to_dataframe(klines)
@@ -1093,7 +1093,8 @@ class TradingExecutor:
market='Crypto',
symbol=symbol,
timeframe=timeframe,
limit=limit
limit=limit,
before_time=int(time.time()),
)
except Exception as e:
logger.error(f"Failed to fetch K-lines: {str(e)}")
@@ -274,7 +274,7 @@ def _insert_strategy(
json.dumps(indicator_config, ensure_ascii=False),
json.dumps(trading_config, ensure_ascii=False),
json.dumps({}, ensure_ascii=False),
300,
3000,
now,
now,
),