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個別の設定」の混同です。
-
MQL_TRADE_ALLOWED の落とし穴:
この識別子は、「MT5画面上部のアルゴリズム取引ボタン」がONであり、かつ「EAのプロパティ画面での売買許可チェック」もONである場合にのみtrueを返します。どちらか一方でもオフならfalseになるため、デバッグ時には両方の設定を確認してください。 -
AccountInfoIntegerとの違い:
「口座が取引可能か(凍結されていないか、読み取り専用ではないか)」を知りたい場合は、MQLInfoIntegerではなくAccountInfoInteger(ACCOUNT_TRADE_ALLOWED)を使用します。プログラム側の権限か、口座側の権限かを切り分けて考えることが重要です。 -
戻り値の型:
関数自体はintを返しますが、内部的なデータはlongで保持されている場合があるため、非常に大きな値を扱う際はキャスト(型変換)に注意してください。
5. 【重要】自動売買における約定スピードと環境の罠
クオンツエンジニアとして断言しますが、どれほど優れたロジックをMQL5で組み上げても、実行環境が「自宅のPC」である限り、プロの土俵で勝ち続けることは困難です。自動売買において、プログラムから発信された注文が証券会社のサーバーに届くまでの「ネットワーク遅延(レイテンシ)」は、収益性を決定づける極めて重要なファクターです。
自宅のインターネット回線では、物理的な距離やプロバイダーの混雑により、ミリ秒単位の遅延が日常的に発生します。このわずかな遅れが原因で、狙った価格から滑って約定する「スリッページ」が発生し、バックテスト通りの期待値を大きく削り取ってしまうのです。極限まで約定スピードを高め、24時間365日安定した稼働を維持するためには、証券会社のサーバーに近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の導入が不可欠です。インフラを整えることは、手法を磨くことと同じ、あるいはそれ以上に重要な投資であることを忘れないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント