源码文件:vnpy_ctastrategy.strategies.turtle_signal_strategy

1. 策略概述

TurtleSignalStrategy 是大名鼎鼎的 海龟交易法则 (Turtle Trading Rules) 的完整复现。 它不仅仅是一个简单的突破策略,而是一套完整的资金管理系统,包含了:

  1. 入场:唐奇安通道 (Donchian Channel) 突破。
  2. 仓位管理:基于 ATR (N值) 的加仓 (Pyramiding)。
  3. 止损:基于 ATR 的移动止损。
  4. 离场:反向通道突破。
  • 基类CtaTemplate
  • 核心指标:Donchian Channel, ATR
  • 复杂度:高(涉及分批加仓逻辑)

2. 核心参数

参数名默认值含义
entry_window20入场通道周期 (20日高点)
exit_window10离场通道周期 (10日低点)
atr_window20ATR 计算周期

3. 策略逻辑详解

3.1 信号计算

策略使用 am.donchian 计算唐奇安通道,使用 am.atr 计算波动率 N 值。

1
2
3
self.entry_up, self.entry_down = self.am.donchian(self.entry_window) # 20日
self.exit_up, self.exit_down = self.am.donchian(self.exit_window)   # 10日
self.atr_value = self.am.atr(self.atr_window)

3.2 初始入场

当空仓时,在 20 日高点挂买入停止单,在 20 日低点挂卖出停止单。

1
2
3
if not self.pos:
    self.send_buy_orders(self.entry_up)
    self.send_short_orders(self.entry_down)

3.3 加仓逻辑 (Pyramiding)

这是海龟法则的精髓。策略不会一次性买入,而是随着趋势发展分批加仓。 send_buy_orders 函数会根据当前持仓量 (self.pos) 计算还需要加多少次仓。

海龟法则规定:每上涨 0.5 * ATR,加仓 1 个单位,最多加到 4 个单位。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def send_buy_orders(self, price: float) -> None:
    t: float = self.pos / self.fixed_size # 当前持仓倍数

    if t < 1: # 第1单
        self.buy(price, self.fixed_size, True)
    if t < 2: # 第2单:价格 + 0.5 ATR
        self.buy(price + self.atr_value * 0.5, self.fixed_size, True)
    if t < 3: # 第3单:价格 + 1.0 ATR
        self.buy(price + self.atr_value, self.fixed_size, True)
    if t < 4: # 第4单:价格 + 1.5 ATR
        self.buy(price + self.atr_value * 1.5, self.fixed_size, True)

策略在 on_bar 中每次都会调用这个函数。如果已经持仓 2 手,它会自动挂出第 3 手和第 4 手的停止单。

3.4 动态止损

海龟法则的止损非常严格:最后一次加仓价 - 2 * ATR。 这意味着随着加仓,止损线会不断上移(保护利润)。

on_trade 回调中,每当有新成交,就更新止损线:

1
2
3
4
def on_trade(self, trade: TradeData) -> None:
    if trade.direction == Direction.LONG:
        self.long_entry = trade.price # 记录最新成交价
        self.long_stop = self.long_entry - 2 * self.atr_value

3.5 离场

当价格跌破 10 日低点 (exit_down) 时,无条件清仓离场。

1
2
sell_price = max(self.long_stop, self.exit_down)
self.sell(sell_price, abs(self.pos), True)

这里取 max 是为了处理一种情况:如果止损线 (long_stop) 比 10 日低点还高,那就按止损线走;否则按 10 日低点走。

4. 总结

TurtleSignalStrategy 是一个教科书级别的趋势策略实现。 它教会我们:

  1. 敢于赢:通过加仓机制,在趋势正确时大幅放大收益。
  2. 敢于输:通过严格的 2ATR 止损,控制单笔亏损。
  3. 机械化:完全基于价格突破,没有任何主观预测。