本記事では、MT4(MetaTrader4)上で「移動平均線・RSI・MACD」などの基本インジケーターを組み合わせて、自分でEA(自動売買プログラム)を作る流れを丁寧に解説します。専門用語をできるだけかみ砕きながら、投資初心者の方でも自動売買の全体像と具体的な作り方がイメージできるようにまとめました。
いきなり複雑なロジックを作るのではなく、「シンプルなルールを一つずつEA化していく」ことがポイントです。ここでは、移動平均線を使ったトレンドフォロー、RSIを使った逆張り、MACDをフィルターとして使う構成を例にしながら、実際のMQL4コードも紹介していきます。
MT4とEA、自動売買の全体像
まず、自動売買の全体像を整理しておきます。MT4で自動売買を行うためには、以下の3つの要素が必要です。
- 取引プラットフォーム: MT4本体(チャート表示・注文送信の土台)
- EA(エキスパートアドバイザー): 取引ルールをプログラムしたファイル(.ex4や.mq4)
- インジケーター: シグナルの元になるテクニカル指標(移動平均線やRSIなど)
EAは、チャートにセットされると一定間隔で「今ポジションを持つべきか」「決済するべきか」をチェックし、条件を満たせば自動的に注文を出します。この「条件」の作り方にインジケーターを使うのが、インジケーターEAの基本的な考え方です。
インジケーターEAの設計ステップ
インジケーターEAを自作するときは、いきなりコードを書き始めるのではなく、次のようなステップで整理していくとスムーズです。
- どの時間軸・どの通貨ペアで動かすかを決める
- 使うインジケーター(移動平均線、RSI、MACDなど)を選ぶ
- 売買ロジックを日本語で言語化する(例:短期MAが長期MAを上抜けたら買い)
- エントリー条件・決済条件・フィルター条件を分けて整理する
- 損切り幅・利確幅・ロット数などのリスク管理パラメータを決める
- それぞれをMQL4のコードに落とし込む
- ストラテジーテスターでバックテストし、必要に応じてパラメータを調整する
この中でも特に重要なのが「ロジックを日本語でシンプルに書き出す」ことです。いきなりコードで考えようとすると複雑になりやすく、何を作っているのか途中でわからなくなります。紙やメモ帳で、まず文章としてルールを書き出してみてください。
移動平均線を使ったトレンドフォローEAの基本
最初の例として、もっともシンプルな「移動平均線のゴールデンクロス・デッドクロス」を使ったトレンドフォローEAを考えてみます。ルールを日本語で書くと、例えば次のようになります。
- 短期移動平均線(例:期間20)と長期移動平均線(例:期間50)を使う
- 短期線が長期線を下から上に抜けたら「買いエントリー」
- 短期線が長期線を上から下に抜けたら「売りエントリー」
- 損切りは固定pips(例:30pips)、利確も固定pips(例:60pips)
- 同時に持つポジションは1つだけにする
この程度のシンプルなルールでも、トレンドがよく出る通貨ペアや時間軸ではそれなりに機能するケースがあります。重要なのは、「トレンドが出ないレンジ相場ではドローダウンしやすい」といった特徴も含めて、長所と短所を理解した上で使うことです。
移動平均線EAのMQL4コード例
上記のロジックを簡略化した形で、MQL4コードのイメージを示します(学習用のサンプルであり、運用前には必ずご自身で検証してください)。
// 移動平均線クロスEAのごく基本的な例
int Magic = 12345;
input int FastMAPeriod = 20;
input int SlowMAPeriod = 50;
input double Lots = 0.1;
input int StopLoss = 30;
input int TakeProfit = 60;
double FastMA, SlowMA, FastMA_prev, SlowMA_prev;
void OnTick()
{
// すでにポジションを持っている場合は新規エントリーしない
if(PositionsTotal() > 0) return;
// 現在足と1本前の足の移動平均を取得
FastMA = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
SlowMA = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
FastMA_prev = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
SlowMA_prev = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
// ゴールデンクロス(買いシグナル)
if(FastMA_prev < SlowMA_prev && FastMA > SlowMA)
{
OrderSend(Symbol(), OP_BUY, Lots, Ask, 3,
Ask - StopLoss * Point,
Ask + TakeProfit * Point,
"MA Buy", Magic, 0, clrBlue);
}
// デッドクロス(売りシグナル)
if(FastMA_prev > SlowMA_prev && FastMA < SlowMA)
{
OrderSend(Symbol(), OP_SELL, Lots, Bid, 3,
Bid + StopLoss * Point,
Bid - TakeProfit * Point,
"MA Sell", Magic, 0, clrRed);
}
}
大まかな流れは「インジケーター値を取得して条件を判断し、条件が整ったらOrderSendで注文を出す」というシンプルな構造です。最初は細かい最適化よりも、この流れを身体で覚えるイメージでコードを読んでいくと理解が早くなります。
RSIを使った逆張りEAの考え方
次に、RSIを使った逆張りEAの基本的な考え方を説明します。RSIは「買われすぎ」「売られすぎ」を数値で示すオシレーターで、例えば以下のようなルールが定番です。
- RSI期間は14(MT4のデフォルト)を使用
- RSIが30以下になった後、30を上抜けたら「買いエントリー」
- RSIが70以上になった後、70を下抜けたら「売りエントリー」
- 利確は小さめ、損切りはやや広めに設定して相場の反発を狙う
トレンドフォロー系EAとは逆に、「行き過ぎた動きからの戻り」を取りに行くイメージです。ただし、強いトレンドが出ている相場で逆張りをすると、ポジションが逆行し続けて大きな損失につながることもあります。そのため、RSIの逆張りEAでは「トレンドの強さを判定するフィルター」を組み合わせることが重要になります。
RSI逆張りEAのコードイメージ
RSI逆張りロジックのごく基本的なコードイメージは次のようになります。
input int RSIPeriod = 14;
input int BuyLevel = 30;
input int SellLevel = 70;
double rsi, rsi_prev;
void OnTick()
{
if(PositionsTotal() > 0) return;
rsi = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0);
rsi_prev = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 1);
// RSIが売られすぎゾーンから戻ってきたら買い
if(rsi_prev < BuyLevel && rsi > BuyLevel)
{
// 買いエントリー処理(損切り・利確は移動平均EAと同様に設定)
}
// RSIが買われすぎゾーンから戻ってきたら売り
if(rsi_prev > SellLevel && rsi < SellLevel)
{
// 売りエントリー処理
}
}
このままでは、強いトレンドが出ているときに何度も逆張りしてしまい、ドローダウンが大きくなりがちです。そこで次の章で説明するMACDなどのトレンド判定インジケーターをフィルターとして組み合わせることで、「トレンドがはっきりしない時だけ逆張りする」といった工夫が可能になります。
MACDをトレンドフィルターとして使う
MACDはトレンドの方向や強さを見るためによく使われるインジケーターです。逆張りEAと組み合わせる場合は、例えば次のような使い方が考えられます。
- MACDラインが0より上のときは「上昇トレンド」、0より下のときは「下降トレンド」とみなす
- RSI逆張りの買いシグナルは、MACDが0より上(上昇トレンド)か、0付近でトレンドが強くないときだけ許可する
- RSI逆張りの売りシグナルは、MACDが0より下(下降トレンド)のときだけ許可する
こうすることで、明らかに強いトレンドが出ている方向とは逆向きのエントリーを減らし、ドローダウンのリスクを抑える狙いがあります。MACDをフィルターとしてEAに組み込むときは、iMACD 関数を使ってシグナル線やヒストグラムの値を取得します。
インジケーターEAにおける資金管理とリスクコントロール
どれだけロジックが優れていても、資金管理が甘いと口座を守ることはできません。インジケーターEAを設計する際には、次のような観点でリスクをコントロールすることが重要です。
- 1回のトレードで失ってもよい損失額を「口座残高の何%」と決める(例:1〜2%)
- 損切り幅(pips)とロット数の関係から、1トレードあたりのリスク金額を計算する
- 連敗が続いたときの最大ドローダウンを想定し、「どこまで耐えられるか」を事前にシミュレーションする
- 通貨ペアや時間軸を増やしすぎて、同じ方向のポジションを取りすぎないようにする
EAにロット数を固定値として書いてしまうのではなく、「口座残高に対する割合」で自動計算する設計にしておくと、残高が増減してもリスクが一定に保たれ、長期的に安定した運用につながりやすくなります。
バックテストとフォワードテストの進め方
EAを作成したら、必ずバックテストで過去データに対して動作を確認します。MT4のストラテジーテスターを使うと、指定した期間のチャート上でEAを再生し、収益曲線や勝率、最大ドローダウンなどの指標を確認できます。
バックテストで確認するポイントの一例は以下のとおりです。
- サンプル期間全体で右肩上がりの収益曲線になっているか
- 特定の相場局面(強いトレンド・レンジ相場など)で極端なドローダウンが出ていないか
- 1回あたりの平均利益と平均損失のバランス(リスクリワード比)が極端になっていないか
- トレード回数が少なすぎないか、多すぎないか
バックテストである程度の手応えが掴めたら、次はデモ口座や小さなロットで実際のレートに対するフォワードテストを行います。過去データで良い結果が出ていても、リアルタイム相場ではスプレッドやスリッページ、サーバー遅延などの影響を受けるため、その感覚をつかんでおくことが大切です。
よくある失敗パターンと改善のヒント
インジケーターEAを自作し始めた方が陥りやすい失敗パターンをいくつか挙げ、その改善のヒントを整理しておきます。
- 失敗パターン1:パラメータを過剰に最適化しすぎる
過去のある期間にだけピッタリ合うようにパラメータを調整しすぎると、本番相場では全く機能しないことがあります。改善策としては、「期間を変えた複数のバックテストで同時にそこそこの成績が出る設定」を優先することが挙げられます。 - 失敗パターン2:損切りを入れない、あるいは極端に広くする
損切りを入れない設計は、短期的には勝ちやすく見えても、いつか大きなトレンドで致命的な損失につながるリスクがあります。EAには必ず損切りロジックを組み込み、許容できるリスクに合わせて調整することが重要です。 - 失敗パターン3:インジケーターの意味を理解せずに組み合わせる
単に「よく使われているから」という理由だけでインジケーターをいくつも重ねても、ロジックが混乱するだけです。それぞれのインジケーターが「何を測っているのか」を理解し、役割が被りすぎないように組み合わせることがポイントです。
まとめ:小さなEAからスタートして経験を積む
本記事では、MT4上で移動平均線・RSI・MACDといった基本インジケーターを使ってEAを自作する流れを解説しました。ポイントを整理すると次のようになります。
- まずは日本語でシンプルな売買ルールを書き出し、MT4の関数に少しずつ置き換えていく
- 移動平均線のクロスやRSIの逆張りなど、単純なロジックからEA化を始める
- MACDなどをフィルターとして組み合わせることで、無駄なエントリーを減らす工夫ができる
- 資金管理とリスクコントロールをEA設計の早い段階から組み込む
- バックテストとフォワードテストを通じて、ロジックの長所と短所を自分の目で確認する
いきなり完璧なEAを作ろうとすると挫折しやすくなります。まずは小さなロジックを1つEA化し、そこから少しずつ改善を重ねていくことで、自分の取引スタイルに合った自動売買戦略を構築していくことができます。


コメント