MT4で自動売買を始めたいと思ったとき、多くの人は「既製のEAを買うか、どこかで拾ってくるか」を考えます。しかし長期的に安定して利益を狙うなら、自分でロジックを理解し、自分の手でEAを組めるようになることが非常に重要です。本記事では、代表的なテクニカル指標である移動平均線とRSIを使って、初心者でも取り組みやすいシンプルなEAをMT4上で自作する流れを、できるだけ具体的に解説します。
あくまでサンプル戦略ですが、「どうやってロジックを形にするか」「どこでテストし、どこを注意すべきか」が分かるように構成しています。実際の運用では必ずご自身の判断でリスク管理を行ってください。
MT4自動売買とEA自作のメリット
まず、なぜ自分でEAを組むことが重要なのかを整理します。
既製EAは「中身がブラックボックス」であることが多く、ドローダウンが大きくなったときに「なぜ負けているのか」をロジックレベルで把握できません。結果として、もっとも止めるべきタイミングで止められなかったり、逆に一時的な損失で見切りをつけてしまったりと、感情に振り回されやすくなります。
一方、自作EAであれば、
- どの時間足・どのインジケーターを使っているか
- エントリー条件・決済条件がどうなっているか
- 想定している相場環境(トレンド相場向きか、レンジ向きか)
を自分の言葉で説明できます。これは、システムトレードで最も重要な「戦略と自分の相性」を確認するうえで大きな強みになります。
今回作るEA戦略のコンセプト
今回解説するEAは、「移動平均線でトレンド方向を確認し、RSIで押し目・戻りを拾う」という、比較的ベーシックなトレンドフォロー戦略です。対象はFX通貨ペア(例:EURUSD)、時間足は1時間足を想定します。
ざっくりしたイメージは次の通りです。
- 移動平均線(例:期間50)の上に価格がある → 上昇トレンド
- RSIが一時的に売られ過ぎ(例:30以下)まで下がったら押し目買い
- 逆に、移動平均線の下に価格がある → 下降トレンド
- RSIが一時的に買われ過ぎ(例:70以上)まで上がったら戻り売り
このような、裁量でもよく使われるロジックを、そのままEAとして自動化していきます。「裁量でなんとなくやっていたこと」をコードに落とし込む感覚を掴むことが、このステップの狙いです。
準備:MT4とMQL4エディタの使い方
EAを自作するには、MT4本体だけでなく、MQL4エディタ(MetaEditor)を使います。手順は次の通りです。
- MT4を開き、メニューから「ファイル」→「新規作成」を選択します。
- 「Expert Advisor(テンプレート)」を選び、名前を入力します(例:
MA_RSI_TrendEA)。 - ウィザードに従って空のEAテンプレートを作成します。
- 自動的にMetaEditorが立ち上がり、MQL4ファイル(
.mq4)が開きます。
テンプレートには、あらかじめOnInit、OnDeinit、OnTickなどの関数が用意されています。EAのロジックは基本的にOnTickの中に書いていきます。
MQL4の基本構造を押さえる
MQL4でEAを書くときに最低限押さえておきたいポイントは、次の3つです。
- 変数・入力パラメータ:ロット数、損切り幅、インジケーターの期間などを外部入力(
input)として定義する。 - インジケーターの値取得:
iMA、iRSIなどの関数で最新の値を取得する。 - 売買ロジックと注文処理:条件を満たしたときに
OrderSendで注文を出し、決済条件でOrderCloseする。
ここでは細かい文法すべてを覚える必要はありません。重要なのは、「自分がやりたいロジックを、どのようなステップに分解してコードにするか」です。
ロジック設計:移動平均線とRSIの組み合わせ
次に、今回のEAの具体的な売買ルールを決めます。例として次のように定義してみます。
買いエントリー条件
- 終値が期間50の単純移動平均線(SMA)の上にある
- RSI(期間14)が30以下から30を上抜けたタイミング
- すでに買いポジションを持っていない
売りエントリー条件
- 終値が期間50SMAの下にある
- RSI(期間14)が70以上から70を下抜けたタイミング
- すでに売りポジションを持っていない
決済条件
- 一定の利幅に到達したら利確(例:+30pips)
- 一定の逆行で損切り(例:-20pips)
- 逆シグナルが出たら成行決済し、反対方向のポジションを取ることも検討可
このとき、ポイントは「シグナルのタイミング」をどう定義するかです。RSIがずっと30以下のままなのか、30を下から上に抜けた瞬間なのかで、エントリー頻度や成績は大きく変わります。ここでは「一つ前の足では30以下で、現在の足で30を上抜けた」場合をシグナルとみなすようにコード化していきます。
サンプルEAコード(MQL4):MA×RSIトレンドフォロー
以下は、上記ロジックを実装したシンプルなサンプルEAコードです。実運用にそのまま使うのではなく、「自分のアイデアを書き換えてテストするための土台」として活用してください。
//+------------------------------------------------------------------+
//| MA_RSI_TrendEA.mq4 |
//+------------------------------------------------------------------+
#property strict
input double Lots = 0.1;
input int MagicNumber = 12345;
input int MaPeriod = 50;
input int RsiPeriod = 14;
input int TakeProfitPips = 30;
input int StopLossPips = 20;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
// 現在のシンボルと時間足
string symbol = _Symbol;
int tf = PERIOD_H1;
// インジケーター値を取得(1本前の確定足を使う)
double ma = iMA(symbol, tf, MaPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double rsi_now = iRSI(symbol, tf, RsiPeriod, PRICE_CLOSE, 1);
double rsi_prev= iRSI(symbol, tf, RsiPeriod, PRICE_CLOSE, 2);
double close1 = iClose(symbol, tf, 1);
// 既存ポジションの有無を確認
int buys = 0;
int sells = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != symbol) continue;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderType() == OP_BUY) buys++;
if(OrderType() == OP_SELL) sells++;
}
// 売買ロットと価格
double lot = Lots;
double ask = NormalizeDouble(Ask, _Digits);
double bid = NormalizeDouble(Bid, _Digits);
double point = _Point;
double tp_buy = ask + TakeProfitPips * point;
double sl_buy = ask - StopLossPips * point;
double tp_sell = bid - TakeProfitPips * point;
double sl_sell = bid + StopLossPips * point;
// 買いシグナル:MAより上 & RSIが30以下→30超え
bool buySignal = (close1 > ma) && (rsi_prev <= 30.0) && (rsi_now > 30.0);
// 売りシグナル:MAより下 & RSIが70以上→70割れ
bool sellSignal = (close1 < ma) && (rsi_prev >= 70.0) && (rsi_now < 70.0);
// 新規買いエントリー
if(buySignal && buys == 0)
{
OrderSend(symbol, OP_BUY, lot, ask, 3, sl_buy, tp_buy, "MA_RSI Buy", MagicNumber, 0, clrBlue);
}
// 新規売りエントリー
if(sellSignal && sells == 0)
{
OrderSend(symbol, OP_SELL, lot, bid, 3, sl_sell, tp_sell, "MA_RSI Sell", MagicNumber, 0, clrRed);
}
}
//+------------------------------------------------------------------+
上記コードは「1時間足で動かす」前提で書いていますが、PERIOD_H1を他の時間足に変えることで、同じロジックを別の時間軸に適用できます。ただし、時間足を変えれば最適なパラメータも変わるため、その都度バックテストで検証することが重要です。
バックテストの回し方と結果の見方
EAを作ったら、すぐにリアル口座で動かすのではなく、まずバックテストでロジックの特徴を把握します。MT4のストラテジーテスターを使う基本的な流れは次の通りです。
- MT4のメニューから「表示」→「ストラテジーテスター」を開きます。
- Expert Advisorに先ほど作成したEA(
MA_RSI_TrendEA)を選択します。 - 通貨ペアや時間足、テスト期間、初期証拠金などを設定します。
- 「ビジュアルモード」をオンにすると、チャート上で取引の様子を確認しながらテストできます。
- テスト終了後、「レポート」タブでプロフィットファクター、最大ドローダウン、勝率などを確認します。
バックテストでは、「トータルの損益」だけでなく、次のような点も確認してください。
- ドローダウン時の最大連敗数・連続損失額
- 損益カーブが右肩上がりか、それともギザギザの乱高下が多いか
- 特定の相場局面(強いトレンド、急激な逆行、長いレンジ)で成績がどう変化するか
これらを見ていくことで、「この戦略はトレンドが強く出ているときに強いが、レンジでは連敗しやすい」といった特徴が見えてきます。その特徴を理解したうえでロット調整や稼働通貨ペアを決めていくことが、EA運用の基本になります。
パラメータ調整と最適化の考え方
移動平均線の期間(MaPeriod)やRSIの閾値、利確・損切り幅は、バックテストを通じて調整していきます。MT4には「最適化」機能があり、複数のパラメータ組み合わせを一括でテストできますが、ここで注意したいのが「過剰最適化(カーブフィッティング)」です。
過剰最適化を避けるためのポイントは、次のようなものです。
- テスト期間を十分に長く取り、上昇相場・下降相場・レンジ相場を一通り含める。
- パラメータを細かく刻みすぎない(例:MA期間を1刻みで1〜200まで試すなどは避ける)。
- 「少し値をずらしても成績が極端に悪化しない」パラメータ帯を選ぶ。
- テスト期間を前半・後半に分けて、前半でパラメータを合わせ、後半で検証する。
特に、最後の「前半で調整し後半で検証する」ステップは、統計的な意味でも重要です。前半期間に完全にフィットしているが、後半期間ではまったく使い物にならない戦略は、実運用でも役に立たない可能性が高いと考えられます。
デモ口座でのフォワードテスト
バックテストである程度納得できる結果が出たら、次はデモ口座でフォワードテストを行います。フォワードテストは、実際のリアルタイム相場でEAを稼働させ、「スプレッド」「約定」「サーバー時間」「指標発表時の変動」などの要素を含めた挙動を確認する段階です。
フォワードテストでは、次のポイントを意識してください。
- 最低でも数週間〜数か月程度は様子を見る。
- バックテストと大きく乖離するポイントがないか確認する。
- 急激なドローダウンが発生したとき、その原因をチャートと注文履歴から検証する。
このプロセスを通じて、「コード上は正しくても、スプレッドが広がる時間帯では期待通り動作しない」「指標発表直後はスリッページが大きく、損切りが想定より不利な価格で成立しやすい」といった実務上の注意点も体感できます。
自作EAを使った実際の運用イメージ
自分でEAを組み、バックテストとフォワードテストを経て、ある程度戦略のクセが把握できたら、いよいよ少額のリアル運用を検討します。ここでは、典型的な運用イメージを挙げます。
- 1つの通貨ペア・1つの時間足に限定して少額から始める。
- 1日1回、稼働状況とポジションを確認し、異常がないかチェックする。
- 一定の損失額(例:口座残高の○%)に達したらEAの稼働を一時停止し、ロジックの見直しを行う。
- 勝ちが続いてもロットを急激に増やさず、事前に決めたルールに従って段階的にロットを調整する。
自作EAの大きな利点は、「ロジックに納得しているのでドローダウン時も冷静でいられる」点です。もちろん感情が完全に消えるわけではありませんが、「なぜ負けているのか」を自分で説明できることはメンタル面でも大きな支えになります。
裁量トレードとEAの組み合わせ方
EAを運用すると、「完全自動にしたい」気持ちが強くなりがちですが、最初は裁量トレードとの併用も有効です。例えば次のような使い方が考えられます。
- 日足・4時間足で大きなトレンド方向だけ裁量で判断し、トレンド方向と逆のシグナルはEA側でフィルタリングする。
- 重要指標発表前後だけEAの稼働を停止し、ボラティリティが落ち着いてから再開する。
- EAが出したシグナルを参考にしつつ、裁量でエントリー・決済タイミングを微調整するセミオート運用にする。
重要なのは、「EAがどのような相場環境を得意・不得意としているか」を理解し、その弱点を裁量で補う発想です。自作EAであれば、この弱点分析もはるかにやりやすくなります。
よくある失敗パターンと注意点
最後に、初心者がEA自作・運用で陥りやすい失敗パターンをいくつか挙げておきます。
- 見た目のバックテスト結果だけで判断する:期間を短く切り取ってテストすると、「たまたま相場がロジックに合っていただけ」の可能性があります。できる限り長い期間で検証しましょう。
- パラメータを細かく調整しすぎる:「ある1つの設定だけ突出して良い結果」が出ている場合、過剰最適化の可能性が高いです。近い設定でもそこそこ安定しているポイントを選ぶ方が現実的です。
- スプレッドや取引コストを軽視する:短期足・高頻度取引の戦略ほど、スプレッドや手数料の影響が大きくなります。バックテストの設定で実際のスプレッドを反映させておくことが大切です。
- EA任せにしすぎる:ロジックの前提が崩れるような相場環境の変化(極端なボラティリティの上昇など)が起きても放置していると、大きな損失につながることがあります。定期的なモニタリングは欠かせません。
まとめ:まずは1本のEAを作り切ることから始める
MT4で自動売買EAを自作することは、最初こそハードルが高く感じられますが、一度「インジケーターの値を読み取り、条件分岐で売買する」という基本パターンを理解してしまえば、アイデアを変えながら何本もEAを試すことができるようになります。
本記事で紹介した移動平均線とRSIを組み合わせた戦略は、あくまで入門用のシンプルな例です。しかし、ここで紹介した流れ(ロジック設計→コード化→バックテスト→フォワードテスト→少額リアル運用)を一通り経験することで、今後より高度なインジケーターやフィルター条件を組み込んだEAを作るための土台が身につきます。
まずは、この記事のサンプルコードをそのまま動かしてみるところからスタートし、自分なりのアイデアを1つずつ反映させていってください。そのプロセス自体が、相場理解とリスク管理のスキル向上につながっていきます。
最終的には、「自分で理解し、納得できるロジックだけを動かす」というスタンスを徹底することが、長くマーケットに残るための大きな武器になります。


コメント