MQL4で発注前に必ず確認していたIsTradeAllowed()を、

MQL5で書こうとして関数が見当たらず、戸惑ったことはないでしょうか。

実はMQL5にIsTradeAllowed()は存在せず、

MQLInfoIntegerという、より細かく状態を取得できる関数に置き換わっています。

この記事では、MQLInfoIntegerで何が分かるのか、

MQL4の1つの真偽値で済んでいた判定が

なぜ3層のチェックに変わったのかまで解説します。

この記事で分かること
・MQLInfoIntegerで取得できる主な情報
・ターミナル・プログラム・口座の3層で取引許可を確認する設計
・ストラテジーテスター中だけログを減らす実装
・実際に動くコード全体

MQLInfoIntegerとは何か

まず、この関数が何を取得できるのかを確認します。

シグネチャと戻り値の見方

int MQLInfoInteger(
   int property_id
);

引数`property_id`にENUM_MQL_INFO_INTEGERの

識別子を渡すと、実行中のMQL5プログラムに関する情報がint型で返ります。

ENUM_MQL_INFO_INTEGERの主要な識別子

代表的な識別子は次のとおりです。

識別子 意味
MQL_PROGRAM_TYPE スクリプト/EA/インジケーター/サービスのどれか
MQL_TRADE_ALLOWED このプログラム自体に取引が許可されているか
MQL_TESTER ストラテジーテスター内で実行中か
MQL_OPTIMIZATION 最適化モードで実行中か
MQL_VISUAL_MODE ビジュアルモードで実行中か
MQL_DEBUG デバッグモードで実行中か
MQL_MEMORY_USED 使用中のメモリ量(MB)

MQL4に相当する関数が無い理由

MQL4にはこれらをまとめて1つの関数で取得する仕組みがなく、

IsTradeAllowed()・IsOptimization()・

IsTesting()のように、個別の関数が目的ごとに用意されていました。

MQL5ではMQLInfoIntegerに統合され、

識別子を変えるだけで多くの情報を取得できる設計になっています。

3層構造の実行許可チェック

MQL4のIsTradeAllowed()が1つで済ませていた判定を、

MQL5では3層に分けて確認します。

ターミナルレベル(TerminalInfoInteger)

bool terminalOk = (bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED);

ターミナル全体で「アルゴ取引」ボタンが有効になっているかを確認します。

プログラムレベル(MQLInfoInteger)

bool programOk = (bool)MQLInfoInteger(MQL_TRADE_ALLOWED);

このEA・スクリプト自体のプロパティで取引が許可されているか、

あるいはストラテジーテスター内で実行中かを確認します。

口座レベル(AccountInfoInteger)

bool accountOk = (bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);

ブローカー側の口座設定で取引が許可されているかを確認します。

3つすべてがtrueの場合だけ、発注処理へ進む設計にします。

ストラテジーテスター中だけ挙動を変える設計

テスターでの実行かどうかを判定し、ログの出し方を切り替えます。

MQL_TESTER/MQL_OPTIMIZATION/MQL_VISUAL_MODEの使い分け

MQL_TESTERは単体バックテスト・最適化・

ビジュアルモードのいずれでもtrueになります。

最適化の繰り返し実行中だけを区別したい場合はMQL_OPTIMIZATIONを使います。

最適化中はPrintを減らす理由

既刊comment-alert-print-mql5.mdで触れたとおり、

最適化中は大量の組み合わせが高速に実行されるため、

Printを呼び続けるとログが埋もれ、処理も遅くなります。

MQL_DEBUGでデバッグ時だけ詳細ログを出す

通常運用では簡潔なログにしておき、

MQL_DEBUGがtrueの時だけ詳細な変数の中身を出す、

という切り替えも同じ考え方で実装できます。

メモリ使用量を監視する設計

配列を多用する処理では、メモリの状態も確認できます。

MQL_MEMORY_USED/MQL_MEMORY_LIMITの使い方

long memUsed  = MQLInfoInteger(MQL_MEMORY_USED);
long memLimit = MQLInfoInteger(MQL_MEMORY_LIMIT);

使用中のメモリ量と、プログラムに許された上限(MB)を取得できます。

何に使えるか(重い配列処理の監視)

大きな配列をArrayResizeで拡張し続けるタイプのEAでは、

定期的にこの値をログに出しておくと、

上限に近づいた際の原因調査がしやすくなります。

実際に動くコード全体

ここまでの要素をまとめた、起動時チェック用のスクリプトです。

//+------------------------------------------------------------------+
//|                                        MqlInfoIntegerExample.mq5 |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property script_show_inputs

void OnStart()
  {
   long programType = MQLInfoInteger(MQL_PROGRAM_TYPE);
   Print("プログラム種別コード: ", programType);

   bool isTester       = (bool)MQLInfoInteger(MQL_TESTER);
   bool isOptimization = (bool)MQLInfoInteger(MQL_OPTIMIZATION);

   if(isOptimization)
      Print("最適化中のため詳細ログを省略します");
   else if(isTester)
      Print("ストラテジーテスター内で実行中です");
   else
      Print("通常のチャート上で実行中です");

   bool programOk  = (bool)MQLInfoInteger(MQL_TRADE_ALLOWED);
   bool terminalOk = (bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED);
   bool accountOk  = (bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);

   if(!programOk || !terminalOk || !accountOk)
     {
      Print("取引が許可されていません。Program:", programOk,
            " Terminal:", terminalOk,
            " Account:", accountOk);
      return;
     }

   long memUsed  = MQLInfoInteger(MQL_MEMORY_USED);
   long memLimit = MQLInfoInteger(MQL_MEMORY_LIMIT);
   Print("メモリ使用量: ", memUsed, "MB / 上限: ", memLimit, "MB");
  }

MetaEditorでのコンパイル・実行手順

実際にMT5で動かすまでの手順を確認します。

  1. MetaEditorで新規スクリプト「MqlInfoIntegerExample」を作成し、上のコードを貼り付けてコンパイルする
  2. MT5のナビゲーターからチャートへドラッグ&ドロップで実行する
  3. 「エキスパート」タブでプログラム種別・取引許可・メモリ使用量のログを確認する
  4. ストラテジーテスターで同じスクリプトを実行し、判定結果が切り替わることを確認する

よくあるエラーと注意点

実装・運用でつまずきやすいポイントをまとめます。

MQL_PROGRAM_TYPEの判定を誤る

注意
・MQL_PROGRAM_TYPEの戻り値はENUM_PROGRAM_TYPEの数値です
・インジケーター(PROGRAM_INDICATOR)からOrderSend系は呼べません
・種別の判定を誤ると発注コードが無言で機能しない原因になります

3層チェックのどれか1つだけで判断してしまう

MQL_TRADE_ALLOWEDだけを見て「許可されている」と判断すると、

ターミナルのアルゴ取引ボタンが無効だった場合を見落とします。

3つすべてを確認する設計にしてください。

MQL4とMQL5の違い

MQL4のIsTradeAllowed()はMQL5には存在しません。

MQLInfoInteger・TerminalInfoInteger・

AccountInfoIntegerの3つに分割されたと理解してください。

よくある質問

MQLInfoIntegerについて、よく検索される疑問に回答します。

MQLInfoStringとは何が違いますか?

MQLInfoIntegerは整数値(真偽値や種別コード等)を返し、

MQLInfoStringはプログラム名やパスのような文字列情報を返します。

役割で使い分けてください。

インジケーターでも使えますか?

はい、使えます。

ただしMQL_PROGRAM_TYPEがPROGRAM_INDICATORの場合、

取引許可の判定自体に意味がない(インジケーターは発注しない)ため、

テスターモードの判定やメモリ監視など別の用途が中心になります。

この3層チェックをすればエラーは完全に防げますか?

いいえ、断定はできません。

3層チェックは「許可されていない状態での発注」を未然に防ぐものであり、

価格変動によるリクォート等、別の種類のエラーは別途対処が必要です。

【MQL5入門】MQLInfoIntegerでテスター実行中・取引許可を判定する方法(MQL4のIsTradeAllowedとの違い):まとめ

MQL5にはMQL4のIsTradeAllowed()に相当する単一の関数はなく、

MQLInfoInteger・TerminalInfoInteger・

AccountInfoIntegerの3層に分かれています。

テスター・最適化モードの判定やメモリ監視も

同じMQLInfoIntegerでまとめて取得でき、

起動時チェックの設計に組み込むことで、安全性と運用のしやすさを両立できます。

関連記事