こんにちは、トレーダーの皆さん!今日はMetaTrader 5でのDouble Exponential Moving Average(DEMA)を計算するためのクラス「CDEMAOnRingBuffer」について解説します。このクラスは、リングバッファのアルゴリズムを使用してDEMAを効率的に計算するために設計されています。
DEMAとは?
DEMAは、トレンドをより正確に捉えるためのテクニカル指標で、価格の変動に敏感に反応します。特に、短期的なトレンドを把握するのに役立つため、多くのトレーダーに利用されています。
クラスの定義
class CDEMAOnRingBuffer : public CArrayRing
ヘッダーファイルのインクルード
#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>
この「CDEMAOnRingBuffer.mqh」ファイルは、MQL5の「Include」フォルダ内の「IncOnRingBuffer」フォルダに配置する必要があります。また、クラスに関連するサンプルファイルも同じフォルダに入れておくと良いでしょう。
クラスメソッドの紹介
bool Init(int period = 12, ENUM_MA_METHOD method = MODE_EMA, int size_buffer = 256, bool as_series = false);
このメソッドは、DEMAの初期化を行います。パラメーターとして、DEMAの期間やスムージング方法、リングバッファのサイズを指定します。
int MainOnArray(const int rates_total, const int prev_calculated, const double& price[]);
こちらのメソッドは、時間系列やインジケーターのバッファに基づいて計算を行うメインロジックです。
double MainOnValue(const int rates_total, const int prev_calculated, const int begin, const double value, const int index);
特定のバーに対するDEMAの値を取得するためのメソッドです。
データへのアクセス方法
int BarsRequired();
インジケーターを描画するのに必要なバーの数を返します。
string Name();
インジケーターの名前を返します。
int Period();
DEMAの計算に使用される期間を返します。
データは、通常の配列と同様にリングバッファから取得できます。例えば:
CDEMAOnRingBuffer dema;
dema.MainOnArray(rates_total, prev_calculated, price);
for(int i = start; i < rates_total && !IsStopped(); i++)
DEMA_Buffer[i] = dema[rates_total - 1 - i];
リングバッファのインデックスについて
リングバッファのインデックスは、時間系列と同様に扱われますので、注意してください。
サンプルコード
- 「Test_DEMA_OnArrayRB.mq5」ファイルでは、価格の時間系列に基づいて、MainOnArray()メソッドを使用したDEMAの計算を示しています。
- 「Test_DEMA_OnValueRB.mq5」ファイルでは、MainOnValue()メソッドを用いてDEMAを計算し、描画しています。

リングバッファのサイズが256要素の「Test_DEMA_OnArrayRB.mq5」の結果

リングバッファのサイズが256要素の「Test_DEMA_OnValueRB.mq5」の結果
このように、DEMAを計算するためのクラスを活用することで、より効率的にトレード戦略を構築することが可能です。興味のある方は、ぜひ試してみてください!
最後に、MetaQuotes Software Corp.、Integer、GODZILLAの開発によるコードを参考にしています。