皆さん、こんにちは!今日はMetaTrader 5で使えるMoney Flow Index(MFI)を計算するクラス、CMFIOnRingBufferについてお話しします。特に、リングバッファを利用したこのクラスの使い方に注目していきます。
CMFIOnRingBufferクラスの概要
このクラスは、リングバッファのアルゴリズムを使用してMFIを計算するために設計されています。MFIは、トレンドの強さを測るためのテクニカル指標の一つです。詳しくは、こちらをご覧ください。
クラスの宣言
class CMFIOnRingBuffer : public CArrayRing
ファイルの配置について
CMFIOnRingBuffer.mqhファイルは、MQL5\Include\IncOnRingBufferフォルダに配置する必要があります。このフォルダには、クラスの使用例が示された2つのファイルも添付されています。リングバッファや移動平均のクラスも同じフォルダに置いておく必要があります。
クラスメソッドの紹介
//--- 初期化メソッド: bool Init(// エラーがあればfalseを返す int period = 14, // MFIの期間 ENUM_MA_METHOD method = MODE_SMA, // スムージング手法 ENUM_APPLIED_PRICE applied_price = PRICE_TYPICAL, // 計算に使用する価格 ENUM_APPLIED_VOLUME applied_volume = VOLUME_TICK, // 計算に使用するボリューム int size_buffer = 256, // リングバッファのサイズ bool as_series = false // 時系列の場合はtrue );
//--- 時系列またはインジケータバッファに基づく計算メソッド: int MainOnArray(// 処理された要素の数を返す const int rates_total, const int prev_calculated, const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[]);
データへのアクセス方法
//--- データへのアクセスメソッド: int BarsRequired(); // インジケータを描画するために必要なバーの数を返す string Name(); // インジケータの名前を返す int Period(); // 期間を返す string Method(); // メソッドをテキスト形式で返す ENUM_APPLIED_PRICE Price(); // 使用価格のタイプを返す ENUM_APPLIED_VOLUME Volume(); // 使用ボリュームのタイプを返す int Size(); // リングバッファのサイズを返す
リングバッファから計算データを取得するのは、通常の配列から取得するのと同じです。例えば、次のように使用します。
//--- MFIインジケータ計算クラス: #include <IncOnRingBuffer\CMFIOnRingBuffer.mqh> CMFIOnRingBuffer mfi; //+------------------------------------------------------------------+ //| カスタムインジケータの反復関数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[]) { //--- 時系列に基づくインジケータの計算: mfi.MainOnArray(rates_total, prev_calculated, open, high, low, close, tick_volume, volume); //--- リングバッファ「mfi」からデータを使用: for(int i=start; i<rates_total && !IsStopped(); i++) MFI_Buffer[i] = mfi[rates_total - 1 - i]; // インジケータライン //--- 次回呼び出しのためのprev_calculatedの戻り値: return(rates_total); }
リングバッファのインデックスは、時系列と同様の方法で扱われますので、注意してください。
使用例
- Test_MFI_OnArrayRB.mq5ファイルでは、価格時系列に基づくインジケータの計算が示されています。MainOnArray()メソッドの使用例も見られます。
- Test_MFI_OnValueRB.mq5ファイルでは、MainOnValue()メソッドの使用例が示されています。最初にMFIインジケータが計算され、描画された後、そのリングバッファを基に別のMFIインジケータが描画されます。

Test_MFI_OnArrayRB.mq5の結果(リングバッファサイズ256要素)

Test_MFI_OnValueRB.mq5の結果(リングバッファサイズ256要素)
このコードの開発には、MetaQuotes Software Corp.、Integer、およびGODZILLAの技術が使用されています。