tqsdk实盘
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user