はじめに
EAを使っているとマジックナンバーと言うものがありますが、そもそもマジックナンバーって何なのか?特に意識しなくてもEA作れちゃうけど必要性は?どういった感じに使っていくの?について解説します。
マジックナンバーとはいったい何なのか、どういった時に必要でどういった時に不要なのか等もわかるようになると思いますので是非参考にしてみてください。
マジックナンバーとは?
まず、EAを使っていると必ず耳にするマジックナンバーですが開発者の方もそうでない方もざっくりとどういった物か理解しておきましょう。めちゃくちゃ簡単です。
マジックナンバーを身近な物で例えると、クリーニング屋さんの服につけるタグです。AさんとBさんがクリーニング屋さんに凄く似たスーツを預けたとします。数日後Bさんがスーツを受け取る時、もしタグが無いとどうなるでしょう?Aさんが預けたスーツを間違ってBさんに渡してしまう可能性がありますよね!クリーニング屋さんのタグは誰のものかを判別するためにあります。こんな感じです。
このクリーニング屋さんのスーツ=タグを、EAのマジックナンバーに置き換えると、ポジション=マジックナンバーという感じになります。
どのEAがエントリーして持ったポジションなのかを見分けるためにマジックナンバーというものがあるんですね。これが大前提です!
マジックナンバーの概要
では、もう少し具体的にマジックナンバーについて確認していきましょう。
MT4ではマジックナンバーに設定できる値の最大(MAX)値は2147483647です。これを超える数値を設定しようとしても、2147483647になってしまいます。なのでマジックナンバーを自分で設定する場合はこの範囲内で設定しましょう。
EAは、新規注文をする際にEA開発者が(OrderSend()関数で)マジックナンバーを『このEAのマジックナンバーは77777だ!』って簡単に設定する事ができます。開発者でなくても市販で販売されているEAであれば基本的にマジックナンバーはパラメータ設定で設定できます。
ちなみに、裁量トレードをした場合のポジションは強制的にマジックナンバーが0となります。
このマジックナンバーですが、必要なの?何番に設定したらいいの?といった疑問について考えていきます。
マジックナンバーって必要?
そもそも、マジックナンバーは必要なのか?結論としては、必須ですが以下の1つだけ例外があります。
※もし複数のEAを稼働させる場合は、複数のFX口座でそれぞれ動かす
この場合、マジックナンバーは不要です。
なのでマジックナンバーは考えず手っ取り早くEAを動かしたい(裁量トレードもしたい)ってなった場合は、
- EA①のFX口座
- EA②のFX口座
- 裁量トレード用のFX口座
という風にFX口座をわけるとOKです。
※ MT4・EAが使える国内FX業者の一覧はこちら
『裁量トレード』もわけているのは、裁量トレードもマジックナンバーが関連してくるからです。前述した通り、裁量トレードのマジックナンバーは0です。
EAを動かすFX口座と同じFX口座で裁量トレードした場合、マジックナンバーを設定していない・見ないEAが裁量トレードのポジション(マジックナンバー0のポジション)も決済タイミングがきたら勝手に決済してしまうからです。
※裁量トレードしている時は、EAの稼働を停止するのであれば問題ありません
FX口座をわけると、A社のMT4で動かしているEAがさすがにB社でトレードしているポジションを決済しちゃうなんてことは無いですよね。
ただ1つの口座で複数のEAを稼働したり裁量トレードをする場合、EA①がEA②や裁量トレードのポジションを勝手に決済したりするのでマジックナンバーは必須になってきます。
マジックナンバーを詳しく理解する
複数のEAを1つの口座で稼働させる場合、EAが別のEAのポジションを決済してしまわないように、マジックナンバーを用いてどのEAのポジションなのかを判別する必要があります。実際にEAを2つ動かしていることを想定しながら考えてみましょう。

例えばこんな感じで、左のEA①と右のEA②別々のEAを1つのFX口座で稼働させており、左のEA①が新規エントリーしてポジションを持っている状態とします。
ここで、右のEA②がたまたま決済タイミングだとしたらどうでしょう?左のEA①のポジションなのに右のEA②が決済してしまう・・・なんていう可能性がありますよね。EA①のタイミングで新規エントリーしたのに、EA②のタイミング的には決済だった場合、EA①の新規エントリーでポジションを持った瞬間、EA②によって勝手に決済されてしまうなんて事も起きて困ります。どちらのEAが持ったポジションなのかを分別できなければ、EA①がEA②のポジションを勝手に決済してしまうんです。
※EA①とEA②でFX口座をわけちゃうとさすがに別のFX口座のポジションまでは干渉できないので、問題がなくなるわけですね
さて、この問題を1つの口座内でどうするか・・・といった時に解決してくれるのがマジックナンバーです。
各ポジションにマジックナンバーを設定し、EA①のポジションなのかEA②のポジションなのかを判別していきます。
EAでマジックナンバーを設定する方法
まず、EA(左側のEA①)を作る際は新規エントリー時にマジックナンバーを設定してあげましょう。
OrderSend( // 新規エントリー注文
NULL, // 通貨ペア
ea_order_entry_Type, // オーダータイプ[OP_BUY / OP_SELL]
Lot, // ロット(FXTFは1=10Lot)
ea_order_entry_price, // オーダープライスレート
20, // スリップ上限
order_stop_price, // ストップレート
order_good_price, // リミットレート
orderComment, // オーダーコメント
999, //★マジックナンバー★
0, // オーダーリミット時間
order_Color // オーダーアイコンカラー
);
マジックナンバー「999」を設定したい場合はこんな感じにします。これだけでEAがポジションを持った際に、マジックナンバーが設定されます。
自作ではないEAのマジックナンバーを設定する際は殆どの確率で設定にありますのでそこを参照・設定してあげましょう。設定や取説にマジックナンバーの記載がない場合は作者に問い合わせましょう。

マジックナンバーの確認方法
EAのマジックナンバーをちゃんと設定していた場合、MT4上でも簡単に確認する事ができます。実際に、EAがポジションを持った際のマジックナンバーをMT4で見てみましょう。
マジックナンバーの確認方法は簡単で、以下イメージのように確認したいポジションにマウスカーソルをあてます。

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

下側のポジションのマジックナンバーを見てみると、マジックナンバーは「111」となっています。「111」は右側のEA②で設定したものなので、このポジションはEA②のものだという事がわかります。
EAの開発としては、これでマジックナンバー対応は「完了」!
というわけではないですよ!先ほど目でみたようにEA開発時もマジックナンバーはちゃんと見てエントリーや決済などをしないといけないですよね。
決済する際もマジックナンバーは見ないといけない
今までの解説ではポジションにマジックナンバーを持たせているだけなので、決済時にもマジックナンバーを見ないとマジックナンバー「111」「999」に限らず最新のポジションを決済しちゃいます。なので決済時にもマジックナンバーを見て違うEAのマジックナンバーであれば決済しないように作る必要があります。
OrdreSelect()関数でマジックナンバーを確認する事ができます。
あとは現在のポジション数分ループして、各ポジションのマジックナンバーを見て、当該EAのポジションがなければ何もしない・当該EAのポジションがあれば決済するという作りにしないといけないので結構めんどくさい感じですね。
for(int order_cnt = 0; order_cnt < OrdersTotal(); order_cnt++){
bool OrderKekka = OrderSelect(order_cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber() == 999 && OrderKekka == true){
OrderKekka = OrderClose(OrderTicket(),OrderLots(),・・・・);
}
}
簡単にマジックナンバーを考慮した決済処理を書くとしたらこんな感じです。
エントリーする際もマジックナンバーは見ないといけない(単ポジの場合)
あとは複数のポジションを持たないEAの場合は、新規エントリー時に既にポジションを持っているのかどうかを確認する必要がありますね。
int total = OrdersTotal();
bool hoji=false;
if(total > 0){
for(int cnt = 0; cnt < total; cnt++){
OrderKekka = OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber() == 999){
//ポジション保持中
hoji=true;
}
}
}
if(hoji==false){
//新規注文する
OrderSend(・・・・・
}
こうしておかないと、別のEAのポジションなのにポジションを既に持ってるからエントリーしないなんて事が起きちゃいます。
作り方はいくらでもあると思いますが、単純にポジションがある場合は全てのポジションのマジックナンバーを確認したいのでこんな感じでループさせて見てあげればOKです。
さいごに
以上が、『EAのマジックナンバーの考え方』となります。
マジックナンバーは
という事です。マジックナンバーを使用しないとポジションが良からぬ所で決済されてしまったりちゃんとエントリーしなかったりという問題が多発すると思って下さい。
マジックナンバーの必要性を理解して、ぜひEAの運用に役立てて頂けたらと思います。
※ EAのサンプルソースを一覧表にまとめました
※EA作成依頼はこちら
※オンラインレッスンやってます
コメント
解説ありがとうございます。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のマジックナンバーがついているポジションだけ処理するといった感じになります。