【MQL5】iFrAMA関数の使い方と自動売買実装コード

1. iFrAMA関数の概要と実務での活用法

iFrAMAは、ジョン・エイラーズ(John Ehlers)が考案した「Fractal Adaptive Moving Average(フラクタル適応移動平均)」を算出するための組み込み関数です。

一般的な移動平均線(SMAなど)は、期間を固定するため「トレンド相場では遅行し、レンジ相場ではダマシに遭いやすい」という欠点があります。これに対しFrAMAは、相場の「フラクタル次元(価格の複雑性)」をリアルタイムで解析し、相場がトレンド状態にある時は価格への追従性を高め、レンジ状態では平滑化してノイズをカットするという動的な適応力を持っています。

実務での活用法とつまずきポイント:
実務開発においては、フィルターとして活用するのが最も効果的です。FrAMAの傾きが急なときは強いトレンドが発生していると判断し、水平に近いときはボラティリティが低いと判断します。
初心者がつまずきやすいのは、この関数が「価格」を直接返すのではなく、「インジケーターのハンドル(識別番号)」を返すという点です。ここを理解していないと、計算結果を取得できずプログラムが動作しません。

2. 構文と戻り値

iFrAMA関数は以下の構文で呼び出します。

int iFrAMA(
   string              symbol,            // 通貨ペア(NULLで現在の銘柄)
   ENUM_TIMEFRAMES     period,            // 時間軸(0で現在の周期)
   int                 ma_period,         // 平均化期間
   int                 ma_shift,          // 水平シフト
   ENUM_APPLIED_PRICE  applied_price      // 適用価格
);

パラメーター解説

  • symbol: 対象とする銘柄名。
  • period: 算出する時間軸。
  • ma_period: 計算のベースとなる期間。一般的に「14」や「30」などの値が使われます。
  • ma_shift: 指標を右方向にずらす量。通常は「0」です。
  • applied_price: どの価格を用いるか(終値、高値、安値など)。

戻り値

  • 成功すると、FrAMAの計算設定を保持するハンドル(int型)を返します。
  • 失敗した場合は INVALID_HANDLE を返します。

※実際の価格データ(数値)を取得するには、このハンドルを使って CopyBuffer 関数を呼び出す必要があります。

3. 具体的な使い方・実践サンプルコード

以下は、FrAMAの値を計算し、現在の価格がFrAMAより上か下かで簡単なトレンド判断を行うエキスパートアドバイザー(EA)のテンプレートです。

//+------------------------------------------------------------------+
//|                                              FrAMA_Sample_EA.mq5 |
//+------------------------------------------------------------------+
#property strict

// グローバル変数
int handle_frama;      // FrAMAのハンドルを格納
double buffer_frama[]; // 値を格納する配列

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // FrAMAのハンドルを作成(期間14、シフト0、終値を使用)
   handle_frama = iFrAMA(_Symbol, _Period, 14, 0, PRICE_CLOSE);

   // ハンドルの作成に失敗した場合の処理
   if(handle_frama == INVALID_HANDLE)
   {
      Print("FrAMAハンドルの作成に失敗しました。");
      return(INIT_FAILED);
   }

   // 配列を時系列順(最新がインデックス0)に設定
   ArraySetAsSeries(buffer_frama, true);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 最新のFrAMAデータを2個分コピーする
   if(CopyBuffer(handle_frama, 0, 0, 2, buffer_frama) < 0)
   {
      Print("データのコピーに失敗しました。エラーコード:", GetLastError());
      return;
   }

   // 現在の価格を取得
   double current_close = iClose(_Symbol, _Period, 0);
   double frama_value = buffer_frama[0]; // 最新のFrAMAの値

   // 簡易的なロジック例
   if(current_close > frama_value)
   {
      Comment("現在の状態:FrAMAより上で推移(上昇トレンド示唆)");
   }
   else
   {
      Comment("現在の状態:FrAMAより下で推移(下降トレンド示唆)");
   }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 使用したハンドルを解放(メモリ管理)
   IndicatorRelease(handle_frama);
}

4. 使用上の注意点とよくあるエラー

  1. ハンドルの作成はOnInitで行うこと: iFrAMA関数をOnTick内で毎回呼び出すのはNGです。PCのリソースを激しく消費し、動作が極端に重くなります。必ずOnInitで一度だけ作成し、ハンドルを使い回してください。
  2. 配列の時系列設定: CopyBufferで値を受け取る配列は、ArraySetAsSeriestrueに設定しておくと、buffer[0]が常に最新の値を指すようになるため、直感的にコーディングしやすくなります。
  3. 計算期間の影響: ma_periodが小さすぎるとフラクタル次元の計算が不安定になり、移動平均線としての滑らかさが失われます。逆に大きすぎると反応が鈍くなるため、まずはデフォルトに近い14〜30程度で最適化を行うのが定石です。
  4. 十分なバー数: 起動直後、チャートに十分な本数のローソク足がないと計算エラーが発生することがあります。特にバックテストではなくリアル稼働時は注意が必要です。

5. 【重要】自動売買における約定スピードと環境の罠

自動売買プログラム(EA)を開発するエンジニアにとって、ロジックの優劣以上に重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを稼働させることは、プロの戦場では致命的なハンデとなります。ネットワークの物理的な距離に起因する遅延(レイテンシ)は、数ミリ秒単位で約定価格を滑らせ、バックテストでは利益が出ていたロジックを損失へと変えてしまいます。

特にFrAMAのような適応型インジケーターを用いて、相場の急変を捉えようとする戦略では、コンマ数秒の遅れが命取りです。極限まで約定スピードを高め、スリッページを最小限に抑えるには、証券会社のサーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。安定した電源、24時間の稼働保証、そして超低遅延なネットワーク環境を整えることは、勝つための最低条件と言えるでしょう。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました