简单波动率策略,实现+网格搜索

This commit is contained in:
2025-06-22 23:03:50 +08:00
parent 355e451aac
commit a81a32ce73
19 changed files with 115435 additions and 748 deletions

View File

@@ -19,9 +19,10 @@ class SimpleLimitBuyStrategy(Strategy):
def __init__(self, context: Any, **parameters: Any): # context 类型提示可以为 BacktestContext
super().__init__(context, **parameters)
self.trade_volume = 1
self.order_id_counter = 0
self.limit_price_factor = parameters.get('limit_price_factor', 0.999) # 限价因子
self.max_position = parameters.get('max_position', self.trade_volume * 2) # 最大持仓量
self.max_position = parameters.get('max_position', self.trade_volume) # 最大持仓量
self._last_order_id: Optional[str] = None # 跟踪上一根Bar发出的订单ID
self._current_long_position: int = 0 # 策略内部维护的当前持仓
@@ -57,16 +58,14 @@ class SimpleLimitBuyStrategy(Strategy):
每接收到一根Bar时执行策略逻辑。
"""
current_portfolio_value = self.context.get_current_portfolio_value(bar)
print(f"[{bar.datetime}] Strategy processing Bar. Current close price: {bar.close:.2f}. Current Portfolio Value: {current_portfolio_value:.2f}")
# print(f"[{bar.datetime}] Strategy processing Bar. Current close price: {bar.close:.2f}. Current Portfolio Value: {current_portfolio_value:.2f}")
# 1. 撤销上一根K线未成交的订单
if self._last_order_id:
# 检查这个订单是否仍然在待处理订单列表中
pending_orders = self.context._simulator.get_pending_orders() # 直接访问模拟器或者通过context提供接口
pending_orders = self.get_pending_orders() # 直接访问模拟器或者通过context提供接口
if self._last_order_id in pending_orders:
success = self.context.send_order(Order(id=self._last_order_id, symbol=self.symbol,
direction="CANCEL", volume=0,
price_type="CANCEL")) # 使用一个特殊Order类型表示撤单
success = self.cancel_order(self._last_order_id)
# 这里发送的“撤单订单”会被simulator的send_order处理并调用simulator.cancel_order
if success: # simulator.send_order返回Trade或None这里我们用一个特殊处理
# Simulator的send_order返回的是Trade如果实现撤单最好Simulator的cancel_order返回bool
@@ -109,10 +108,10 @@ class SimpleLimitBuyStrategy(Strategy):
)
# 通过上下文发送订单
trade = self.context.send_order(order)
trade = self.send_order(order)
if trade:
print(
f"[{bar.datetime}] 策略: 发送并立即成交限价买单 {trade.volume} 股 @ {trade.price:.2f} (订单ID: {order.id})")
f"[{bar.datetime}] 策略: 发送并立即成交限价买单 {trade.volume} 股 @ {trade.price:.2f}(open:{bar.open}, close:{bar.close}) (订单ID: {order.id})")
# 如果立即成交_last_order_id 仍然保持 None
else:
# 如果未立即成交将订单ID记录下来以便下一根Bar撤销