tqsdk实盘

This commit is contained in:
2025-07-10 15:07:31 +08:00
parent 4c243a4b47
commit 5de1a43b02
26 changed files with 12462 additions and 17535 deletions

View File

@@ -1,8 +1,11 @@
# src/backtest_engine.py
from datetime import datetime
from typing import Type, Dict, Any, List, Optional
import numpy as np
import pandas as pd
from src.indicators.base_indicators import Indicator
# 导入所有需要协调的模块
from .core_data import Bar, Order, Trade, PortfolioSnapshot
from .data_manager import DataManager
@@ -24,7 +27,8 @@ class BacktestEngine:
commission_rate: float = 0.0002,
roll_over_mode: bool = False,
start_time: Optional[datetime] = None, # 新增开始时间
end_time: Optional[datetime] = None # 新增结束时间
end_time: Optional[datetime] = None, # 新增结束时间
indicators: List[Indicator] = [],
): # 新增换月模式参数
"""
初始化回测引擎。
@@ -54,10 +58,18 @@ class BacktestEngine:
# 实例化策略。初始 symbol 会在 run_backtest 中根据第一根 Bar 动态设置。
self.strategy = strategy_class(self.context, symbol="INITIAL_PLACEHOLDER_SYMBOL", **strategy_params)
self.indicators = indicators
self.portfolio_snapshots: List[PortfolioSnapshot] = []
self.trade_history: List[Trade] = []
self.all_bars: List[Bar] = []
self.close_list: List[float] = []
self.open_list: List[float] = []
self.high_list: List[float] = []
self.low_list: List[float] = []
self.volume_list: List[float] = []
self._history_bars: List[Bar] = [] # 引擎层面保留的历史 Bar通常供策略在 on_bar 中使用
self._max_history_bars: int = strategy_params.get('history_bars_limit', 200)
@@ -84,6 +96,8 @@ class BacktestEngine:
# 调用策略的初始化方法
self.strategy.on_init()
self.strategy.trading = True
last_processed_bar: Optional[Bar] = None # 用于在换月时引用旧合约的最后一根 K 线
# 主回测循环
@@ -94,6 +108,11 @@ class BacktestEngine:
break # 没有更多数据,回测结束
self.all_bars.append(current_bar)
self.close_list.append(current_bar.close)
self.open_list.append(current_bar.open)
self.high_list.append(current_bar.high)
self.low_list.append(current_bar.low)
self.volume_list.append(current_bar.volume)
if self.start_time and current_bar.datetime < self.start_time:
continue
@@ -153,12 +172,28 @@ class BacktestEngine:
# self.simulator.process_pending_orders(current_bar)
self.strategy.on_open_bar(current_bar)
current_indicator_dict = {}
close_array = np.array(self.close_list)
open_array = np.array(self.open_list)
high_array = np.array(self.high_list)
low_array = np.array(self.low_list)
volume_array = np.array(self.volume_list)
for indicator in self.indicators:
current_indicator_dict[indicator.get_name()] = indicator.get_latest_value(
close_array,
open_array,
high_array,
low_array,
volume_array
)
# 7. 调用策略的 on_bar 方法
# self.strategy.on_bar(current_bar)
self.simulator.process_pending_orders(current_bar)
self.simulator.process_pending_orders(current_bar, current_indicator_dict)
self.strategy.on_close_bar(current_bar)
self.simulator.process_pending_orders(current_bar)
self.simulator.process_pending_orders(current_bar, current_indicator_dict)
# 8. 记录投资组合快照
@@ -230,3 +265,16 @@ class BacktestEngine:
def get_bar_history(self):
return self.all_bars
def get_price_history(self, key: str):
if key == 'close':
return self.close_list
elif key == 'open':
return self.open_list
elif key == 'high':
return self.high_list
elif key == 'low':
return self.low_list
elif key == 'volume':
return self.volume_list