跳转至

自定义指标生命周期

示例代码结构

本文将引导您了解代码结构,并解释 cTrader 指标的事件和生命周期背后的逻辑。 要访问自定义指标,请打开 Algo 应用中的 Local 选项卡。

Image title

例如,您可以创建一个名为“LifeCycle Test”的新指标,代码编辑器窗口中提供了以下示例代码。

Image title

要重置为样板版本,请复制以下代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
    [Indicator(AccessRights = AccessRights.None)]
    public class LifeCycleTest : Indicator
    {
        [Parameter(DefaultValue = "Hello world!")]
        public string Message { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }

        protected override void Initialize()
        {
            // To learn more about cTrader Algo visit our Help Center:
            // https://help.ctrader.com/ctrader-algo/


            Print(Message);
        }

        public override void Calculate(int index)
        {
            // Calculate value at specified index
            // Result[index] = 
        }
    }
}

乍一看,代码结构仅包含两个方法,即 Initialize() 方法和 Calculate() 方法。 点击 Build 继续测试此指标。 我们将添加一个名为 OnDestroy() 的附加方法,稍后解释其用途。

初始化事件

当 cTrader 指标首次附加到图表上或用户更改任何参数设置时,将重新创建指标实例并调用 Initialize() 方法。 它用于初始化您计划在指标中使用的任何变量。 您还可以定义和引用其他指标,以使用其他指标的公式创建单个指标。

默认情况下,新代码模板包含一个名为 Message 的参数设置,其值为“Hello world!”。

1
2
[Parameter(DefaultValue = "Hello world!")]
public string Message { get; set; }

Initialize() 方法中,有一行代码将此消息打印到日志中。

1
Print(Message);

为了演示 Initialize() 方法,请通过点击 Build 图标旁边的 Plus 图标并选择一个交易品种来添加指标实例。 如果您点击指标行中的 More 并选择 Add an instance,将自动添加 EURUSD 交易品种和 h1 时间框架。

Image title

注意

在 cTrader Algo 中添加实例与在 Trade 应用程序中将指标附加到图表相同。

现在,打开图表下方的 Trade Watch 面板中的 Log 选项卡。 如您所见,消息“Hello world”已被打印。

Image title

每次首次将指标添加到图表或更改参数时,图表都会刷新并再次调用 Initialize() 方法。 在 Parameters 部分中输入不同的消息,以查看日志条目相应更新。

Image title

计算指标输出

Calculate() 方法为每个历史数据索引和每个传入的报价调用。 例如,如果当前图表有 1000 根柱,Calculate() 方法将为索引 0、1、2 等调用,最多到 999。

1
public override void Calculate(int index)

在高波动期间,Calculate() 方法每秒可能被调用多次,而在市场平稳时调用次数较少。 要测试其工作原理,您可以在 Calculate() 方法的主体中添加一行代码,以打印传递给该方法的每个新数据报价的索引值。 每次在代码编辑器窗口中添加更改后,不要忘记点击 Build

1
Print("Index: " + index);

要从代码编辑器窗口切换到图表,请点击添加的指标实例。 如果您打开 Trade Watch 面板中的 Log 选项卡,您将看到为传递给该方法的每个索引打印的值。

Image title

OnDestroy() 方法

当指标从图表中移除且不再需要时,将调用 OnDestroy() 方法。 您需要实现此方法,因为它在创建新指标时默认不会添加。

1
2
3
4
protected override void OnDestroy()
        {
            base.OnDestroy();            
        }

此方法对程序员很有用,因为它允许他们释放非托管资源并执行最终任务。 它有助于防止内存泄漏,并确保指标在移除后不会保留资源。 示例包括关闭与外部数据源的连接、释放大数据对象以及其他释放内存的操作。

总结

总之,Initialize()Calculate()OnDestroy() 方法说明了自定义指标生命周期的不同阶段。 通过调整 Algo 应用中的示例代码,您可以自由决定如何初始化指标变量、计算指标输出并运行最终任务。

Image title