1つの口座で複数のEAを同時に動かしたら、

どのポジションがどのEAのものか分からなくなった経験はありませんか。

マジックナンバーで注文を区別しないと、

EA同士が互いの注文を誤って数えてしまい、ポジション管理ロジックが誤動作します。

この記事では、重複しないマジックナンバーの採番設計から、

OrderMagicNumberで自分のEAの注文だけを数える実装まで、

実際に動くコード付きで解説します。

この記事で分かること
・マジックナンバーの管理が必要な理由
・番号が重複すると起きる誤動作の具体例
・重複しない採番の設計方法
・OrderMagicNumberで自分の注文だけを数える実装

なぜ複数EA運用でマジックナンバーの管理が必要か

まず、何が問題になるのかを確認します。

手動トレードやEA同士の注文が混ざる問題

同じ口座で手動トレードもしていると、OrdersTotal()が返す数には、

手動注文もEAの注文もすべて含まれてしまいます。

OrdersTotalだけでは自分のEAの数が分からない

「ポジションが2つまでなら新規エントリーする」という条件を、

OrdersTotal()だけで作ると、他のEAや手動注文の数まで数えてしまい、

意図した件数制限になりません。

既存記事群でもマジックナンバーを使ってきた実例

本サイトのEA記事では、これまでもOrderSendの引数として、

マジックナンバーを渡してきました。本記事では、その番号自体の設計を扱います。

マジックナンバーが重複するとどうなるか

番号が重複した場合の実害を確認します。

2つのEAが同じ番号を使うと起きる誤カウント

注意
・EA Aのポジション数を数えるつもりが、同じ番号のEA Bの注文も一緒に数えてしまう
・EA Aが「ポジション無し」と誤判定し、二重にエントリーする恐れがある

ポジション管理ロジックの誤動作につながる例

トレーリングストップやナンピン回数の管理を、

マジックナンバーで絞り込んで行っている場合、番号が重複していると、

他のEAのポジションまで操作してしまう危険があります。

デフォルト値0のまま運用する危険性

マジックナンバーを指定せずにOrderSendすると、既定値の0が使われます。

複数のEAを0のまま動かすと、すべてのEAの注文が同じ番号として扱われます。

重複しないマジックナンバーの設計方法

番号をどう決めるかという設計の考え方です。

戦略ID×通貨ペアIDで組み立てる考え方

MagicNumber = 戦略ID * 100 + 通貨ペアID

戦略ごとに1番・2番という番号を割り当て、通貨ペアごとにも番号を割り当てて、

掛け合わせれば、番号を見ただけで「どの戦略のどの通貨ペアか」が分かる、

自己説明的な番号になります。

命名・採番表を作っておく運用ルール

EAを増やすたびに、使用済みのマジックナンバーの一覧表を、

EAごとに記録しておくことをおすすめします。

スプレッドシート1枚で十分管理できます。

inputパラメーターとして外出しする

input int MagicNumber = 10105;

コード内に直接書き込まず、inputパラメーターにしておけば、

同じEAを複数の通貨ペアで動かす際にも、設定画面から番号だけ変更できます。

OrderMagicNumberで自分の注文だけを数える実装

実際に自分のEAの注文だけを数える処理を作ります。

OrderSelectループでの判定条件

if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)

通貨ペアとマジックナンバーの両方が一致する注文だけを対象にすることで、

他の通貨ペア・他のEAの注文を除外できます。

CountMyOrders関数として切り出す設計

この判定をCountMyOrders()という1つの関数にまとめておけば、

エントリー条件・決済条件のどこからでも同じ基準で件数を参照できます。

決済済み注文(履歴)も区別する場合の注意

勝率や損益を集計する場合は、OrderSelectのpool引数に、

MODE_HISTORYを指定し、決済済み注文の中からも、

マジックナンバーで絞り込む必要があります。

実際に動くコード全体

ここまでの要素をまとめた、実際に動くEAの一部です。

//+------------------------------------------------------------------+
//|                                    MagicNumberMultiEA.mq4         |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict

input int    StrategyID    = 1;
input double FixedLots     = 0.1;
input int    MaxPositions  = 1;

int MagicNumber;

int OnInit()
  {
   int symbolID = 0;

   if(_Symbol == "USDJPY") symbolID = 1;
   else if(_Symbol == "EURUSD") symbolID = 2;
   else if(_Symbol == "GBPUSD") symbolID = 3;

   MagicNumber = StrategyID * 100 + symbolID;

   Print("このEAのマジックナンバー: ", MagicNumber);
   return(INIT_SUCCEEDED);
  }

int CountMyOrders()
  {
   int count = 0;

   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)
            count++;
        }
     }
   return(count);
  }

int CountMyHistoryOrders()
  {
   int count = 0;

   for(int i = 0; i < OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)
            count++;
        }
     }
   return(count);
  }

void OnTick()
  {
   if(CountMyOrders() >= MaxPositions)
      return;

   // ここに実際のエントリー条件を追加する
   // 例: OrderSend(_Symbol, OP_BUY, FixedLots, Ask, 3, 0, 0,
   //              "MagicNumberMultiEA", MagicNumber, 0, clrBlue);
  }

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

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

  1. MetaEditorで新規EA「MagicNumberMultiEA」を作成し、上のコードを貼り付けてコンパイルする
  2. StrategyIDを1に設定してEURUSDチャートに適用する
  3. 別のStrategyID(例: 2)に変更した同じEAを、USDJPYチャートに適用する
  4. 「エキスパート」タブで、それぞれ異なるマジックナンバーが表示されることを確認する
  5. 片方のチャートで手動注文を出し、CountMyOrdersの戻り値が増えないことを確認する

よくあるエラーと注意点

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

OrderSymbolのチェックを忘れる落とし穴

マジックナンバーの一致だけで判定すると、同じEAを複数の通貨ペアで、

動かしたときに、他の通貨ペアの注文まで数えてしまいます。

OrderSymbol() == _Symbolの条件を必ず併記してください。

マジックナンバーの桁数が大きくなりすぎる

戦略IDや通貨ペアIDを増やしすぎると、マジックナンバーの桁数が大きくなり、

採番表を見ないと意味が分からなくなります。

2〜3桁の範囲に収まる設計を心がけてください。

MQL4とMQL5の違い

MQL4ではOrderMagicNumber()で取得しますが、

MQL5では選択した注文に対して、

PositionGetInteger(POSITION_MAGIC)を、

使う方式に変わります。

関数名は変わっても、考え方自体は共通です。

よくある質問

マジックナンバーについて、よくある疑問に回答します。

マジックナンバーは何桁までが上限ですか?

MQL4のマジックナンバーはint型なので、理論上は約21億まで指定できます。

ただし管理のしやすさを考えると、2〜5桁程度に収めることをおすすめします。

既に稼働中のEAの番号を後から変更できますか?

変更できますが、保有中のポジションのマジックナンバーは変わりません。

変更前に一度すべて決済するか、旧番号のポジションも対象に含める経過措置が必要です。

手動トレードと区別する方法はありますか?

手動で発注した注文のマジックナンバーは常に0になります。

EA側の番号を1以上にしておけば、0かどうかで手動注文かEAの注文かを区別できます。

【MQL】複数のEAを同じ口座で同時運用するときのマジックナンバーの使い方について解説してみた:まとめ

マジックナンバーは、複数のEAや手動トレードが同じ口座に混在しても、

注文を区別するための欠かせない仕組みです。

戦略IDと通貨ペアIDから番号を組み立てる設計にすれば、

重複を防ぎながら、番号を見ただけでどのEAの注文かが分かるようになります。

関連記事