こんにちは、トレーダーの皆さん!今日は、MetaTrader 5で使える「OnCalculateパラメータの値を確認する」インジケーターについてご紹介します。このインジケーターは、プログラミングを始めたばかりの方や、OnCalculateやその他の関数から提供される値を確認したい方にとって、非常に便利なツールです。
このインジケーターでは、以下の値を表示します:
- 最新のOnCalculate呼び出しからの最も最近の値
- 前回のOnCalculate呼び出しからの値
- 最初のOnCalculate実行時の値
- 各配列のseries値(as_seriesまたはnot_series)を表示し、クリックで変更できます
バージョン1.10では、配列がseriesとして設定されるかどうかを動的に変更できる機能が追加されました。テキストをクリックするだけで切り替え可能です。また、ウィンドウバーおよび最初に表示されるバーの値は、チャートの変化に応じて動的に設定されます。ON/OFF表示は、次回のOnCalculate実行時に設定がどのように適用されるかを示します。
バージョン1.20では、インジケーターが配列をas_seriesまたはnot_seriesに設定するオプションが追加されました。これもテキストをクリックするだけで選択可能です。さらに、時間配列の両端やiMAバッファの両端も表示されるようになりました。これにより、as_seriesとnot_seriesの違いが明確になります。表示は必要に応じてOnTimeEventハンドラーを使用してリフレッシュされ、毎回のクォートで表示を行うのではなく、OnCalculateの実行時間を約300msから1ms未満に短縮します。実行時間を表示するコードはOnCalculate内に残されており、コメントを解除するだけで実行ミリ秒を表示できます。
以下の画像は、OnCalculate_Valuesユーティリティが表示する値を示しています。'/」で区切られた3つの値、「最も最近の値」、「前の値」、「最初の値」に注目してください。OnCalculateの値は、すべてのOnCalculateイベントで'as_series'または'not_series'として設定されます。配列が'ON'の場合は、それ以外は端末のデフォルト値が適用されます。また、配列名の後に括弧で示される値は、その値がどのバーから来ているかを示します。インデックス'0'の値、または'最大インデックスでの値'です。

このコードは、iMAによって提供される各バーのオープン価格のプロットである単一のインジケーターラインを実装しています。その目的は、「BarsCalculated」関数を使用するためのバッファを提供し、'as_series'または'not_series'に設定されたインジケーターの表示を示すことです。iMA_Val[0]をクリックすると、iMAバッファがas_seriesまたはnot_seriesに設定されますが、これは一度だけの操作です。iMAインジケーター配列は、OnCalculateの各呼び出し時に設定されません。
表示オブジェクト(OBJ_LABEL)の各プロパティを保持する配列のコレクションがあります:

「ArrayGetAsSeries」関数は、OnCalculateパラメータ内の配列が時間系列配列かどうかを判断するために使用され、その結果(As_SeriesまたはNot_Series)が表示されます。この表示では、これらの配列が初めての呼び出し時には系列でないことが示され、系列として設定された後は次回以降も系列として保持されます(SetAsSeries関数は、ONのときのみ系列として設定し、OFFのときはデフォルトに戻ります)。
3つのメンバーからなる配列、ary_OnCalcValsは、1) 最も最近の値、2) 前の値、3) 最初の値を保持します。CopyNewToOldおよびMoveNewTo関数は、各表示パラメータの現在の値を取得し、ary_OnCalcValsによって提供される履歴ストレージに格納します。