MQL4とは?EAを自作するメリット
MQL4はMetaTrader 4(MT4)専用のプログラミング言語だ。この言語を使えば、自分だけのオリジナルEA(自動売買プログラム)を作ることができる。「プログラミング」と聞くと身構える人もいるだろうけど、MQL4はC言語をベースにしたシンプルな構文で、FX取引に特化した関数が最初から用意されているから、ゼロからWebアプリを作るような難しさはない。
自作EAの最大のメリットは「自分のトレードロジックを完全に再現できる」こと。市販のEAや無料EAは他人が作ったロジックだから、中身がわからないブラックボックスになりがちだ。自分で書けば、「なぜそこでエントリーするのか」「なぜそこで決済するのか」がすべて自分の意志。料理で例えれば、出来合いの惣菜を買うのと、自分でレシピから作るのとの違いだ。
開発環境:MetaEditorの使い方
MetaEditorの起動方法
MT4を開いて、キーボードの「F4」キーを押すだけ。これでMetaEditorが起動する。あるいはMT4のメニューから「ツール」→「MetaQuotes言語エディタ」でもOK。MetaEditorはMT4に内蔵されているから、追加でソフトをインストールする必要はない。
新しいEAファイルの作成
MetaEditorのメニューから「ファイル」→「新規作成」→「エキスパートアドバイザ」を選択。ウィザードに従ってEAの名前を入力すると、テンプレートコードが自動生成される。このテンプレートには、EAに最低限必要な関数(OnInit、OnTick、OnDeinit)が既に書かれている。
MQL4の基本構文
変数とデータ型
MQL4で使う主なデータ型をまとめた。
| データ型 | 用途 | 例 |
|---|---|---|
| int | 整数 | 注文チケット番号、バーのインデックスなど |
| double | 小数 | 価格、ロット数、スプレッドなど |
| string | 文字列 | 通貨ペア名、コメントなど |
| bool | 真偽値 | 条件判定の結果(true/false) |
| datetime | 日時 | エントリー時間、決済時間など |
EAの3つの主要関数
EAの骨格は3つの関数で構成されている。家に例えるなら、OnInitが「引っ越し」、OnTickが「日々の生活」、OnDeinitが「退去」にあたる。
OnInit():EAがチャートにセットされたときに1回だけ呼ばれる。インジケーターの準備や変数の初期化をここで行う。
OnTick():新しい価格データ(ティック)が届くたびに呼ばれる。EAの心臓部で、売買ロジックのすべてをここに書く。「今買うべきか?」「今決済すべきか?」の判断はすべてこの関数の中で行われる。
OnDeinit():EAがチャートから削除されたときに1回だけ呼ばれる。描画したオブジェクトの削除やログの出力など、後片付けをここで行う。
注文関数:OrderSend()
EAで注文を出すときに使う関数がOrderSend()だ。引数が多くて最初は面食らうけど、慣れれば定型的な書き方になる。
主な引数は、通貨ペア(Symbol())、売買の種類(OP_BUYまたはOP_SELL)、ロット数、価格、スリッページ、ストップロス、テイクプロフィットなど。エラーが返ってきた場合はGetLastError()で原因を特定できる。
よくあるエラーは「ERR_INVALID_STOPS」(ストップロスやテイクプロフィットの値が不正)と「ERR_NOT_ENOUGH_MONEY」(証拠金不足)。ストップロスは現在価格から最低ストップレベル以上離れた値を設定する必要がある。最低ストップレベルはMarketInfo(Symbol(), MODE_STOPLEVEL)で取得できる。
自作EAをリアルで動かすなら、スプレッドの狭いKIWAMI極口座がおすすめ。追加口座としてすぐに開設できる。
KIWAMI極口座を追加開設する →簡単なEAのサンプル:移動平均線クロス
MQL4の学習で最初に作られることが多い「移動平均線クロスEA」の考え方を紹介する。短期移動平均線が長期移動平均線を上抜けたら買い、下抜けたら売り——というシンプルなロジックだ。
ロジックの流れ
- OnTick()が呼ばれるたびに、短期MAと長期MAの値を取得する
- 前回のティックでの短期MA・長期MAの位置関係と比較する
- 短期MAが長期MAを下から上に抜けたら(ゴールデンクロス)→ 買い注文を発行
- 短期MAが長期MAを上から下に抜けたら(デッドクロス)→ 売り注文を発行
- 既にポジションがある場合は、反対シグナルで決済してからドテンする
iMA()関数を使えば、移動平均線の値は1行で取得できる。引数に通貨ペア、時間足、期間、シフト、MA種別、適用価格を指定するだけだ。
実際のコーディングのヒント
クロスの検出には「1本前のバーでの位置関係」と「現在のバーでの位置関係」を比較する方法が一般的。具体的には、iMA()の第5引数(shift)に1を指定して1本前の値を取得し、shiftに0を指定して現在の値を取得する。1本前では短期MAが長期MAの下にあり、現在は上にある——これがゴールデンクロスだ。
移動平均線クロスEAの最小コード
言葉で説明するだけでは掴みにくいので、実際に動く最小構成のコードを掲載する。MetaEditorにコピペしてコンパイルすれば、そのままストラテジーテスターで動作確認できる。
//+------------------------------------------------------------------+
//| 移動平均線クロスEA(最小構成) |
//+------------------------------------------------------------------+
// OnInit() — EA起動時に1回だけ呼ばれる初期化関数
int OnInit() { return INIT_SUCCEEDED; } // 特別な初期化処理がなければ成功を返すだけでOK
// OnTick() — 新しい価格データが届くたびに呼ばれるメイン関数
void OnTick()
{
// 短期移動平均線(期間10)の現在値を取得
double maFast = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 0);
// 短期移動平均線の1本前の値を取得(クロス判定用)
double maFast1 = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
// 長期移動平均線(期間25)の現在値を取得
double maSlow = iMA(NULL, 0, 25, 0, MODE_SMA, PRICE_CLOSE, 0);
// 長期移動平均線の1本前の値を取得(クロス判定用)
double maSlow1 = iMA(NULL, 0, 25, 0, MODE_SMA, PRICE_CLOSE, 1);
// ゴールデンクロス検出:現在は短期MAが上、1本前は短期MAが下 → 買いエントリー
// OrdersTotal()==0 で既存ポジションがないときだけ注文する
if(maFast > maSlow && maFast1 <= maSlow1 && OrdersTotal() == 0)
OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0, "MA Cross", 0, 0, clrBlue);
// Symbol()=現在の通貨ペア, OP_BUY=買い, 0.01=ロット数, Ask=買値,
// 3=許容スリッページ, 0=SL無し, 0=TP無し, "MA Cross"=コメント
// デッドクロス検出:現在は短期MAが下、1本前は短期MAが上 → 売りエントリー
if(maFast < maSlow && maFast1 >= maSlow1 && OrdersTotal() == 0)
OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0, "MA Cross", 0, 0, clrRed);
// Bid=売値を使用。売り注文はBid価格で発注する
}
このコードの限界
上記は学習用の最小構成であり、実運用にはそのまま使えない。主な限界をまとめた。
- ストップロス/テイクプロフィットが未設定:損切りも利確もないため、一方的に損失が膨らむリスクがある
- 複数ポジション管理がない:OrdersTotal()で全通貨ペアのポジションを見ているため、他のEAと併用すると誤動作する
- エラーハンドリングがない:OrderSend()が失敗した場合の再送処理やログ出力がない
- 決済ロジックがない:エントリーはするが既存ポジションの決済処理がないため、ポジションが1つ建ったら放置になる
これらの機能を一つずつ追加していくのが、MQL4学習の次のステップだ。まずはこのコードを動かしてみて、ストラテジーテスターのビジュアルモードで売買の様子を眺めてみよう。
デバッグとテストの方法
Print()関数でログ出力
MQL4のデバッグでもっとも基本的な方法がPrint()関数だ。変数の値やロジックの通過状況をMT4のエキスパートタブに出力できる。たとえばPrint("短期MA = ", shortMA, " 長期MA = ", longMA)と書けば、ティックごとの移動平均値を確認できる。プログラミングの世界では「printf デバッグ」と呼ばれる古典的だけど確実な方法だ。
ストラテジーテスターでの動作確認
MetaEditorでコンパイルが通ったら、MT4のストラテジーテスターでバックテストを実行する。「ビジュアルモード」にチェックを入れると、チャート上でEAの売買が視覚的に確認できるから、ロジックが意図通りに動いているかを目で追える。スピードの調整バーもあるから、ゆっくり1トレードずつ確認することも、高速で全体像を把握することもできる。
よくあるコンパイルエラーと対処法
初心者がよくハマるコンパイルエラーを挙げておく。
- セミコロンの付け忘れ:各文の末尾に「;」が必要。これがないとエラーになる
- 変数の未宣言:使う前にデータ型を宣言する必要がある。int ticket; のように
- 括弧の対応不備:{} や () の開き・閉じが対応していないとエラー。MetaEditorのインデント機能を使うと見つけやすい
- 型の不一致:int型の変数にdouble型の値を代入しようとすると警告が出る
MQL4学習のロードマップ
MQL4を学ぶ順番としては、以下のステップがおすすめだ。
- 基本構文(変数・条件分岐・ループ)を理解する
- 3つの主要関数(OnInit/OnTick/OnDeinit)の役割を把握する
- 移動平均線クロスEAを自分で書いてみる
- ストラテジーテスターでバックテストして結果を確認する
- ストップロスやテイクプロフィットの機能を追加する
- インジケーター(RSI、MACD、ボリンジャーバンドなど)を組み合わせた複合ロジックに挑戦する
- 資金管理ロジック(ロットサイズの自動計算など)を実装する
焦る必要はまったくない。最初のEAが動くまでには数日〜数週間かかるのが普通だ。大事なのは「小さく作って、テストして、改善する」のサイクルを回すこと。いきなり完璧なEAを目指すと挫折するから、まずは「移動平均線クロスで売買するだけ」のシンプルなEAを完成させよう。
MT5用のプログラミング言語MQL5は、MQL4よりもオブジェクト指向が強化されており、文法もやや異なる。ただしMQL4で基礎を学んでおけば、MQL5への移行は比較的スムーズ。まずはMT4ユーザーが多い現状を考慮して、MQL4から始めるのが実用的だろう。
FX Rescue編集部では、2026年4月にXMのMT4環境(MetaEditor)で移動平均線クロスEAを実際にコーディング・コンパイル・バックテストまで検証。MetaEditorでの開発からストラテジーテスターでの動作確認まで、初心者でも再現可能な手順であることを確認済み。