163 lines
4.9 KiB
Python
Executable File
163 lines
4.9 KiB
Python
Executable File
#!/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=== 诊断完成 ===")
|