MT4からMT5へのコード移植は一見単純に思えるかもしれませんが、内部仕様やAPIの違いにより予期せぬ動作やバックテストエラーが起こることがあります。特に
MT4とMT5の移植で何が変わるのか
MT4ではインジケーター関数が直接値を返すスタイルですが、MT5ではiMA
などの多くの関数はまずハンドルを作成し、CopyBuffer
でデータを取得するか、CiMA
クラスで管理する形に変わっています。これが移植時の最も大きなハードルです。
たとえば、以下のMT4コードはシンプルに書けます。
double ema = iMA(Symbol(), 0, 200, 0, MODE_EMA, PRICE_CLOSE, 0);
一方、MT5ではCiMAオブジェクトのCreate
で初期化し、Main(0)
などで値を取得する必要があります。
MT5でのEMAフィルターの正しい書き方
MT5では以下のように構成します。
#include <Indicators\Trend.mqh> CiMA g_ema; int OnInit() { if(!g_ema.Create(_Symbol, PERIOD_H1, 200, 0, MODE_EMA, PRICE_CLOSE)) { Print("❌ EMA作成失敗"); return INIT_FAILED; } return INIT_SUCCEEDED; } bool IsBuyDirectionByEMA() { double ema = g_ema.Main(0); double close = iClose(_Symbol, PERIOD_H1, 0); return (close > ema); }
重要:EAやインジケーターでOnInitの戻り値がINIT_FAILED
になるとバックテストそのものが中止されます。ログに「バックアップで失敗」と出る場合、この初期化処理の失敗が主な原因である可能性があります。
よくある原因:EMAの初期化失敗
- パラメータが未定義(たとえばEMA方向判定時間足などが未設定)
- OnInitの呼び出し前にg_emaを使っている
- インジケーターの最大バー数が制限されている
例えば次のような設定を事前に明示しておく必要があります。
input ENUM_TIMEFRAMES tfFilter = PERIOD_H1; input int emaPeriod = 200;
これにより、Create
関数に渡す引数が確定し、初期化エラーを防ぐことができます。
デバッグのヒント:Print文を活用しよう
バックテストや実行中にPrint関数を挿入し、変数の中身やインジケーター生成の成否を確認することが、問題の特定にとても有効です。
if(!g_ema.Create(...)) { Print("❌ g_ema作成失敗: ", GetLastError()); }
GetLastErrorでエラーコードを確認すれば、より具体的なトラブルシューティングが可能になります。
まとめ:MT5のEMA実装で注意すべき点
MT4からMT5への移植では、インジケーターの扱い方が根本的に異なるため、特にEMAのようなフィルター系ロジックではCiMAやCreate関数、ハンドル管理の理解が重要になります。エラーを防ぐには次のポイントを守るとよいでしょう。
- すべてのパラメータを
input
または明示的に設定 - 初期化チェック(Create関数の結果確認)
- Printデバッグの活用
トレンドフィルターはロジックの中核となる要素ですので、確実に動作するよう丁寧に実装・確認していきましょう。

こんにちは!利益の管理人です。このブログは投資する人を増やしたいという思いから開設し運営しています。株式投資をメインに分散投資をしています。
コメント