高级策略功能

概览

Strategy 类提供了许多额外的属性,用于微调行为:自动订单注释、交易计划、统计的无风险利率、指标的数据源以及历史时期管理。

评论模式 -- 评论排序

CommentMode 属性控制策略提交的所有订单的 Order.Comment 字段的自动填充。这有助于识别哪个策略创建了订单,这在同一账户上同时运行多个策略时尤其有用。

StrategyCommentModes 枚举

描述
Disabled 评论不会自动填充。默认值。
Id 评论已设置为 Strategy.Id(唯一 GUID 标识符)。
Name 评论已设置为 Strategy.Name(策略名称)。

例子

public class CommentStrategy : Strategy
{
    protected override void OnStarted2(DateTime time)
    {
        base.OnStarted2(time);

        // 所有订单都会带有策略名称标签
        CommentMode = StrategyCommentModes.Name;

        // 或使用标识符进行精确绑定
        // CommentMode = StrategyCommentModes.Id;
    }
}

使用 Name 值和策略名称“SMA Crossover”,每个订单都会收到评论“SMA Crossover”,从而让您可以在交易日志中筛选该策略的订单。

工作时间 -- 工作安排

WorkingTime 属性设置策略处于活动状态的时间表。在指定时间间隔之外,策略可以自动限制其活动。

public class ScheduledStrategy : Strategy
{
    protected override void OnStarted2(DateTime time)
    {
        base.OnStarted2(time);

        // 配置工作时间
        WorkingTime = new WorkingTime
        {
            Periods = new List<WorkingTimePeriod>
            {
                new WorkingTimePeriod
                {
                    Till = DateTime.MaxValue,
                    Times = new List<Range<TimeSpan>>
                    {
                        // 从 10:00 到 18:00 交易
                        new Range<TimeSpan>(
                            TimeSpan.FromHours(10),
                            TimeSpan.FromHours(18))
                    }
                }
            }
        };
    }
}

TotalWorkingTime 属性(只读)显示策略自启动以来的总工作时间。它会在策略停止和重启时自动计算。

无风险利率 -- 无风险利率

RiskFreeRate 属性设置在统计计算中使用的年度无风险利率——主要用于夏普比率和索提诺比率。

var strategy = new MyStrategy();

// 年化 5% 的无风险利率
strategy.RiskFreeRate = 0.05m;

当策略的统计管理器初始化时,该值会自动传递给实现 IRiskFreeRateStatisticParameter 的所有统计参数。

IndicatorSource -- 指标数据来源

IndicatorSource 属性为所有未明确指定来源的策略指标设置 IIndicator.Source 属性的默认值。它定义使用哪个 Level1Fields 字段作为指标输入数据。

var strategy = new MyStrategy();

// 所有指标默认使用最新成交价
strategy.IndicatorSource = Level1Fields.LastTradePrice;

// 或平均价格
// strategy.IndicatorSource = Level1Fields.AveragePrice;

如果属性是 null(默认值),指示器使用它们自己的数据源。

历史计算 -- 计算的历史时期

虚拟属性 HistoryCalculated 允许策略以编程方式确定指标预热所需的历史数据周期。它返回 TimeSpan?——历史周期的持续时间,如果未指定周期,则返回 null

public class SmaCrossStrategy : Strategy
{
    private readonly StrategyParam<int> _longPeriod;

    public int LongPeriod
    {
        get => _longPeriod.Value;
        set => _longPeriod.Value = value;
    }

    public SmaCrossStrategy()
    {
        _longPeriod = Param(nameof(LongPeriod), 50);
    }

    // 自动计算所需历史期间
    protected override TimeSpan? HistoryCalculated
        => TimeSpan.FromDays(LongPeriod * 2);
}

HistoryCalculatedHistorySize 属性的代码计算版本。区别在于 HistorySize 由用户作为策略参数设置,而 HistoryCalculated 是根据策略参数(例如指标周期)通过程序计算得出的。

示例:包含所有高级设置的策略

public class AdvancedStrategy : Strategy
{
    private readonly StrategyParam<DataType> _candleType;
    private readonly StrategyParam<int> _smaPeriod;

    public DataType CandleType
    {
        get => _candleType.Value;
        set => _candleType.Value = value;
    }

    public int SmaPeriod
    {
        get => _smaPeriod.Value;
        set => _smaPeriod.Value = value;
    }

    public AdvancedStrategy()
    {
        _candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
        _smaPeriod = Param(nameof(SmaPeriod), 20);
    }

    // 自动计算历史期间
    protected override TimeSpan? HistoryCalculated
        => TimeSpan.FromDays(SmaPeriod * 2);

    protected override void OnStarted2(DateTime time)
    {
        base.OnStarted2(time);

        // 订单注释 -- 策略名称
        CommentMode = StrategyCommentModes.Name;

        // 用于 Sharpe 计算的无风险利率
        RiskFreeRate = 0.05m;

        // 指标的数据源
        IndicatorSource = Level1Fields.LastTradePrice;

        var subscription = SubscribeCandles(CandleType);

        subscription
            .Bind(ProcessCandle)
            .Start();
    }

    private void ProcessCandle(ICandleMessage candle)
    {
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

        // 交易逻辑...
    }
}

在这个例子中,该策略使用了所有描述的功能:它会自动对订单进行评论,为统计设置无风险利率,建立指标的数据来源,并计算所需的历史周期。