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

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

MQL5の AccountInfoInteger は、取引口座に関する「整数型(long型)」の情報を取得するための組み込み関数です。口座番号、レバレッジ、口座のモード(デモ/リアル)、ストップアウトレベルの計算方式など、システムトレードの根幹に関わる重要なステータスをプログラム側で把握するために使用します。

実務開発において、初心者が特につまずきやすいのは「実行環境による仕様の違いを考慮せずにロジックを組んでしまうこと」です。例えば、レバレッジが25倍の国内口座と500倍の海外口座では、同じ資金量でも持てる最大ポジション数が全く異なります。また、デモ口座では動くのにリアル口座で動かないといったトラブルも、この関数を使って「リアル口座かどうか(ACCOUNT_TRADE_MODE)」をチェックするガードレールを設けることで、未然に防ぐことができます。

堅牢なEA(エキスパートアドバイザー)を開発するためには、マジックナンバーや証拠金維持率の判定基準をハードコーディング(固定値入力)せず、この関数を用いて動的に取得することがプロのクオンツエンジニアとしての定石です。


2. 構文と戻り値

AccountInfoInteger 関数の基本構文は以下の通りです。

long AccountInfoInteger(
   ENUM_ACCOUNT_INFO_INTEGER  property_id   // 識別子
);

パラメーター

  • property_id: 取得したい情報の種類を ENUM_ACCOUNT_INFO_INTEGER 型の定数から指定します。

戻り値

  • 指定したプロパティの値を long型 で返します。

主要なプロパティID(よく使うもの)

  • ACCOUNT_LOGIN: 口座番号
  • ACCOUNT_LEVERAGE: レバレッジ
  • ACCOUNT_TRADE_MODE: 口座の種類(Demo, Contest, Real)
  • ACCOUNT_MARGIN_SO_MODE: ストップアウト(強制ロスカット)の計算形式(パーセント指定か金額指定か)
  • ACCOUNT_TRADE_ALLOWED: その口座で取引が許可されているか

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

以下は、EAの初期化時に口座情報をチェックし、特定の条件下で動作を制限する実戦的なサンプルコードです。

//+------------------------------------------------------------------+
//| 起動時に口座の基本情報をログに出力し、リアル口座チェックを行う例      |
//+------------------------------------------------------------------+
int OnInit()
{
    // 1. 口座番号の取得
    long loginID = AccountInfoInteger(ACCOUNT_LOGIN);

    // 2. レバレッジの取得
    long leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);

    // 3. 口座モードの取得(デモ・リアル等)
    ENUM_ACCOUNT_TRADE_MODE tradeMode = (ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE);

    // 4. 自動売買が口座レベルで許可されているか
    bool isTradeAllowed = (bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);

    // ログに出力
    PrintFormat("--- 口座情報チェック ---");
    PrintFormat("口座番号: %d", loginID);
    PrintFormat("レバレッジ: 1:%d", leverage);

    // 口座種別の判定
    string modeStr;
    switch(tradeMode)
    {
        case ACCOUNT_TRADE_MODE_DEMO:    modeStr = "デモ口座"; break;
        case ACCOUNT_TRADE_MODE_CONTEST: modeStr = "コンテスト口座"; break;
        case ACCOUNT_TRADE_MODE_REAL:    modeStr = "リアル口座"; break;
        default:                         modeStr = "不明なモード"; break;
    }
    PrintFormat("口座種別: %s", modeStr);

    // 【実務での活用】リアル口座でのみ動作させたい場合
    if(tradeMode == ACCOUNT_TRADE_MODE_REAL)
    {
        Print("警告: リアル口座でEAが稼働しています。慎重に運用してください。");
    }

    // 口座で取引が禁止されている場合の処理
    if(!isTradeAllowed)
    {
        Print("エラー: この口座ではプログラムによる取引が許可されていません。");
        return(INIT_FAILED);
    }

    return(INIT_SUCCEEDED);
}

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

戻り値の型に注意(long型)

AccountInfoInteger の戻り値は long(64ビット整数)です。レバレッジや口座番号を int(32ビット整数)の変数に代入しようとすると、値が非常に大きい場合にデータが欠落したり、コンパイル警告(possible loss of data)が出たりします。原則として long 型で受け取るようにしましょう。

Double型・String型との使い分け

「口座残高」や「証拠金維持率」は 小数(double) なので AccountInfoDouble を、「口座名義」や「サーバー名」は 文字列(string) なので AccountInfoString を使用する必要があります。
「なぜか0が返ってくる」というトラブルの多くは、関数の使い分けミスによるものです。

動的な変化への対応

ACCOUNT_TRADE_ALLOWED などは、ブローカー側の設定変更やメンテナンスによって運用中に変わる可能性があります。OnInit だけでなく、取引実行直前のチェック(OnTick 内など)でも利用することを推奨します。


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

プロのクオンツエンジニアとして強調しておかなければならないのが、実行環境の重要性です。MQL5でどんなに完璧なアルゴリズムを記述したとしても、それを自宅のPCや一般的な光回線で運用している限り、構造的な不利を背負うことになります。FXの自動売買において、プログラムから注文が出されてからブローカーのサーバーに届くまでの「ネットワーク遅延(レイテンシ)」は、1ミリ秒単位で収益性を削り取ります。

自宅PCの場合、OSの予期せぬアップデートや停電、Wi-Fiの不安定な挙動、そして物理的な距離による数ミリ秒〜数十ミリ秒の遅延が、本来得られるはずだった「有利な価格」での約定を妨げ、結果としてスリッページを増大させます。この「見えない損失」は、長期的に見ればEAのバックテスト結果を大きく下回る要因となります。ミリ秒単位の優位性を争うアルゴリズムトレードにおいて、取引サーバーに物理的に近い場所に位置する「専用VPS(仮想専用サーバー)」の導入は、もはやオプションではなく、勝つための必須装備と言っても過言ではありません。

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

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

コメント

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