MQL4MQL5 EA(エキスパートアドバイザー) EA の基本・安全対策
マジックナンバーで自分の EA の注文を区別したい
結論:注文にマジックナンバーを付け(MQL4 は OrderSend の引数、MQL5 は trade.SetExpertMagicNumber)、ポジションを扱うときに同じ番号のものだけを選びます。
考え方
同じ口座で複数の EA を動かしたり、手動でも取引したりする場合、EA が「自分の注文」を見分けられないと、ほかの EA のポジションを決済してしまいます。マジックナンバーは注文に付ける番号で、EA ごとに違う番号を付け、ポジションを数える・決済するときにその番号で絞り込みます。
- パラメーターでマジックナンバーを決める(EA ごと・通貨ペアごとに違う番号にする)
- 注文するときにマジックナンバーを付ける
- ポジションを扱うときは、通貨ペアとマジックナンバーの両方が一致するものだけを対象にする
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// マジックナンバーで自分のポジションを区別する EA のひな形(MT4)
input int InpMagic = 20241001; // マジックナンバー(EA ごとに変える)
input double InpLots = 0.1; // ロット
// この EA のポジションか
bool IsMine()
{
return OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic && OrderType() <= OP_SELL;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
int mine = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && IsMine())
mine++;
if(mine == 0) // 自分のポジションがないときだけ(実際は売買条件も入れる)
if(OrderSend(_Symbol, OP_BUY, InpLots, Ask, 30, 0, 0, "MyEA", InpMagic) < 0)
Print("注文失敗 error=", GetLastError());
}MQL5(MT5)
// マジックナンバーで自分のポジションを区別する EA のひな形(MT5)
#include <Trade\Trade.mqh>
input ulong InpMagic = 20241001; // マジックナンバー(EA ごとに変える)
input double InpLots = 0.1; // ロット
CTrade trade;
// 選択中のポジションがこの EA のものか
bool IsMine()
{
return PositionGetString(POSITION_SYMBOL) == _Symbol && (ulong)PositionGetInteger(POSITION_MAGIC) == InpMagic;
}
int OnInit()
{
trade.SetExpertMagicNumber(InpMagic); // 以後の注文にこの番号が付く
return INIT_SUCCEEDED;
}
void OnTick()
{
int mine = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
if(PositionGetTicket(i) > 0 && IsMine())
mine++;
if(mine == 0) // 自分のポジションがないときだけ(実際は売買条件も入れる)
if(!trade.Buy(InpLots, _Symbol, 0, 0, 0, "MyEA"))
Print("注文失敗 ", trade.ResultRetcodeDescription());
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- 同じ EA を複数の通貨ペアで動かすときも、通貨ペアの条件(_Symbol)と組み合わせれば同じマジックナンバーで区別できます。
注意点
- 手動の注文のマジックナンバーは 0 です。EA には 0 以外の番号を使います。
このコードで使っている関数
あわせて読みたいレシピ
「EA の基本・安全対策」のレシピ一覧
- マジックナンバーで自分の EA の注文を区別したい
- 特定の口座番号でだけ EA を動かしたい
- EA に有効期限を付けたい
- バックテスト中かどうかで処理を分けたい
- ティックが来なくても一定時間ごとに処理したい












