MQL4プログラミングにおけるマジックナンバーとは?

マジックナンバーとは、MT4の注文がどのEA・ロジックから実行されたかを識別するための番号です。

MT4での運用は1つの口座で1つのEAだけを使用するとは限りません。
複数のEAを使用する場合や、EAによるシステムトレードと手動の裁量トレード組み合わせて行う場合など様々なケースが有ります。
そのため現在保有中のポジションが、どこからの注文であるかを適切に判別する必要があります。

ポジションを判別するには他にも注文成功時に返されるチケット番号を記録しておき、使用する方法があります。
しかしチケット番号を変数に保存して利用する方法は、MT4の再起動時や、EAのパラメータ変更時に変数が初期化されてチケット番号の情報を失う可能性があります。
変数に保存する以外にも、外部のcsvファイルなどに書き出す方法や、グローバル変数として保存する方法も考えられますが、作成に手間がかかりることや、ユーザーによって削除される危険性もることから良い方法ではないでしょう。

マジックナンバーの設定方法


マジックナンバーを指定するには、OrderSend関数の第9引数magicに任意の数値を指定します。

int OrderSend(
string symbol,
int cmd,
double volume,
double price,
int slippage,
double stoploss,
double takeprofit,
string comment=NULL,
int magic=0,
datetime expiration=0,
color arrow_color=clrNONE
);


マジックナンバーの注意点



特別な理由がない限りマジックナンバーには0以外の数値を指定しましょう。
これは手動でのエントリー時に設定されるマジックナンバーが0のためです。
magicは省略可能な引数ですが、省略すると0が設定されてしまうため、必ず省略せず指定しましょう。


マジックナンバーは必ず外部パラメータとしてユーザーが自由に設定できるようにしましょう。
固定の数値を使用した場合には、他のEAとマジックナンバーが被る可能性があります。

1つのEAで複数のマジックナンバーを使用する場合もあります。
このとき使用する全てのマジックナンバーを外部パラメータにすれば問題はありません。
マジックナンバーのパラメータを1つだけ用意し、その数字を基準にプログラム内部で複数のマジックナンバーを使用する場合は注意が必要です。
この場合はどのようなルールによってマジックナンバーを生成し使用しているかをユーザーへ伝える必要があります。
この作業を怠るとマジックナンバーの重複が発生してユーザーに損害が発生する可能性があります。

サンプル


入力された外部パラメータの数値を元にマジックナンバーを指定して発注するサンプルです。
チャートにEAを設定すると一度のみ買いエントリーが実行されます。

#property strict

extern int MagicNumber = 123456; //マジックナンバー
extern double Lots = 0.1; //取引数量
extern int Slippage = 1; //スリッページ

bool isEntry = true;

void OnTick(){
if(isEntry == true){
if(OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, NULL, MagicNumber) == -1){
Print("OrderSend Error ", GetLastError());
}
else{
isEntry = false;
}
}
}
TwitterでシェアFacebookでシェアGoogle+でシェアはてなブックマークに追加

TOPへ