MQL4→MQL5 差分ノート
MQL4のコードをMQL5に書き直すときに、実際に手が止まった箇所を集めた一覧。理屈上の違いではなく、自社の変換作業で実際に踏んだものだけを載せている。影響度は「書き換えの手間」ではなく「気づかずに動かしたときの怖さ」で付けた。
高注文が「関数呼び出し」から「構造体」に変わる
OrderSendなど売買系の関数は、MQL5ではMqlTradeRequest/MqlTradeResult構造体を使う形に一新される。引数の並べ替えでは済まない。
実測:自社177本の変換で、最も書き換え量が多かった箇所
高時間足の型が int → ENUM_TIMEFRAMES
iBarShift・iOpenなど時間足を渡す関数はすべて対象。MQL4の「分数の整数」をそのまま渡すコードはコンパイルエラーになる。
実測:時間足の名前を返す関数を「MQL4系はint・MQL5系はENUM」の2系統で持つ実装が複数のツールに残っている
高ボタンとパネルの重なりでMT5だけクリックできない
MT4はボタンを最優先で拾うが、MT5はボタンの上を横切る線を先に拾う(線から約7ドット以内)。目盛り線とボタンを両方持つパネルで発生。
実測:目盛り線付きパネルで MT5 0/10・MT4 10/10 のクリック失敗を確認。OBJPROP_ZORDER=10で解消し、作り直し後は 10/10
高OnCalculateの戻り値の意味が変わる
MQL5は戻り値を「計算済みの本数」として扱う。0を返すと、そのインジケーターをiCustomで読んでいる側が値を取れなくなる。
実測:ある日から自作インジのiCustom呼び出しが値を返さなくなり、原因の切り分けに時間を要した
中EMPTY定数が無い
配列の「未設定」判定に使っていたEMPTYはMQL5に存在しない。代わりの値を自分で決めて置き換える必要がある。
中IndicatorGetIntegerが存在しない
インジケーターのバッファ数などを調べる関数が無い。ChartIndicatorGet系の別APIに置き換える。
中ChartGetDoubleがオフラインのチャートで0を返すことがある
CHART_PRICE_MAX/CHART_PRICE_MINを使って本数や範囲を自動計算する処理は、上限と逃げ道を用意しておく必要がある。
中部分決済のチケット番号の扱いが違う
MQL4は残数量が元のチケット番号のまま。MQL5は部分決済すると新しいチケット番号になる。ポジション管理を番号で追っていると取り違える。
低開発環境の罠:日本語・空白のファイル名でログが出ない
MetaEditor 5は、コンパイル対象が日本語や空白を含むパスにあると、ログファイルそのものを作らないことがある。英数字だけの一時フォルダに写してからコンパイルする。
この一覧は随時追加します。書いてあるのは、実際に手を動かして確認できたものだけです。
今日はどこを見ればいいか。
ドル円とユーロドルの主要ライン・予想高値安値を、平日の朝に図1枚にまとめています。
朝刊を見る→