源码文件:vnpy_spreadtrading.strategies.basic_spread_strategy

1. 策略概述

BasicSpreadStrategy 与其说是一个自动策略,不如说是一个智能执行工具。 它不包含任何指标计算或预测逻辑,而是完全按照用户在参数中指定的固定价格进行挂单交易。它适合那些通过主观判断或外部计算得出目标价差,然后希望程序自动完成“腿A+腿B”复杂下单过程的交易员。

  • 基类SpreadStrategyTemplate
  • 核心逻辑:固定点位开平 + 时间过滤
  • 适用场景:主观套利、跨期移仓

2. 核心参数

参数名含义
buy_price买入开仓触发价
sell_price卖出平仓触发价
short_price卖出开仓触发价
cover_price买入平仓触发价
max_pos目标持仓量
start_time每日开始交易时间 (如 “9:00:00”)
end_time每日停止交易时间 (如 “15:00:00”)

3. 策略逻辑详解

3.1 时间过滤器

策略首先检查当前时间是否在允许的交易时段内。如果不在,会强制停止所有正在运行的算法。

1
2
3
4
5
self.update_time = self.spread.datetime.time()
if self.update_time < self.start_t or self.update_time >= self.end_t:
    self.stop_open_algos()
    self.stop_close_algos()
    return

3.2 状态机逻辑

策略根据当前的持仓状态 (spread_pos) 决定启动哪种算法。

  1. 空仓 (spread_pos == 0)

    • 检查是否已启动买入算法 (buy_algoid),若无则启动。
    • 检查是否已启动卖出算法 (short_algoid),若无则启动。
    • 注意:这里是同时监控双向开仓机会。
  2. 持有多头 (spread_pos > 0)

    • 停止开仓算法。
    • 启动卖出平仓算法 (sell_algoid),目标价为 sell_price
  3. 持有空头 (spread_pos < 0)

    • 停止开仓算法。
    • 启动买入平仓算法 (cover_algoid),目标价为 cover_price

3.3 算法生命周期管理

策略在 on_spread_algo 回调中维护算法 ID 的状态。如果某个算法执行结束(或被停止),将其 ID 置空,以便下一轮循环可以重新启动。

1
2
3
4
5
def on_spread_algo(self, algo: SpreadAlgoTemplate) -> None:
    if not algo.is_active():
        if self.buy_algoid == algo.algoid:
            self.buy_algoid = ""
        # ... 其他方向同理

4. 总结

BasicSpreadStrategy 展示了价差交易中最朴素的需求:执行。 在价差交易中,最困难的往往不是“决定在什么价格买”,而是“如何以该价格买入两个合约而不产生单腿风险”。这个策略将复杂的双腿执行封装在底层算法中,留给用户最简单的价格接口。