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

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

MQL5で自動売買プログラム(EA)やインジケーターを開発する際、避けて通れないのが「実行環境の状態把握」です。MQLInfoIntegerは、現在動作しているプログラムそのものの設定や、ターミナルから許可されている権限の状態を取得するための関数です。

実務レベルの開発において、この関数は単なる「情報取得」以上の役割を持ちます。例えば、「自動売買ボタンがオフなのに注文を出そうとしてエラーを吐き続ける」といった挙動は、ログを汚すだけでなく、証券会社側のサーバーに負荷をかけ、最悪の場合はアカウント制限の対象になりかねません。

MQLInfoIntegerを活用することで、プログラムの初期化時(OnInit)に「そもそも売買が許可されている環境か?」をチェックし、条件を満たさない場合は安全に処理を停止させるといった、堅牢なエラーハンドリングが可能になります。

2. 構文と戻り値

MQLInfoInteger関数の構造は非常にシンプルです。

int  MQLInfoInteger(
   ENUM_MQL_INFO_INTEGER  property_id      // プロパティ識別子
   );

パラメーター

  • property_id: 取得したい情報の種類を「ENUM_MQL_INFO_INTEGER」列挙型から指定します。

戻り値

  • 指定したプロパティの値を int 型(または long 型)で返します。多くの項目は「0(False)」か「1(True)」の論理値として扱われます。

主なプロパティ識別子

  • MQL_TRADE_ALLOWED: EAによる売買が許可されているか(1なら許可)。
  • MQL_TESTER: ストラテジーテスターで動作中か。
  • MQL_OPTIMIZATION: 最適化プロセスで動作中か。
  • MQL_VISUAL_MODE: テスターの可視モード(チャート表示あり)で動作中か。
  • MQL_DLLS_ALLOWED: DLLの使用が許可されているか。

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

以下に、EAの起動時に取引環境をチェックする実戦的なコード例を示します。

//+------------------------------------------------------------------+
//| EAの初期化関数                                                     |
//+------------------------------------------------------------------+
int OnInit()
{
    // 1. 自動売買が許可されているかチェック
    if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
    {
        Print("【警告】このEAは自動売買が許可されていません。設定を確認してください。");
        // 実際の運用ではここでAlertを出したり、初期化失敗を返したりする
    }

    // 2. DLLの使用許可をチェック(外部ライブラリを使う場合)
    if(!MQLInfoInteger(MQL_DLLS_ALLOWED))
    {
        Print("【エラー】DLLの使用が許可されていません。");
        return(INIT_PARAMETERS_INCORRECT);
    }

    // 3. テスター動作時のみ特定の処理を行う
    if(MQLInfoInteger(MQL_TESTER))
    {
        Print("バックテスト環境を検知しました。");
    }
    else
    {
        Print("リアルタイム稼働環境です。");
    }

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| ティックごとの処理                                                 |
//+------------------------------------------------------------------+
void OnTick()
{
    // 最適化実行中(Optimization)は計算負荷を下げるためにログ出力を抑制する
    if(!MQLInfoInteger(MQL_OPTIMIZATION))
    {
        // 最適化中でないときだけ実行したい重い処理など
    }
}

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

開発者が特につまずきやすいのは、「ターミナルの設定」と「EA個別の設定」の混同です。

  1. MQL_TRADE_ALLOWED の落とし穴:
    この識別子は、「MT5画面上部のアルゴリズム取引ボタン」がONであり、かつ「EAのプロパティ画面での売買許可チェック」もONである場合にのみ true を返します。どちらか一方でもオフなら false になるため、デバッグ時には両方の設定を確認してください。

  2. AccountInfoIntegerとの違い:
    「口座が取引可能か(凍結されていないか、読み取り専用ではないか)」を知りたい場合は、MQLInfoInteger ではなく AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) を使用します。プログラム側の権限か、口座側の権限かを切り分けて考えることが重要です。

  3. 戻り値の型:
    関数自体は int を返しますが、内部的なデータは long で保持されている場合があるため、非常に大きな値を扱う際はキャスト(型変換)に注意してください。

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

クオンツエンジニアとして断言しますが、どれほど優れたロジックをMQL5で組み上げても、実行環境が「自宅のPC」である限り、プロの土俵で勝ち続けることは困難です。自動売買において、プログラムから発信された注文が証券会社のサーバーに届くまでの「ネットワーク遅延(レイテンシ)」は、収益性を決定づける極めて重要なファクターです。

自宅のインターネット回線では、物理的な距離やプロバイダーの混雑により、ミリ秒単位の遅延が日常的に発生します。このわずかな遅れが原因で、狙った価格から滑って約定する「スリッページ」が発生し、バックテスト通りの期待値を大きく削り取ってしまうのです。極限まで約定スピードを高め、24時間365日安定した稼働を維持するためには、証券会社のサーバーに近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の導入が不可欠です。インフラを整えることは、手法を磨くことと同じ、あるいはそれ以上に重要な投資であることを忘れないでください。

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

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

コメント

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