このコントロールパネルには、次のような機能があります:
- 「トレンドバー」をクリックすると、インジケーターのオンとオフが切り替えられます。
- 「Non-Lag-MA」をドラッグ&ドロップして、情報表示の位置を変更できます。
- 「トップバンド」をクリックすると、NonLagMAの'alfa'配列と重みの変数が表示されます。これは単なる好奇心をくすぐる表示です。
- チャート上の任意の場所をクリックすると、その時刻のバーが選択され、そのインジケーターの値が表示されます。

インジケーターのバッファ(およびプロット)を定義するオプションとして、データをコードから分離し、各バッファに対するデータを単一のコードブロックに供給することができます。データ配列に加えて、人間が読みやすいインデックスを使用して配列にアクセスするためのenumを定義します。

このデータはforループによって提供され、配列にアクセスしてインデックス設定関数にデータを提供します。各関数は一度だけ入力すればよいです:
- for(IndicatorBufferIdx idx=0; idx<k_end_indi_idx; idx++){ // バッファインデックスを使用して各バッファを処理します
同様に、プログラム全体で同じ「IndicatorBufferIdx」enumの値を使用してアクセスできるバッファの配列を定義するために構造体を使用します:
struct IndiStruct
{
double m_indi_buff[];
} indi_array[k_end_indi_idx]; // 定義されたインジケーターバッファの数のためにインジケーターバッファを作成します
こうして: indi_array[k_ATR_up_idx].m_indi_buff[shift];
2つのクラスが定義されています:
- class AlfaClassは、NonLagMAの値を計算するすべての機能を実行し、alfa配列値と重みの値はコンストラクタが実行されるときにのみ計算されます。異なる期間をコンストラクタに渡すことで、複数の移動平均を表示するインジケーターを簡単にサポートできます。
- class InformationDisplayPanelは、情報パネルの表示に必要なすべての機能を実装し、OnChartEvent処理とのインタラクションも行います。また、コード内で人間が読みやすいテキストを使用してパネルオブジェクトのデータにアクセスするための列挙体を使用しています。

OnChartEvent関数は、3つの異なるイベントを処理します:
- CHARTEVENT_CLICK:インジケーターデータを表示するための時間(チャートバー)を選択します。
- CHARTEVENT_OBJECT_CLICK:オブジェクトのクリックを検出し、インジケーターのオン・オフを切り替えます。
- CHARTEVENT_OBJECT_DRAG:情報パネルを移動できるようにします。
OnCalculateには、6つの関数呼び出しが含まれ、それぞれの処理に失敗した場合はfalseを返し、以前に成功したバーの数を返してOnCalculate関数を終了します(static整数last_prev_calculatedの値):
- SetCalculateLimitsは、インジケーターが処理すべき最古のバー(starting_bar)を設定し、端末からデータを取得するバーの数(in to_copy)を設定します。端末データハンドルの設定関数(HandlesSet)を通常のOnInitから移し、最初の実行時にSetCalculateLimitsの内部から呼び出して、ハンドル取得時にエラーがあった場合の自動再試行を実装しました。
- TerminalCalculationsAreCompleteは、端末がiMAおよびiATRデータの計算を完了したかどうかを確認します。起動時、この関数はほぼ常にエラーを返し、端末は2回目の試行でOnCalculateを自動的に再実行します。端末のExpertsタブで次のようなインジケーターエラーログを確認してください:
- "TerminalCalculationsAreComplete: MA_handleのデータがすべて計算されていません(66109バー中-1バーが計算されました)。エラー:4806、要求されたデータが見つかりませんでした、1回。"
- PerformBufferCopiesは、インジケーターが使用するための端末データ(移動平均とATR)を取得します。
- 端末からの移動平均は単一バーの移動平均で、その唯一の目的は各バーのENUM_APPLIED_PRICE値を取得することです。デフォルトはPRICE_CLOSEです。実際の移動平均はインジケーターによって計算されます(デフォルトは30バー)。
- RunTheIndicatorはインジケーターの計算とその後の表示を行います。RunTheIndicatorは、インジケーターがオフになって再びオンになったときにもOnChartEvent関数から呼び出され、インジケーターを再表示します。
- ShowBarStatistics:最後に、インジケーターの情報パネルが表示されます。
このプログラムにはMQL4の「ツイン」があり、コードブロックと関数の並列比較を行うために使用できます。興味のある方には喜んで提供します。