コンテンツにスキップ

カスタムインジケーターのライフサイクル

サンプルコードの構造

この記事では、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()メソッドの2つのメソッドしか含まれていません。 ビルドをクリックして、このインジケーターのテストを進めます。 後でその目的を説明するOnDestroy()メソッドを追加します。

初期化イベント

cTraderインジケーターが初めてチャートにアタッチされたとき、またはユーザーがパラメーター設定のいずれかを変更したときに、インジケーターインスタンスが再作成され、Initialize()メソッドが呼び出されます。 このメソッドは、インジケーターで使用する予定の変数を初期化するために使用されます。 また、他のインジケーターの数式を使用して単一のインジケーターを作成するために、追加のインジケーターを定義して参照することもできます。

デフォルトでは、新しいコードテンプレートには「Hello world!」という値を持つMessageというパラメーター設定が含まれています。

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

Initialize()メソッドには、このメッセージをログに出力するコード行があります。

1
Print(Message);

Initialize()メソッドを実証するために、ビルドアイコンの横にあるプラスアイコンをクリックし、シンボルを選択してインジケーターインスタンスを追加します。 インジケーター行のその他をクリックしてインスタンスを追加を選択すると、EURUSDシンボルとh1時間枠が自動的に追加されます。

Image title

注意

cTrader Algoでインスタンスを追加することは、Tradeアプリケーションでインジケーターをチャートにアタッチすることと同じです。

次に、チャートの下にあるトレードウォッチパネルのログタブを開きます。 ご覧の通り、「Hello world」というメッセージが出力されています。

Image title

インジケーターが初めてチャートに追加されたとき、またはパラメーターが変更されたときは、チャートが更新され、Initialize()メソッドが再度呼び出されます。 パラメーターセクションに別のメッセージを入力して、ログエントリがそれに応じて更新されることを確認します。

Image title

インジケーター出力の計算

Calculate()メソッドは、履歴データの各インデックスと各受信ティックに対して呼び出されます。 たとえば、現在のチャートに1000本のバーがある場合、Calculate()メソッドはインデックス0、1、2、…、最大999に対して呼び出されます。

1
public override void Calculate(int index)

Calculate()メソッドは、ボラティリティが高い期間には1秒間に複数回呼び出されることもあれば、市場がフラットなときには少ない回数で呼び出されることもあります。 その動作をテストするために、Calculate()メソッドの本体に、新しいデータティックごとにメソッドに渡されるインデックス値を出力するコード行を追加できます。 コードエディターウィンドウで変更を加えた後は、必ずビルドをクリックしてください。

1
Print("Index: " + index);

コードエディターウィンドウからチャートに切り替えるには、追加したインジケーターインスタンスをクリックします。 トレードウォッチパネルのログタブを開くと、メソッドに渡された各インデックスの値が出力されていることがわかります。

Image title

OnDestroy() メソッド

OnDestroy() メソッドは、インジケーターがチャートから削除され、不要になったときに呼び出されます。 このメソッドはデフォルトでは追加されないため、新しいインジケーターを作成する際に実装する必要があります。

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

このメソッドはプログラマーにとって有用であり、アンマネージドリソースを解放し、終了タスクを実行することができます。 これにより、メモリリークを防ぎ、インジケーターが削除後にリソースを保持しないようにします。 例としては、外部データフィードへの接続を閉じる、大きなデータオブジェクトを解放する、メモリを解放するその他の操作などが挙げられます。

概要

要約すると、Initialize()Calculate()OnDestroy() メソッドは、カスタムインジケーターのライフサイクルの異なる段階を示しています。 Algo アプリのサンプルコードを調整することで、インジケーター変数の初期化、インジケーター出力の計算、終了タスクの実行方法を自由に決定できます。

Image title