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

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

MQL5のAccountInfoDoubleは、取引口座に関する「浮動小数点数(double型)」の情報を取得するための非常に重要な関数です。具体的には、口座残高、有効証拠金、余剰証拠金、含み損益、レバレッジといった、資金管理の根幹に関わる数値をリアルタイムで取得します。

実務開発において、初心者が最もつまずきやすいのは「どのタイミングでどの数値を取得すべきか」という点です。例えば、エントリー判断の直前に「残高(Balance)」を参照するのか、あるいは含み損益を考慮した「有効証拠金(Equity)」を参照するのかで、算出されるロット数は大きく変わります。

プロのクオンツエンジニアは、単に数値を表示するためではなく、「動的なリスク管理(資金に対する○%のリスクを取る)」や、「証拠金維持率低下による強制ロスカットの回避ロジック」をEAに組み込むためにこの関数を徹底活用します。


2. 構文と戻り値

AccountInfoDouble関数の構文は非常にシンプルです。

double AccountInfoDouble(
   ENUM_ACCOUNT_INFO_DOUBLE  property_id      // プロパティ識別子
);

パラメーター

引数には、取得したい情報の種類をENUM_ACCOUNT_INFO_DOUBLE列挙型の中から指定します。主な識別子は以下の通りです。

  • ACCOUNT_BALANCE: 口座残高(決済済みの確定利益)
  • ACCOUNT_EQUITY: 有効証拠金(残高 + 含み損益)
  • ACCOUNT_MARGIN_FREE: 余剰証拠金(新しいポジションを持つのに使える証拠金)
  • ACCOUNT_PROFIT: 口座全体の含み損益
  • ACCOUNT_MARGIN_LEVEL: 証拠金維持率(%)

戻り値

指定した口座情報の値をdouble型(浮動小数点数)で返します。


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

以下は、現在の有効証拠金に基づいて、リスク許容度に応じた適切なロット数を自動計算し、余剰証拠金が不足している場合には警告を出す実用的なサンプルコードです。

void OnTick()
{
    // 1. 有効証拠金(Equity)を取得
    double equity = AccountInfoDouble(ACCOUNT_EQUITY);

    // 2. 余剰証拠金(Free Margin)を取得
    double freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);

    // 3. 証拠金維持率(Margin Level)を取得
    double marginLevel = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);

    // ログに出力(デバッグ用)
    Print("現在の有効証拠金: ", equity, " / 余剰証拠金: ", freeMargin, " / 維持率: ", marginLevel, "%");

    // --- 資金管理の応用例 ---
    double riskPercent = 2.0; // 1トレードあたりのリスクを有効証拠金の2%に設定
    double stopLossPips = 20.0; // ストップロス幅を20pipsと仮定

    // 許容損失額の計算
    double allowedRiskAmount = equity * (riskPercent / 100.0);

    // ここで計算されたallowedRiskAmountを元にロット数を決定するロジックへ繋げる
    // 例: ロット数 = 許容損失額 / (ストップロス幅 * 1ピップあたりの価値)

    // 証拠金維持率が300%を下回っている場合は新規エントリーを制限する
    if(marginLevel < 300.0 && marginLevel != 0) // 0はポジションなしの状態
    {
        Comment("警告: 証拠金維持率が低下しています。新規エントリーを停止します。");
        return;
    }
}

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

① 浮動小数点数の比較に注意

AccountInfoDoubledouble型を返します。プログラミングの基本ですが、if(AccountInfoDouble(ACCOUNT_BALANCE) == 1000000) のように「完全一致」で比較してはいけません。計算誤差により、ごくわずかに数値がズレることがあるため、比較の際は必ず「以上・以下(>=, <=)」を使うか、誤差を許容するロジック(NormalizeDouble関数など)を検討してください。

② 口座情報の更新タイミング

この関数で取得できる値は、サーバーから送られてくる最新のデータですが、相場急変時にはごく短いラグが発生する可能性があります。特に、1つのEAでループ処理を高速回転させるような特殊な設計にする場合、最新の値を再取得しているか(オンティックごとに呼び出しているか)を確認してください。

③ ポジションがない時の戻り値

口座にポジションが一つもない場合、ACCOUNT_MARGIN_LEVEL(維持率)は 0.0 を返します。計算式でこの値を分母に使うと「ゼロ除算エラー」が発生してEAが停止するため、必ず 0 ではないことを確認する処理を入れてください。


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

アルゴリズムトレードにおいて、AccountInfoDoubleで正確な資金状況を把握することは守りの要ですが、攻めの要となるのは「約定スピード」です。多くの初心者は自宅のPCでEAを稼働させようとしますが、これは極めて危険な行為です。家庭用インターネット回線は、ブローカーの取引サーバーとの間に物理的な距離があり、パケットの往復(レイテンシ)で数十から数百ミリ秒の遅延が発生します。

このわずかな遅延が、スリッページを引き起こし、バックテストでは利益が出ていたロジックを「勝てないシステム」へと変貌させます。プロのエンジニアが例外なくブローカーのデータセンターに近い場所にある専用のVPS(仮想専用サーバー)を利用するのは、このネットワーク遅延を極限まで排除するためです。24時間安定した稼働環境と、ミリ秒単位の約定速度を確保できて初めて、プログラムされたロジックは真の性能を発揮します。

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

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

コメント

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