跳转至

cTrader Algo 中的参数类型

在本文及其对应的视频中,我们将演示如何在您的 cBot 和指标中声明和使用可自定义的参数。 我们将开发一个简单的指标,并向您展示如何从 cTrader UI 配置参数。 我们还将解释您可以在 cTrader cBot 或指标中使用哪些类型的参数,并说明如何在代码中声明和使用它们。

可自定义参数

可自定义参数是在添加、启动或使用算法时可配置的值。 它们允许您和其他用户在不修改源代码的情况下自定义 cBot、指标和插件的行为。

在 cBot、指标和插件中使用参数

  • 对于 cBot,您可以配置影响执行的变量或设置,例如止损和止盈水平。
  • 对于指标,您可以配置影响指标输出的变量,例如考虑的周期或使用的数据源。
  • 对于插件,您可以配置变量,例如 UI 选项或 API 密钥,这些变量决定了插件如何与界面或外部服务交互。

正如之前解释的那样,cTrader 支持以下参数类型:

  • int
  • double
  • string
  • bool
  • DataSeries
  • TimeFrame
  • enum
  • Color
  • DateTime
  • DateOnly
  • TimeSpan
  • Symbol
  • Symbol[] (multi-symbol)
  • Enum[] (multi-enum)
  • TimeFrame[] (multi-period)

注意

Python 算法使用在其.cs 文件中声明的可自定义参数。

创建带参数的简单指标

为了演示如何在自定义指标中使用参数,我们将创建一个新指标并将其命名为 Standard Deviation

要计算标准差,我们首先需要计算价格的移动平均值。 随后,我们将声明移动平均指标所需的参数,从移动平均周期开始。

1
public int MaPeriod { get; set; }

任何具有支持类型的公共属性都可以成为指标参数。 要将我们的 MaPeriod 属性转换为参数,我们只需添加所需的声明。

1
2
[Parameter("MA Period")]
public int MaPeriod { get; set; }

Parameter 属性指示 cTrader 在指标参数面板中使用定义的名称("MA Period")将此属性显示为参数。

如下所示,Parameter 属性还允许您定义参数的一些属性,例如显示的名称、默认值、参数所在的组、最大值和最小值,以及按下上下箭头时参数变化的步长(仅适用于数值)。

1
2
[Parameter("SMA Period", DefaultValue = 14, Group = "MA", MaxValue = 100, MinValue = 1, Step = 1)]
public int MaPeriod { get; set; }

我们现在将添加移动平均指标所需的其余参数。 MaType 参数将帮助我们确定移动平均类型。 它是一个 enum,将在 cTrader UI 中显示为下拉菜单。

1
2
[Parameter("MA Type", Group = "MA")]
public MovingAverageType MaType { get; set; }

Source 参数将使用户能够为我们的移动平均指标指定数据源。 此参数的类型为 DataSeries

1
2
[Parameter("Source", Group = "MA")]
public DataSeries Source { get; set; }

现在,所需的参数已声明,我们将定义并初始化我们的移动平均。

1
2
3
4
5
6
private MovingAverage movingAverage;

protected override void Initialize()
{
    movingAverage = Indicators.MovingAverage(Source, MaPeriod, MaType);
}

此时,我们已准备好实现我们的标准差计算。 默认代码模板已经包含 Output 属性,我们可以使用它来显示计算结果。

1
2
[Output("Result", LineColor = "Orange")]
public IndicatorDataSeries Result { get; set; }

最后但同样重要的是,我们将在 Calculate() 方法中实现标准差计算。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public override void Calculate(int index)
{
    var average = movingAverage.Result[index];

    double sum = 0;

    for (var period = 0; period < MaPeriod; period++)
    {
        sum += Math.Pow(Source[index - period] - average, 2.0);
    }

    Result[index] = Math.Sqrt(sum / MaPeriod);
}

如果我们将指标添加到图表中,我们应该在 添加实例 窗口中看到所有参数。

添加额外参数

完成标准差计算后,我们还可以添加一条水平线,作为指标的视觉阈值。 为此,我们需要添加更多参数。

第一个参数是一个布尔参数,用于确定是否显示我们的线。

1
2
[Parameter("Show Line", DefaultValue = true, Group = "Line")]
public bool ShowLine { get; set; }

LineLevel 参数将允许我们确定绘制线的价格水平。

1
2
[Parameter("Line Level", DefaultValue = 0.001, Step = 0.001, Group = "Line")]
public double LineLevel { get; set; }

我们还将添加一个允许选择线条颜色的参数。

1
2
[Parameter("Line Color", DefaultValue = "Blue", Group = "Line")]
public Color LineColor { get; set; }

有了所有必要的参数后,我们可以编写代码在指标附加的图表上绘制线条。

1
2
3
4
if (ShowLine)
{
    Chart.IndicatorAreas[0].DrawHorizontalLine("Line", LineLevel, LineColor);
}

如果我们再次构建指标并添加新实例,我们将能够隐藏/显示线条,上下移动它,并选择我们喜欢的颜色作为线条颜色。

如下例所示,参数还可以用于确保我们的指标仅在添加到特定时间周期的图表时显示。

1
2
[Parameter("Timeframe")]
public TimeFrame TF { get; set; }

Initialize() 方法中,我们将检查指标附加的图表的时间周期。 如果它不等于 TF 参数的值,我们将阻止指标显示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
protected override void Initialize()
{
    if (TimeFrame != TF)
        return;

    movingAverage = Indicators.MovingAverage(Source, MaPeriod, MaType);

    if (ShowLine)
    {
        Chart.IndicatorAreas[0].DrawHorizontalLine("Line", LineLevel, LineColor);
    }
}

我们希望本指南有助于理解参数及其在 cTrader 算法交易中的工作原理。