こんにちは、トレーダーの皆さん!今日は、メタトレーダー5でのテクニカル指標「エフィシエンシー・レシオ(ER)」を計算するための新しいクラス「CEROnRingBuffer」についてお話ししたいと思います。このクラスは、アダプティブ移動平均(AMA)を使用する際に非常に役立ちます。
クラスの説明
CEROnRingBufferクラスは、リングバッファのアルゴリズムを活用してERを計算するように設計されています。詳細はこちらをチェックしてください。
クラスの宣言
class CEROnRingBuffer : public CArrayRing
ファイルの配置
このクラスの定義は、IncOnRingBufferフォルダ内にあるCEROnRingBuffer.mqhファイルに保存する必要があります。このフォルダは、MQL5\Include\内に作成してください。また、サンプルファイルもこのフォルダ内に配置してください。
クラスのメソッド
//--- 初期化メソッド: bool Init(// エラーがあればfalse、成功すればtrueを返す int period = 34, // ER計算の期間 int size_buffer = 256, // リングバッファのサイズ bool as_series = false // 時系列の場合はtrue );
//--- 時系列またはインジケータバッファに基づく計算メソッド: int MainOnArray(// 処理された要素の数を返す const int rates_total, // 配列のサイズ const int prev_calculated, // 前回の呼び出しで処理された要素数 const double &array[]);
データへのアクセスメソッド
int BarsRequired(); // インジケータを描画するために必要なバー数を返す string Name(); // インジケータの名前を返す int Period(); // ER計算の期間を返す int Size(); // リングバッファのサイズを返す
リングバッファから計算されたデータは、通常の配列と同様に取得できます。以下はその例です:
//--- ERインジケータの計算メソッドを持つクラス: #include <IncOnRingBuffer\CEROnRingBuffer.mqh> CEROnRingBuffer er; ... //+------------------------------------------------------------------+ //| カスタムインジケータの繰り返し関数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- 価格時系列に基づくインジケータの計算: er.MainOnArray(rates_total, prev_calculated, price); ... //--- リングバッファ "er" からデータを使用: for(int i=start; i<rates_total; i++) { ER_Buffer[i] = er[rates_total - 1 - i]; // インジケータライン } //--- 次回呼び出しのためにprev_calculatedを返す: return(rates_total); }
リングバッファのインデックスは、時系列と同じですので、注意してください。
サンプル
- Test_ER_OnArrayRB.mq5ファイルは、価格時系列に基づいてインジケータを計算します。MainOnArray()メソッドの使い方が示されています。
- Test_ER_OnValueRB.mq5は、MainOnValue()メソッドの使用を示しています。最初にERインジケータが計算され、描画されます。その後、このインジケータのリングバッファに基づいて、別のERが描画されます。

Test_ER_OnArrayRB.mq5のリングバッファサイズ256の結果

Test_ER_OnValueRB.mq5のリングバッファサイズ256の結果
このコードを書くにあたり、MetaQuotes Software Corp.、Integer、およびGODZILLAの開発が参考にされました。