【MQL4】EAのマジックナンバーとは?仕組み・必要性・設定方法を初心者向けに徹底解説

EAのマジックナンバーの仕組みと設定方法をデグーキャラクターが解説するアイキャッチ画像
EAを自作してみよう
記事内に商品プロモーションを含む場合があります

「EAを複数動かしたら、別のポジションまで決済された…」
「裁量とEAを併用したら、意図しない注文に干渉した」
こうしたトラブルは、EAが自分の注文を正しく識別できていないときに起こることがあります。

マジックナンバーは、どのEAが出した注文・ポジションなのかを識別するためのIDです。
複数EAや裁量トレードを同じ口座で併用する場合は、EAごとに識別して処理する設計が重要になります。

📘 この記事で分かること
  • マジックナンバーの意味と役割
  • 複数EA・裁量併用で識別が重要になる理由
  • OrderSend()でマジックナンバーを設定する方法
  • OrderSelect()後にOrderMagicNumber()で判別する方法
  • 決済・新規エントリー時のポジション管理
  • 既存EAでのマジックナンバー設定・確認方法

この記事では、初心者でも理解できるように、マジックナンバーの仕組み・必要性・設定方法を図解+MQL4サンプルコード付きで解説します。
EA利用者向けの設定方法と、EA開発者向けの実装方法を分けて確認していきます。

EAのマジックナンバーとは?ポジションを識別するID

マジックナンバーは、EAが注文やポジションを識別するために使う番号です。EA開発者だけでなく、複数のEAを同じ口座で使う人も、役割を知っておくと設定ミスを避けやすくなります。

身近な例でいえば、クリーニング店の「引換タグ」のようなものです。どのお客さん(どのEA)の持ち物(注文・ポジション)なのかを区別する目印がマジックナンバーです。

MT4のマジックナンバーの基本仕様

MT4では、EAが新規注文を出すときにマジックナンバーを付け、あとからその番号を参照して自分の注文かどうかを判別できます。

OrderSend()のmagic引数は整数(int)で扱います。通常は管理しやすい正の整数を使い、同じ口座で同時に動かすEA同士で番号が重複しないように決めれば十分です。

EAを自作する場合はOrderSend()のmagic引数で設定します。既存EAでは、マジックナンバーが外部パラメータとして用意されていることが多いため、EAの設定画面や取扱説明書を確認してください。

MT4で手動(裁量)注文したポジションは、通常Magic=0として扱われます。そのため、EA側でMagic=0まで処理対象にすると、裁量ポジションへ干渉する可能性があります。

次に、マジックナンバーが必要になる場面と、複数EAでの使い分けを確認します。

マジックナンバーは必要?|複数EAでは分けて管理する

1つの口座で1つのEAだけを動かし、そのEAが他の注文へ干渉しない設計なら、マジックナンバーを使わなくても運用できる場合があります。

一方、同じ口座で複数EAを動かす場合や、EAと裁量トレードを併用する場合は、EAごとに異なるマジックナンバーを設定し、処理時にもその番号を確認する設計が基本です。

同じ口座で複数EAを運用する場合は、EAごとに重複しないマジックナンバーを設定する

重要なのは、番号を付けることだけではありません。EA側で注文を処理するときに、OrderSelect()で対象注文を選択し、OrderMagicNumber()で自分のEAの注文か確認する必要があります。

また、同じマジックナンバーを複数通貨で使うEAでは、OrderSymbol()も併用して通貨ペアを絞ると、別通貨のポジションまで処理する事故を防ぎやすくなります。

EAごとに口座自体を分ける方法でも干渉は避けられますが、1つの口座で複数EAを管理するなら、マジックナンバーによる識別を実装しておく方が管理しやすくなります。

マジックナンバーが無いと何が起きる?

複数のEAを1つの口座で稼働させる場合、EAが注文を識別せずに処理すると、別のEAのポジションを誤って決済することがあります。
これを避けるために、マジックナンバーなどを使って「どのEAのポジションか」を判別します。

実際にEAを2つ動かしていることを想定しながら考えてみましょう。

マジックナンバー対応されていないEAの問題点

2つのEAが1つの口座で稼働している状態を示す図。マジックナンバーが無い場合にポジション判別ができなくなる問題を説明。

例えばこんな感じで、左のEA①と右のEA②別々のEAを1つのFX口座で稼働させており、左のEA①が新規エントリーしてポジションを持っている状態とします。

ここで、右のEA②がたまたま決済タイミングだとしたらどうでしょう?左のEA①のポジションなのに右のEA②が決済してしまう・・・なんていう可能性がありますよね。EA①のタイミングで新規エントリーしたのに、EA②のタイミング的には決済だった場合、EA①の新規エントリーでポジションを持った瞬間、EA②によって勝手に決済されてしまうなんて事も起きて困ります。

EA側で「自分のポジションだけを処理する」判定がなければ、EA①がEA②のポジションを決済対象にしてしまう可能性があります。
口座自体を分ければ相互干渉は起きませんが、同一口座で運用する場合は注文識別の実装が重要です。

さて、この問題を1つの口座内で解決するにはどうしたら・・・といった時に解決してくれるのがマジックナンバーです。

そこで、注文時にEAごとのマジックナンバーを設定し、決済・変更・新規判定の際にその番号を参照してEA①とEA②のポジションを区別します。

⚙️ EAでマジックナンバーを設定する方法

マジックナンバーの使い方は、EAを自作する場合と既存EAを使う場合で少し考え方が異なります。 ここでは、EA開発での基本的なマジックナンバーの使い方を整理します。

マジックナンバーの使い方(EA開発での基本パターン)

EAを自作する場合

まず、EA(左側のEA①)を作る際は新規エントリー時にマジックナンバーを設定してあげましょう。

input int MagicNumber = 999;

int ticket = OrderSend(NULL,ea_order_entry_Type,Lot,ea_order_entry_price,20,order_stop_price,order_good_price,orderComment,MagicNumber,0,order_Color);

この例では外部パラメータのMagicNumber=999をOrderSend()へ渡しています。注文時に番号を付けたら、決済・変更・保有判定でも同じ番号を参照します。

手持ちEAのマジックナンバーを設定する場合

自作ではないEAでは、マジックナンバーがパラメータ設定に用意されていることが多いです。同じ口座で複数EAを使う場合は、EAごとに重複しない値へ変更します。設定項目や取扱説明書に記載がない場合は、作者・販売元へ確認してください。

MT4のEA設定画面にあるマジックナンバー入力欄のスクリーンショット。任意の番号を設定可能。

MT4でマジックナンバーを確認する方法【初心者向け】

EAのマジックナンバーをちゃんと設定していた場合、MT4上でも簡単に確認する事ができます。実際に、EAがポジションを持った際のマジックナンバーをMT4で見てみましょう。

マジックナンバーの確認方法は簡単で、以下イメージのように確認したいポジションにマウスカーソルをあてます。

MT4でポジションにマウスカーソルを当て、エキスパートIDからマジックナンバーを確認する手順を示した画像。

すると、こんな感じで一番右側にエキスパートIDが表示されます。エキスパートID「999」がEAのマジックナンバーです。よって、上側のポジションは左側のEA①という事がわかります。

下側のポジションはどうでしょうか。

複数EAのポジションをMT4で確認し、それぞれ異なるマジックナンバーで識別している様子を示した画像。

下側のポジションのマジックナンバーを見てみると、マジックナンバーは「111」となっています。「111」は右側のEA②で設定したものなので、このポジションはEA②のものだという事がわかります。

EAの開発としては、これでマジックナンバー対応は「完了」!

というわけではないですよ!先ほど目でみたようにEA開発時もマジックナンバーはちゃんと見てエントリーや決済などをしないといけないですよね。

【開発者向け】決済する際もマジックナンバーは見ないといけない

今までの解説ではポジションにマジックナンバーを持たせているだけなので、決済時にもマジックナンバーを見ないとマジックナンバー「111」「999」に限らず最新のポジションを決済しちゃいます。なので決済時にもマジックナンバーを見て違うEAのマジックナンバーであれば決済しないように作る必要があります。

OrderSelect()で注文を選択し、その後にOrderMagicNumber()でマジックナンバーを取得します。

保有中の注文をループし、OrderSelect()に成功した注文だけを対象に、通貨ペアとマジックナンバーを確認します。これにより、同じ口座にある別EA・別通貨のポジションを決済対象から外せます。

EAが複数のポジションを持つ可能性がある場合、各ポジションのマジックナンバーを参照して判別します。

for(int i=OrdersTotal()-1;i>=0;i--){
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){continue;}
   if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber){continue;}
   if(OrderType()!=OP_BUY && OrderType()!=OP_SELL){continue;}

   double closePrice=(OrderType()==OP_BUY)?Bid:Ask;
   if(!OrderClose(OrderTicket(),OrderLots(),closePrice,20,clrNONE)){Print("OrderClose error=",GetLastError());}
}

【開発者向け】エントリーする際もマジックナンバーは見ないといけない

1EAにつき1ポジションだけ持つ設計なら、新規エントリー前に「このEA自身のポジションをすでに持っているか」を確認します。

bool hasPosition=false;

for(int i=0;i<OrdersTotal();i++){
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){continue;}
   if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber){continue;}
   if(OrderType()==OP_BUY || OrderType()==OP_SELL){hasPosition=true; break;}
}

if(!hasPosition){
   // 新規注文する
}

口座全体のOrdersTotal()だけで判断すると、別EAのポジションがあるだけで「自分のEAも保有中」と誤判定することがあります。通貨ペアとマジックナンバーを確認して、自分のEAのポジションだけを数えるのがポイントです。

EAの仕様によって管理方法は変わりますが、基本は「OrderSelect()成功 → Symbol確認 → Magic確認 → OrderType確認」の順で、自分が管理するポジションだけを対象にします。

❓ マジックナンバーに関するFAQ

💬 マジックナンバーに関するよくある質問をまとめました。

マジックナンバーは必ず設定しないといけませんか?

同じ口座で複数EAを動かしたり、裁量と併用する場合は、EAごとに異なるマジックナンバーを設定して識別する方法が基本です。 1つの口座で1つのEAだけを使う場合は、EAの設計によってはマジックナンバーを使わなくても運用できます。

裁量トレードのポジションにはマジックナンバーが付きますか?

MT4で手動(裁量)注文したポジションは、通常Magic=0として扱われます。 EA側でMagic=0を処理対象にしている場合は、裁量ポジションへ干渉しないよう確認してください。

EAを複数同時に動かすときのマジックナンバーの決め方は?

同じ口座で同時に動かすEA同士で重複しない番号を割り当てるのが基本です。 連番(1001、1002、1003…)など、自分で管理しやすいルールを決めておくと分かりやすくなります。

マジックナンバーを変えるとバックテスト結果は変わりますか?

マジックナンバーの数値そのものは、通常は売買ロジックの条件ではありません。 ただし、EAがマジックナンバーを使って保有判定・決済対象を絞っているため、設定の重複やコード側の不整合があるとバックテスト結果へ影響する場合があります。

マジックナンバーを設定し忘れた場合どうなりますか?

Magic=0のままでもEAの設計によっては動作しますが、複数EAや裁量を併用する環境では注文の識別が曖昧になることがあります。 EAごとに番号を分け、コード側でもOrderMagicNumber()を確認する設計にしておくと管理しやすくなります。

✅ まとめ|複数EAではマジックナンバーで注文を識別する

マジックナンバーは、「どのEAが出した注文・ポジションなのかを識別するためのID」です。同じ口座で複数EAを運用する場合や、EAと裁量を併用する場合は、EAごとに番号を分けて管理すると注文を区別しやすくなります。

複数EAでは「番号を分ける」だけでなく、EA側でMagicを確認して処理対象を絞ることが重要です。

EAを自作する場合は、OrderSend()でマジックナンバーを設定し、注文を扱うときはOrderSelect()の成功を確認してからOrderMagicNumber()を参照します。同じ番号を複数通貨で使う場合はOrderSymbol()も併用すると、対象をさらに絞り込めます。

  • ✔ 同じ口座で動かすEAごとにマジックナンバーを分ける
  • ✔ 決済・変更・保有判定ではOrderMagicNumber()を確認する
  • ✔ 必要に応じてOrderSymbol()・OrderType()も合わせて確認する
  • ✔ 裁量併用時はMagic=0の扱いに注意する

この基本を押さえておくと、EA同士のポジション取り違えや誤決済を防ぎやすくなります。特に複数EAへ拡張する前に、注文識別の処理を確認しておきましょう。

コメント

  1. フープさんのアイコン フープ より:

    解説ありがとうございます。EA初心者です。
    マジックナンバーの設定に関して、複数のEAの意味が曖昧で理解できずに困ってましたがようやく少し分かってきました。

    あるEAが複数の通貨に対応しているので、複数のチャートに適用しているのですが、それの場合も複数のEA(つまりマジックナンバーを変える必要がある)に該当するのかという問題。
    多分ですが、同じ通貨に対して複数割り当てる場合に問題になるのかなと理解しました。なので、通貨が異なる場合は同じ番号でもよいという理解で相違ないでしょうか?

    逆に言うと、同じEAでも同じ通貨に割り当てれば(例えば、15分足と1時間足のチャートを立てて同じEAを入れた場合など)干渉して問題になる??んですかね。

    • りょうさんのアイコン りょう より:

      はじめまして、フープさん。
      『同じ通貨に対して複数割り当てる場合に問題になる』という認識でOKです。
      同様に、『同じEAでも同じ通貨に割り当てれば(例えば、15分足と1時間足のチャートを立てて同じEAを入れた場合など)干渉して問題になる』という認識でOKです。

      これは、EAがエントリーや決済する際『どの通貨ペアを決済するか』というのをEA開発者があらかじめ設定できるのですが、『どの時間足でエントリーしたポジションを決済するか』という設定はできないため干渉してしまいます。
      そういった場合、1時間足でエントリーしたポジションだとわかるようマジックナンバーを11111を設定し、15分足のEAのマジックナンバーを別の55555とかに設定してあげると、EAがちゃんとマジックナンバーを見る作りになっていれば1時間足のEAは11111のマジックナンバーがついているポジションだけ処理し、15分足のEAは55555のマジックナンバーがついているポジションだけ処理するといった感じになります。

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