initial-import: 2026-04-11 21:18:55
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
诊断数据加载问题:检查510300.SSE数据是否正确加载
|
||||
修复方法签名
|
||||
"""
|
||||
|
||||
import sys
|
||||
import types
|
||||
|
||||
# 兼容性模块
|
||||
print("🔧 [DIAG] 加载vnpy.app兼容性模块...")
|
||||
vnpy_app_module = types.ModuleType('vnpy.app')
|
||||
sys.modules['vnpy.app'] = vnpy_app_module
|
||||
submodules = ['cta_strategy', 'cta_backtester', 'data_manager']
|
||||
for name in submodules:
|
||||
full_name = f'vnpy.app.{name}'
|
||||
submodule = types.ModuleType(full_name)
|
||||
sys.modules[full_name] = submodule
|
||||
setattr(vnpy_app_module, name, submodule)
|
||||
|
||||
from vnpy_ctastrategy import CtaTemplate, CtaStrategyApp
|
||||
from vnpy_ctastrategy import (
|
||||
CtaTemplate,
|
||||
StopOrder,
|
||||
TickData,
|
||||
BarData,
|
||||
TradeData,
|
||||
OrderData,
|
||||
BarGenerator,
|
||||
ArrayManager,
|
||||
)
|
||||
from vnpy.trader.constant import Direction, Offset, Interval
|
||||
|
||||
sys.modules['vnpy.app.cta_strategy'].CtaTemplate = CtaTemplate
|
||||
sys.modules['vnpy.app.cta_strategy'].CtaStrategyApp = CtaStrategyApp
|
||||
vnpy_app_module.CtaTemplate = CtaTemplate
|
||||
vnpy_app_module.CtaStrategyApp = CtaStrategyApp
|
||||
|
||||
from vnpy_ctabacktester import BacktesterEngine
|
||||
sys.modules['vnpy.app.cta_backtester'].BacktesterEngine = BacktesterEngine
|
||||
vnpy_app_module.BacktesterEngine = BacktesterEngine
|
||||
|
||||
print("✅ [DIAG] vnpy.app兼容性模块加载完成!")
|
||||
|
||||
from vnpy.event import EventEngine
|
||||
from vnpy.trader.engine import MainEngine
|
||||
from vnpy.trader.database import get_database
|
||||
from datetime import datetime
|
||||
import inspect
|
||||
import traceback
|
||||
|
||||
def str_to_interval(interval_str: str):
|
||||
"""字符串转Interval枚举"""
|
||||
mapping = {
|
||||
"1m": Interval.MINUTE,
|
||||
"min": Interval.MINUTE,
|
||||
"hour": Interval.HOUR,
|
||||
"1h": Interval.HOUR,
|
||||
"d": Interval.DAILY,
|
||||
"1d": Interval.DAILY,
|
||||
"daily": Interval.DAILY,
|
||||
"w": Interval.WEEKLY,
|
||||
"1w": Interval.WEEKLY,
|
||||
"weekly": Interval.WEEKLY,
|
||||
}
|
||||
return mapping.get(interval_str.lower(), Interval.DAILY)
|
||||
|
||||
def parse_date(date_val):
|
||||
"""解析日期"""
|
||||
print(f"🔍 [DIAG] 解析日期: date_val = {date_val}, type = {type(date_val)}")
|
||||
|
||||
date_ts = float(date_val)
|
||||
date_int = int(date_ts)
|
||||
s = str(date_int)
|
||||
|
||||
print(f"🔍 [DIAG] 处理: date_int = {date_int}, str = '{s}', length = {len(s)}")
|
||||
|
||||
if len(s) == 8:
|
||||
year = int(s[:4])
|
||||
month = int(s[4:6])
|
||||
day = int(s[6:8])
|
||||
dt = datetime(year, month, day)
|
||||
print(f"✅ [DIAG] YYYYMMDD解析: {dt}")
|
||||
return dt
|
||||
elif len(s) >= 10:
|
||||
dt = datetime.fromtimestamp(date_int)
|
||||
print(f"✅ [DIAG] Unix时间戳解析: {dt}")
|
||||
return dt
|
||||
else:
|
||||
year = int(s[:4])
|
||||
month = int(s[4:6])
|
||||
day = int(s[6:8])
|
||||
dt = datetime(year, month, day)
|
||||
print(f"⚠️ [DIAG] 默认YYYYMMDD解析: {dt}")
|
||||
return dt
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("\n=== 开始诊断数据加载问题 ===")
|
||||
|
||||
# 1. 测试日期解析
|
||||
print("\n📅 [DIAG] 测试日期解析:")
|
||||
start_ts = 1609459200
|
||||
end_ts = 1772515200
|
||||
|
||||
start_dt = parse_date(start_ts)
|
||||
end_dt = parse_date(end_ts)
|
||||
|
||||
print(f"\n📅 [DIAG] 日期解析结果:")
|
||||
print(f" start: {start_ts} -> {start_dt}")
|
||||
print(f" end: {end_ts} -> {end_dt}")
|
||||
|
||||
# 2. 测试数据库连接
|
||||
print("\n💾 [DIAG] 测试数据库连接:")
|
||||
db = get_database()
|
||||
print(f"✅ [DIAG] 获取数据库成功: {type(db)}")
|
||||
|
||||
# 查看load_bar_data签名
|
||||
print(f"\n🔍 [DIAG] 检查load_bar_data方法签名:")
|
||||
sig = inspect.signature(db.load_bar_data)
|
||||
print(f" {sig}")
|
||||
|
||||
# 3. 查询bar数据
|
||||
symbol = "510300.SSE"
|
||||
interval = str_to_interval("1d")
|
||||
|
||||
print(f"\n🔍 [DIAG] 查询bar数据: {symbol}, {interval}")
|
||||
print(f" 时间范围: {start_dt} ~ {end_dt}")
|
||||
|
||||
try:
|
||||
bars = db.load_bar_data(
|
||||
symbol=symbol,
|
||||
interval=interval,
|
||||
start=start_dt,
|
||||
end=end_dt
|
||||
)
|
||||
|
||||
print(f"✅ [DIAG] 查询完成:")
|
||||
print(f" 标的: {symbol}")
|
||||
print(f" 查询到bar数量: {len(bars)}")
|
||||
|
||||
if len(bars) > 0:
|
||||
print(f" 第一条: {bars[0].datetime}, close={bars[0].close_price}")
|
||||
print(f" 最后一条: {bars[-1].datetime}, close={bars[-1].close_price}")
|
||||
print(f" 间隔: {bars[0].interval}")
|
||||
else:
|
||||
print(f"❌ [DIAG] 没有查询到任何bar数据!")
|
||||
|
||||
# 尝试获取所有symbol
|
||||
print(f"\n🔍 [DIAG] 尝试获取所有标的:")
|
||||
try:
|
||||
symbols = db.get_all_symbols()
|
||||
print(f"数据库中有 {len(symbols)} 个标的:")
|
||||
for s in list(symbols)[:20]:
|
||||
print(f" {s}")
|
||||
except Exception as e:
|
||||
print(f"❌ [DIAG] 获取所有标的失败: {e}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ [DIAG] 查询失败: {e}")
|
||||
traceback.print_exc()
|
||||
|
||||
print("\n=== 诊断完成 ===")
|
||||
Reference in New Issue
Block a user