最終更新: 2026年06月
「EAを自作したい」と思ったとき、最初の壁がプログラミングの学習だ。
MQL5はC++に近い構文を持つプログラミング言語で、「プログラミング未経験には無理」と思われがちだ。実際には、最初のシンプルなEAを動かすまでに必要な知識は想定より少ない。
本記事では、MQL5の基本構造から最初のEAの骨格を作るまでの流れを解説する。「動く一歩」を踏み出すことが目的だ。
MQL5とMQL4の違い
まず整理しておく。
- MQL4: MT4用の言語。独自仕様が強く、処理速度やオブジェクト指向の機能が限られる
- MQL5: MT5用の言語。C++ライクな構文で、オブジェクト指向対応、並列処理可能
MQL4で書いたEAはMT5ではそのまま動かない。MT5でEAを作るならMQL5で書く必要がある。
ただし、MQL4の知識があればMQL5への移行は比較的スムーズだ。基本的な考え方は共通している。
開発環境:MetaEditorの準備
MT5をインストールすると、付属の統合開発環境「MetaEditor」が同時にインストールされる。MT5のメニューから「ツール」→「MetaEditor」、またはF4キーで起動できる。
MetaEditorには:
- コードエディタ(シンタックスハイライト付き)
- コンパイラ(コードをEAファイルに変換)
- デバッガ
- 内蔵のMQL5リファレンス(関数一覧・使い方)
が含まれている。外部の開発環境は不要で、すぐに開発を始められる。
MQL5 EAの基本構造
MQL5のEAには、必ず含まれる3つのイベント関数がある。この3つを理解すれば、EAの骨格は完成する。
//+------------------------------------------------------------------+
//| 最もシンプルなEAの骨格 |
//+------------------------------------------------------------------+
// EA起動時に一度だけ実行される
int OnInit()
{
// 初期設定をここに書く(例:変数の初期化)
Print("EA起動完了");
return(INIT_SUCCEEDED);
}
// ティック(価格更新)ごとに実行される
void OnTick()
{
// トレードロジックをここに書く
// 「この条件なら買う」「この条件なら売る」など
}
// EA終了時に一度だけ実行される
void OnDeinit(const int reason)
{
// 終了処理をここに書く(例:保存・クリーンアップ)
Print("EA終了");
}
この3関数が全てのEAの骨格だ。
OnInit関数
EAをチャートにアタッチしたとき、または再起動時に一度だけ実行される。
ここで行うこと:
- パラメータの初期値設定
- 使用するインジケーターの初期化
- データの整合性チェック
OnTick関数
ティック(価格の更新)が発生するたびに実行される。これがEAの「心臓部」だ。
エントリー条件のチェック、ポジション管理、決済条件のチェックは全てここに書く。
注意点:OnTick関数内の処理が重すぎると、次のティックに間に合わなくなる可能性がある。計算量の多い処理はOnInit内で事前計算するか、キャッシュを使う設計が望ましい。
OnDeinit関数
EAをチャートから外すとき、または終了時に一度だけ実行される。
ここで行うこと:
- メモリの解放
- ログの書き出し
- 途中状態の保存
最初のEA:シンプルな移動平均クロス
実際に動くEAを書いてみよう。「短期移動平均が長期移動平均を上抜けたら買い、下抜けたら売り」という最もシンプルなロジックだ。
//+------------------------------------------------------------------+
//| 移動平均クロスEA(入門用・簡易版) |
//+------------------------------------------------------------------+
// 入力パラメータ(MT5の設定画面から変更可能)
input int FastMA = 10; // 短期移動平均の期間
input int SlowMA = 50; // 長期移動平均の期間
input double LotSize = 0.1; // ロット数
// インジケーターハンドル
int fastHandle, slowHandle;
int OnInit()
{
// 移動平均インジケーターのハンドル取得
fastHandle = iMA(_Symbol, _Period, FastMA, 0, MODE_EMA, PRICE_CLOSE);
slowHandle = iMA(_Symbol, _Period, SlowMA, 0, MODE_EMA, PRICE_CLOSE);
if(fastHandle == INVALID_HANDLE || slowHandle == INVALID_HANDLE)
{
Print("インジケーターの初期化に失敗しました");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
void OnTick()
{
// 移動平均の値を取得(直近2本分)
double fast[], slow[];
ArraySetAsSeries(fast, true);
ArraySetAsSeries(slow, true);
if(CopyBuffer(fastHandle, 0, 0, 2, fast) < 2) return;
if(CopyBuffer(slowHandle, 0, 0, 2, slow) < 2) return;
// クロスの判定
bool buySignal = (fast[1] < slow[1]) && (fast[0] > slow[0]); // ゴールデンクロス
bool sellSignal = (fast[1] > slow[1]) && (fast[0] < slow[0]); // デッドクロス
// ※実際のエントリー処理は OrderSend関数等で実装
if(buySignal) Print("買いシグナル検出");
if(sellSignal) Print("売りシグナル検出");
}
void OnDeinit(const int reason)
{
// ハンドルの解放
IndicatorRelease(fastHandle);
IndicatorRelease(slowHandle);
}
これは実際には注文を出さないシグナル検出のみのコードだが、OnTick内にシグナル検出のロジックが入り、OnInitで初期化、OnDeinitで後片付けをするという構造は完全なEAと同じだ。
Claudeと会話しながらインジケータが作れるhedgrow-fxは、このようなEAロジックの設計をAIと対話しながら進められるため、MQL5学習の効率化に活用できる。
MQL5でよく使う関数リスト(入門用)
| 関数 | 用途 |
|---|---|
| OrderSend() | 注文の送信(エントリー・決済) |
| PositionsTotal() | 現在保有中のポジション数を取得 |
| PositionSelect() | 特定のポジションを選択 |
| iMA() | 移動平均インジケーターのハンドル取得 |
| iRSI() | RSIインジケーターのハンドル取得 |
| CopyBuffer() | インジケーターのバッファ値を取得 |
| Print() | MetaEditorのジャーナルにメッセージを出力 |
| Alert() | アラートウィンドウを表示 |
| TimeCurrent() | 現在の時刻を取得 |
| AccountInfoDouble() | 口座情報を取得(残高・証拠金等) |
初心者が必ずつまずくポイント
ポイント1: MT4とMT5のコードは互換性がない
StackOverflowやQiitaのサンプルコードがMQL4で書かれている場合がある。OrderSend関数の引数や構造が大きく変わっているため、そのままコピーしてもコンパイルエラーになる。
検索時は「MQL5」と明示して検索する習慣をつけること。
ポイント2: CopyBuffer関数の「向き」に注意
ArraySetAsSeries(buffer, true)でインデックス0を「最新バー」にする設定にしてからCopyBufferを呼ぶ。これをしないと配列の順序が逆になり、直感と異なる動作になる。
ポイント3: OnTickは毎ティック実行される
スプレッドが広い時間帯や流動性が低い市場では、1分に何十回もOnTickが実行される。重い処理をOnTick内に書くと処理が遅延する。必要最小限の処理をOnTickに入れ、重い計算は事前に実施する設計が基本だ。
EAを動かすまでの手順
- MetaEditorでファイル作成: 「ファイル」→「新規作成」→「エキスパートアドバイザー(テンプレート)」を選択
- コードを書く: 上記のテンプレートを修正して自分のロジックを実装
- コンパイル: F7キー(またはビルドボタン)でコンパイル。エラーがなければ
.ex5ファイルが生成される - MT5で確認: MT5の「ナビゲーター」→「エキスパートアドバイザー」に表示されていれば成功
- チャートにアタッチ: 任意のチャートにドラッグ&ドロップでアタッチ
- ストラテジーテスターで検証: 本番前に必ずバックテストで動作確認
まとめ
MQL5でEAを自作する流れ:
- MetaEditorを起動する(MT5に付属)
- OnInit・OnTick・OnDeinitの3関数を理解する(これがEAの骨格)
- シンプルなロジックからコードを書く(移動平均クロス等)
- コンパイルしてバックテストで動作確認する
- 徐々にロジックを追加・改善する
「プログラミングは難しい」という先入観は捨てていい。最初のEAを動かすまでの壁は高くない。高くなるのは「本当に稼げるEAを作る」段階だが、それは後から考えればいい。
まず動かすことが全てだ。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
免責事項: FXトレードには損失リスクが伴います。EAを使った自動売買でも損失が発生する可能性があります。本記事のコードは教育目的のサンプルであり、収益を保証するものではありません。投資は自己責任でおこなってください。
著者情報: [著者名・プロフィールをここに記載]
よくある質問(FAQ)
Q: プログラミング未経験でもMQL5は学べますか? A: 学べます。ただしC言語やJavaScript等の基礎概念(変数・条件分岐・ループ)を事前に把握しておくと学習効率が上がります。完全なプログラミング初心者の場合は、MQL5の前にプログラミング入門書を1冊読むことをおすすめします。
Q: MQL4とMQL5はどちらを学ぶべきですか? A: 新規にMT5での開発を始めるならMQL5を選んでください。MT4はサポートの縮小が続いており、MT5に移行するトレーダーが増えています。
Q: EAを作るのに費用はかかりますか? A: MT5とMetaEditorは無料です。ただし、使用するFX口座は必要です。高品質なヒストリカルデータや開発補助ツールは有料のものもあります。
Q: ChatGPTやAIにMQL5コードを書いてもらえますか? A: 生成AIは基本的なMQL5コードのサポートは可能ですが、ハルシネーション(事実と異なる記述)が発生することもあります。生成されたコードは必ずコンパイルエラーの確認と、バックテストでの動作検証が必要です。
Q: 初心者向けのMQL5学習リソースは何がありますか? A: MQL5公式リファレンス(mql5.com)が最も正確です。日本語の解説は「MQL5投資研究所」などのブログが参考になります。また、MetaEditor内蔵のヘルプにも詳細な関数説明があります。
