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

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

iATRは、相場のボラティリティ(価格変動率)を測定するインジケーター「ATR(Average True Range)」の値を計算するためのMQL5組み込み関数です。

実務開発において、ATRは単なる「テクニカル指標」以上の役割を持ちます。多くのプロトレーダーやクオンツが、ATRを「動的なリスク管理の基準」として活用しています。例えば、「固定で50ピップスの損切り」を置くのではなく、「ATRの2倍の値を損切り幅にする」といった設計にすることで、相場が激しく動いている時は広く、静かな時は狭く、市場環境に合わせた柔軟なトレードが可能になります。

初心者の方が最初につまずきやすいのは、「iATR関数を呼び出しても、直接ATRの数値(価格)が返ってくるわけではない」という点です。MQL5では、関数を呼び出して「ハンドル」を取得し、そのハンドルを使って「バッファ(数値データ)」を取り出すという2ステップの処理が必要です。この構造を理解することが、MQL5マスターへの第一歩となります。

2. 構文と戻り値

iATR関数の構文は以下の通りです。

int  iATR(
   string           symbol,     // 通貨ペア名(NULLなら現在のチャート)
   ENUM_TIMEFRAMES  period,     // 時間軸(PERIOD_CURRENTなら現在のチャート)
   int              ma_period   // 平均化期間(一般的には14)
   );

パラメーター解説

  1. symbol: 対象となる通貨ペアを指定します。_Symbol または NULL で現在のチャートを指定できます。
  2. period: 時間軸を指定します。PERIOD_M15(15分足)や PERIOD_H1(1時間足)など。
  3. ma_period: ATRを計算するための平均期間です。デフォルトでは「14」がよく使われます。

戻り値

  • 計算に成功すると、「インジケーターのハンドル」(int型の整数)を返します。
  • 失敗した場合は INVALID_HANDLE を返します。

この「ハンドル」は、後ほど CopyBuffer 関数を使用して実際のATR値を取得するために使用する「引換券」のようなものだと考えてください。

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

以下に、ATRの値を取得し、現在の価格から「ATRの2倍」の距離に損切りラインを設定する想定のサンプルコードを示します。

// +------------------------------------------------------------------+
// | ATRの値を取得するサンプルEA                                         |
// +------------------------------------------------------------------+
#property strict

// グローバル変数
int atrHandle; // ATRのハンドルを格納する変数

// --- 初期化関数 ---
int OnInit()
{
    // 1. ATRのハンドルを取得(期間14)
    atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);

    // ハンドルの取得に失敗した場合のチェック
    if(atrHandle == INVALID_HANDLE)
    {
        Print("ATRハンドルの取得に失敗しました。");
        return(INIT_FAILED);
    }

    return(INIT_SUCCEEDED);
}

// --- ティック毎の処理 ---
void OnTick()
{
    double atrValues[];        // ATRの値を格納する動的配列
    ArraySetAsSeries(atrValues, true); // 配列を時系列順(最新がインデックス0)に設定

    // 2. ハンドルを使って最新のATR値を配列にコピー(最新の1本分)
    if(CopyBuffer(atrHandle, 0, 0, 1, atrValues) < 0)
    {
        Print("ATRデータのコピーに失敗しました。エラーコード:", GetLastError());
        return;
    }

    // 3. 最新のATR値を取得
    double currentAtr = atrValues[0];

    // 実務的な活用例:ATRをベースにした損切り幅の計算
    double stopLossDistance = currentAtr * 2.0;

    // チャートに表示
    Comment("現在のATR(14): ", DoubleToString(currentAtr, _Digits), "\n",
            "推奨SL幅 (2xATR): ", DoubleToString(stopLossDistance, _Digits));
}

// --- 終了処理 ---
void OnDeinit(const int reason)
{
    // 4. 使用したハンドルを解放(メモリ管理)
    IndicatorRelease(atrHandle);
}

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

① OnTick内でiATRを呼び出さない

最も多いミスは、OnTick 関数の中で毎回 iATR を呼び出してハンドルを作ってしまうことです。これをやると、ティックが動くたびに新しい計算リソースを消費し、PCやサーバーに過大な負荷がかかり、最終的にはフリーズやクラッシュの原因になります。必ず OnInit で一度だけハンドルを取得するようにしましょう。

② 計算不足によるエラー

MT5を起動した直後や、新しい通貨ペアでEAを動かした直後は、過去データの読み込みが完了しておらず CopyBuffer が失敗することがあります。実戦用のコードでは、データの準備ができているか確認する処理を入れるのがクオンツとしての作法です。

③ 配列のインデックス順

CopyBuffer で取得したデータは、デフォルトでは「古い順(左から右)」に格納されます。最新の値を [0] で取得したい場合は、必ず ArraySetAsSeries(array, true) を実行して、時系列順(右から左)に並べ替える必要があります。

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

アルゴリズムトレードにおいて、ロジックの優位性と同じ、あるいはそれ以上に重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを稼働させることは、プロの現場から見れば非常にリスクの高い行為です。ネットワークの遅延(レイテンシ)やOSの予期せぬアップデートによる再起動は、計算された損切り注文の遅延を招き、コンマ数秒の差で本来避けるべきスリッページを発生させます。

特にATRのようなボラティリティ指標を用いる戦略では、相場急変時に注文が集中するため、1ミリ秒の遅れが致命的な損失に直結します。極限まで約定スピードを高め、物理的な距離による遅延を最小限に抑えるためには、取引サーバーに近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」での運用が不可欠です。安定した24時間の稼働環境と、プロ仕様の低遅延ネットワークを確保することこそが、システムトレーダーが最初に投資すべき「勝つためのインフラ」と言えます。

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

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

コメント

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