成交量连续期货(VolumeContinuousSecurity)

概览

VolumeContinuousSecurity该类表示一种连续期货合约,其中合约之间的转换(展期)是基于交易量或未平仓合约数进行的。这不同于ExpirationContinuousSecurity,其中切换根据预定的到期日期进行。

两个类都继承自ContinuousSecurity,而它又继承自BasketSecurity.

与 ExpirationContinuousSecurity 的差异

特征 持续到期交易品种 持续成交量交易品种
展期条件 到期日(固定) 成交量或未平仓合约数量阈值
配置 SecurityId -> DateTime 字典 SecurityId 列表 + VolumeLevel
可预测性 按计划切换 按市场条件切换
篮子代码 CE CV

ExpirationContinuousSecurity 需要手动为每个合约指定转换日期。VolumeContinuousSecurity 当其交易量(或持仓量)超过指定阈值时,会自动切换到下一个合约。

主要属性

public class VolumeContinuousSecurity : ContinuousSecurity
{
    // List of inner securities (contracts), ordered by rollover sequence
    public SynchronizedList<SecurityId> InnerSecurities { get; }

    // 使用 open interest 而不是成交量来确定 rollover
    public bool IsOpenInterest { get; set; }

    // 切换到下一合约的成交量阈值
    public Unit VolumeLevel { get; set; }
}

VolumeLevel 属性具有 Unit 类型,它允许指定绝对值和百分比值。

使用示例

using StockSharp.Algo;
using StockSharp.Messages;

// 创建基于成交量的连续期货
var continuous = new VolumeContinuousSecurity
{
    Id = "ES-CONT@CME",
    Board = ExchangeBoard.Cme,
};

// 按 rollover 顺序添加合约
continuous.InnerSecurities.AddRange(new[]
{
    "ES-3.26@CME".ToSecurityId(),
    "ES-6.26@CME".ToSecurityId(),
    "ES-9.26@CME".ToSecurityId(),
});

// 设置切换成交量阈值
continuous.VolumeLevel = new Unit(10000);

// 或使用 open interest
continuous.IsOpenInterest = true;
continuous.VolumeLevel = new Unit(50000);

用于比较的到期连续交易品种示例

using StockSharp.Algo;
using StockSharp.Messages;

// 基于到期日的连续期货
var expContinuous = new ExpirationContinuousSecurity
{
    Id = "ES-CONT-EXP@CME",
    Board = ExchangeBoard.Cme,
};

// 为每个合约指定准确切换日期
expContinuous.ExpirationJumps.Add(
    "ES-3.26@CME".ToSecurityId(),
    new DateTime(2026, 3, 15)
);
expContinuous.ExpirationJumps.Add(
    "ES-6.26@CME".ToSecurityId(),
    new DateTime(2026, 6, 15)
);

何时使用

VolumeContinuousSecurity 适用于以下情况:

  • 确切的结转日期事先未知
  • 需要根据流动性(交易量或未平仓合约)进行切换
  • 需要一种能够根据市场条件做出反应的更具适应性的过渡

当已知到期日期并且需要确定性回转时,优先使用 ExpirationContinuousSecurity