この記事では、MT4(MetaTrader4)上で、移動平均線やRSIといった基本的なインジケーターを使ったEA(自動売買プログラム)を自分で作る方法を、初心者の方にも分かりやすいように解説します。プログラミングが初めての方でも、「この部分を真似すればとりあえず動く」というレベルまで持っていき、そこから自分のアイデアを少しずつ組み込めるようになることを目標にします。
MT4でインジケーターEAを作る全体像
最初に、MT4でEAを作るときの全体像を整理しておきます。流れが分かっていれば、多少難しいコードが出てきても「今どのステップをやっているのか」がイメージしやすくなります。
典型的な流れは次のとおりです。
- 1. 使うインジケーターと売買ロジックを決める
- 2. MT4とMetaEditorの環境を用意する
- 3. EAのひな形コードを作る(またはサンプルをコピーする)
- 4. インジケーターの値をMQL4で取得する
- 5. 取得した値を使って「買い/売りの条件」をコード化する
- 6. テスト(バックテスト)を行い、ロジックやパラメーターを調整する
- 7. 少額・デモで試しながら実運用に近づける
この記事では、このうち特に1・4・5・6の部分を詳しく説明します。
EAでよく使う基本インジケーター
EAでよく使われるインジケーターはいくつかありますが、初心者の方が最初に押さえておきたいのは次の3つです。
移動平均線(Moving Average)
一定期間の平均価格を線でつないだもので、トレンドの方向をざっくりと把握するのに使います。短期線と長期線のクロス(ゴールデンクロス/デッドクロス)は、EAロジックとして非常に人気があります。
RSI(Relative Strength Index)
買われすぎ/売られすぎを数値化したオシレーター系インジケーターです。一般的には70以上で「買われすぎ」、30以下で「売られすぎ」といった使い方をします。トレンドフォローEAにフィルターとして組み込むと、「伸びきったところでエントリーしてしまう」ミスを減らすのに役立ちます。
MACD(Moving Average Convergence Divergence)
2本の移動平均線の関係性からトレンドの強さや転換を示すインジケーターです。やや仕組みは複雑ですが、EAでは「MACDラインがシグナルラインを上抜けしたら買い」といったシンプルな条件として使うことが多いです。
EA開発の準備:MT4とMetaEditor
MT4でEAを作るには、MT4本体に加えて「MetaEditor」というエディタを使います。MT4のメニューから「ツール」→「MetaQuotes Language Editor」を開くと起動します。
MetaEditorを開いたら、左上の「新規作成」から「エキスパートアドバイザ(テンプレート)」を選び、EAの名前を入力して進めてください。これだけで、EAの基本的なひな形コードが自動で生成されます。
最もシンプルな移動平均クロスEAの考え方
ここでは、代表的なロジックである「短期移動平均線と長期移動平均線のクロス」を例にします。考え方はシンプルです。
- 短期MAが長期MAを下から上に抜けたら「買い」
- 短期MAが長期MAを上から下に抜けたら「売り」
このロジックに、損切り(ストップロス)や利確(テイクプロフィット)を組み合わせることで、最初のEAとしては十分に実用的な形になります。
MQL4によるEAの基本構造
MQL4で書かれたEAには、大まかに次のような構造があります。
OnInit():EA起動時に一度だけ実行される初期化処理OnDeinit():EA停止時に一度だけ実行される終了処理OnTick():新しいティックが来るたびに実行されるメイン処理
売買ロジックの多くはOnTick()の中に書きます。ここでインジケーターの値を取得し、「エントリー条件を満たしているか」「決済条件を満たしているか」を判定します。
移動平均クロスEAの実装例
まずは、移動平均線だけを使ったシンプルなEAのコード例を示します。実際にそのままコピペしても動くように、最低限必要な部分をまとめています。
//+------------------------------------------------------------------+
//| Moving Average Cross EA Sample |
//+------------------------------------------------------------------+
#property strict
extern int FastMAPeriod = 10;
extern int SlowMAPeriod = 25;
extern double Lots = 0.1;
extern int StopLoss = 200;
extern int TakeProfit = 400;
// 現在ポジション数を数える関数
int CountOrders()
{
int count = 0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==12345)
count++;
}
}
return count;
}
void OnTick()
{
// すでにポジションがある場合は何もしない(シンプルな設計)
if(CountOrders() > 0) return;
// 移動平均線の値を取得(1本前の確定足)
double fastMA_prev = iMA(NULL, 0, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double slowMA_prev = iMA(NULL, 0, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double fastMA_curr = iMA(NULL, 0, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
double slowMA_curr = iMA(NULL, 0, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
// ゴールデンクロス判定(買いシグナル)
bool buySignal = (fastMA_prev < slowMA_prev) && (fastMA_curr > slowMA_curr);
// デッドクロス判定(売りシグナル)
bool sellSignal = (fastMA_prev > slowMA_prev) && (fastMA_curr < slowMA_curr);
double sl, tp;
if(buySignal)
{
sl = Bid - StopLoss * Point;
tp = Bid + TakeProfit * Point;
OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, sl, tp, "MA Cross Buy", 12345, 0, clrNONE);
}
else if(sellSignal)
{
sl = Ask + StopLoss * Point;
tp = Ask - TakeProfit * Point;
OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, sl, tp, "MA Cross Sell", 12345, 0, clrNONE);
}
}
//+------------------------------------------------------------------+
このEAは、非常にシンプルですが、次のポイントを押さえています。
- インジケーター(移動平均線)の値を
iMA()で取得している - 1本前の値と現在の値を比較し、クロスしたかどうかを判定している
- ポジションを増やしすぎないよう、同一シンボルで1つだけ持つ設計にしている
- 損切りと利確の値をポイント単位で指定している
RSIフィルターを加えて精度を上げる例
次に、同じ移動平均クロスにRSIフィルターを追加してみます。たとえば次のような条件です。
- 買いエントリー:ゴールデンクロス かつ RSIが30以上70未満
- 売りエントリー:デッドクロス かつ RSIが30以上70未満
RSIが極端な領域にいるときのエントリーを避けることで、無理な逆張りや天井・底でのエントリーを減らす狙いがあります。
extern int RSIPeriod = 14;
void OnTick()
{
if(CountOrders() > 0) return;
double fastMA_prev = iMA(NULL, 0, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double slowMA_prev = iMA(NULL, 0, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double fastMA_curr = iMA(NULL, 0, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
double slowMA_curr = iMA(NULL, 0, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
double rsi = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0);
bool buySignal = (fastMA_prev < slowMA_prev) && (fastMA_curr > slowMA_curr);
bool sellSignal = (fastMA_prev > slowMA_prev) && (fastMA_curr < slowMA_curr);
bool rsiFilter = (rsi > 30 && rsi < 70);
if(!rsiFilter) return;
double sl, tp;
if(buySignal)
{
sl = Bid - StopLoss * Point;
tp = Bid + TakeProfit * Point;
OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, sl, tp, "MA+RSI Buy", 12345, 0, clrNONE);
}
else if(sellSignal)
{
sl = Ask + StopLoss * Point;
tp = Ask - TakeProfit * Point;
OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, sl, tp, "MA+RSI Sell", 12345, 0, clrNONE);
}
}
このように、基本インジケーターは「単体で使う」のではなく、「メインロジック+フィルター」という形で組み合わせると、より納得感のあるロジックになります。
ストラテジーテスターでのテスト手順
EAを作ったら、必ずMT4のストラテジーテスターでテストします。手順は次のとおりです。
- 1. MT4下部の「ストラテジーテスター」タブを開く
- 2. エキスパートアドバイザに作成したEAを選択する
- 3. 通貨ペア、時間足、テスト期間、スプレッドを設定する
- 4. パラメーター画面でFastMAPeriodやSlowMAPeriodなどを好みの値にする
- 5. 「スタート」を押して結果を確認する
最初は、勝率よりも「どのような場面で負けているのか」「どの時期にドローダウンが集中しているのか」に注目すると、ロジックの改善ポイントが見えやすくなります。
実運用で気を付けたいポイント
EAがテストでそれなりにうまく動いても、そのまま大きなロットで本番投入するのは危険です。次のようなポイントに注意してください。
- ロットは資金に対して無理のない水準(例:1トレードあたり資金の1〜2%以内)に抑える
- 必ずデモ口座や少額リアル口座で動作確認を行う
- スプレッドの広がりや約定拒否が起きやすい時間帯(指標発表前後など)には運用を避けることも検討する
- VPSを利用して、PCをつけっぱなしにしなくてもEAが動く環境を整える
EAはあくまで「売買の自動化ツール」であり、放置していれば勝手に資産が増えるものではありません。定期的に結果を確認し、相場環境に合っていないと判断したら停止・調整できるようにしておくことが大切です。
自作EAだからこそ得られるメリット
既製品のEAを購入するのではなく、自分でEAを作る一番のメリットは、「ロジックを自分で理解している」という点です。どのような場面で強く、どのような場面で弱いのかを把握できていれば、相場環境に応じて運用判断がしやすくなります。
また、自作EAを作る過程で、インジケーターの意味やチャートの読み方も自然と身に付いていきます。「なぜここで負けたのか」「どんな条件を足せば避けられたのか」を考え続けることで、裁量トレードの判断力も鍛えられます。
これからのステップ
この記事で紹介した移動平均線+RSIの組み合わせは、あくまで「最初の一歩」です。慣れてきたら、次のような拡張も検討してみてください。
- ボリンジャーバンドを使ってトレンドの強さを判定する
- 時間帯フィルター(ロンドン時間のみ、ニューヨーク時間のみ)を導入する
- 最大ポジション数やトレード回数の上限を設けてリスクをコントロールする
- 複数通貨ペア・複数時間足で同じロジックをテストし、相性の良い組み合わせを探す
基本インジケーターを使ったEA作りは、一見地味ですが、長く使える王道のアプローチです。まずはシンプルなロジックを1つ完成させ、テストと改善を繰り返しながら、自分なりの自動売買スタイルを確立していきましょう。


コメント