本記事では、MetaTrader4(MT4)で動く自動売買プログラム(EA:Expert Advisor)を、初心者の方でも自作できるようにステップバイステップで解説します。題材として「移動平均線とRSIを組み合わせたシンプルな順張りロジック」を扱い、実際に動くMQL4コードまで示します。
ここで紹介する内容は、特定の銘柄や売買を推奨するものではなく、あくまでMT4の自動売買機能やEA作成の仕組みを学ぶためのサンプルです。まずはデモ口座で十分に動作検証を行い、ロジックやリスクを理解しながら進めてください。
MT4自動売買の全体像を押さえる
MT4の自動売買は、EAと呼ばれるプログラムをチャートに適用し、チャートの値動きに応じて売買注文や決済を自動で行わせる仕組みです。裁量トレードと異なり、感情に左右されずにルール通りの売買を継続できる点が大きなメリットです。
一方で、EAは「ロジックどおり」にしか動きません。ロジックが相場環境に合っていなければ、機械的に損失を積み重ねる可能性もあります。そのため、EA作成では以下のポイントを押さえることが重要です。
- どの時間足・どの通貨ペアを対象にするか
- エントリーとエグジット(決済)の条件を明確に定義すること
- 損切り・利確・ロットなどのリスク管理ルールを組み込むこと
- 過去データを用いてバックテストし、ロジックの特徴を把握すること
この記事では、EA作成の全体像をイメージしやすくするために、シンプルなテクニカル指標に絞ったロジックを扱います。
今回作るEAのコンセプト:移動平均線+RSIの順張り
今回のサンプルEAは、トレンド方向を移動平均線で判断し、タイミングをRSIで測る、という構成にします。基本コンセプトは次の通りです。
- 時間足:1時間足(H1)
- 通貨ペア:メジャー通貨(例:EURUSD)を想定
- トレンド判定:短期移動平均線が長期移動平均線の上にあるか下にあるか
- 買いエントリー:上昇トレンドかつRSIが一定値以下から上向きに反転したとき
- 売りエントリー:下降トレンドかつRSIが一定値以上から下向きに反転したとき
- 決済:固定の利確・損切り幅+逆シグナルでのクローズ
たとえば、短期移動平均線を期間20、長期移動平均線を期間50、RSIの買い条件を30以下、売り条件を70以上といった具合にパラメータ化しておけば、後から自由に調整できます。EAで重要なのは「指標そのもの」よりも、「どう条件を組み合わせるか」「どのようにポジションサイズや損切りをコントロールするか」です。
MT4とMQL4の準備をする
EAを自作するには、MT4本体だけでなく、MQL4という専用言語でコードを書くためのエディタ(MetaEditor)を使います。一般的な流れは次の通りです。
- MT4をインストールし、デモ口座を開設する
- MT4のメニューから「ツール」→「MetaQuotes Language Editor」を開く
- MetaEditorで新規EAウィザードを使ってテンプレートを作成する
- MQL4コードを書き、コンパイルする
- MT4のナビゲータにEAが表示されるので、チャートにドラッグ&ドロップする
MT4のデータフォルダ構造では、EAのソースコード(.mq4)は通常「MQL4/Experts」フォルダ内に保存されます。コンパイル後に生成される「.ex4」ファイルが、MT4上で実際に読み込まれる実行ファイルです。
EAロジックを文章で定義する
いきなりコードから書き始めると、途中で条件が変わったり、何を実装しているのか分からなくなりがちです。まずはロジックを日本語の文章で整理しておきましょう。今回のサンプルでは以下のように定義できます。
買いエントリー条件
- 現在の足で、短期移動平均線(期間20)が長期移動平均線(期間50)より上にある
- RSI(期間14)が直近で30以下まで下がった後、30を上抜けたタイミング
- すでに買いポジションを持っていない
売りエントリー条件
- 現在の足で、短期移動平均線が長期移動平均線より下にある
- RSIが直近で70以上まで上がった後、70を下抜けたタイミング
- すでに売りポジションを持っていない
決済条件
- エントリー時にあらかじめ設定したpips数で利確・損切りを設定する
- 逆方向のシグナルが出た場合、保有中のポジションをクローズする(任意)
このように、コードを書く前に「人間が読んで理解できるレベル」でロジックを明文化しておくと、後から検証や修正がしやすくなります。
MQL4で使う基本構造を理解する
MQL4のEAは、いくつかの決まった関数をベースに構成されます。代表的なものは次の3つです。
OnInit():EAがチャートに適用されたときに1度だけ実行される初期化処理OnDeinit():EAがチャートから外されたときに呼ばれる終了処理OnTick():価格が更新されるたびに呼ばれるメイン処理(ここに売買ロジックを書く)
また、インジケーターの値を取得するためには、以下のような組み込み関数を使います。
iMA():移動平均線の値を取得するiRSI():RSIの値を取得するiTime()やiClose():指定したバーの時間や終値を取得する
EAでは「何本前のバーを見るか」を指定するために、バー番号(シフト)を使います。現在進行中のバーを0、直近で確定した1本前のバーを1、その前を2…といった具合に指定します。エントリー判断は、確定したバーの値(シフト1など)を使うのが基本です。
実際のサンプルEAコード(移動平均線+RSI)
ここからは、先ほど定義したロジックをもとに、実際に動くシンプルなサンプルEAコードを提示します。あくまで学習用の最小構成なので、実運用前には必ずご自身で検証と改良を行ってください。
#property strict
input int FastMAPeriod = 20;
input int SlowMAPeriod = 50;
input int RSIPeriod = 14;
input double Lots = 0.1;
input int StopLossPips = 50;
input int TakeProfitPips= 100;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
// 1時間足チャートで動かす前提
if(Period() != PERIOD_H1) return;
// 1本前の確定足で計算
int shift = 1;
double fastMA = iMA(NULL, PERIOD_H1, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, shift);
double slowMA = iMA(NULL, PERIOD_H1, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE, shift);
double rsiPrev = iRSI(NULL, PERIOD_H1, RSIPeriod, PRICE_CLOSE, shift+1);
double rsiCurr = iRSI(NULL, PERIOD_H1, RSIPeriod, PRICE_CLOSE, shift);
// すでにポジションがあるか確認
bool hasBuy = false;
bool hasSell = false;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() == OP_BUY) hasBuy = true;
if(OrderType() == OP_SELL) hasSell = true;
}
// ロットサイズ(口座残高に応じた簡易計算などは各自で調整)
double lot = Lots;
// 買い条件:上昇トレンド+RSIが30から上抜け
if(fastMA > slowMA && rsiPrev <= 30 && rsiCurr > 30 && !hasBuy)
{
OpenOrder(OP_BUY, lot);
}
// 売り条件:下降トレンド+RSIが70から下抜け
if(fastMA < slowMA && rsiPrev >= 70 && rsiCurr < 70 && !hasSell)
{
OpenOrder(OP_SELL, lot);
}
}
void OpenOrder(int type, double lot)
{
double sl = 0;
double tp = 0;
double price;
if(type == OP_BUY)
{
price = Ask;
sl = price - StopLossPips * Point;
tp = price + TakeProfitPips * Point;
}
else if(type == OP_SELL)
{
price = Bid;
sl = price + StopLossPips * Point;
tp = price - TakeProfitPips * Point;
}
else return;
int ticket = OrderSend(Symbol(), type, lot, price, 3, sl, tp, "MA_RSI_EA", 0, 0, clrNONE);
if(ticket < 0)
{
Print("OrderSend error: ", GetLastError());
}
}
上記コードをMetaEditorで新規EAとして貼り付け、「コンパイル」ボタンを押すと、エラーがなければMT4のナビゲータ内「エキスパートアドバイザ」にEAが表示されます。H1チャートにドラッグ&ドロップし、自動売買ボタンをONにすることで、サンプルロジックに従った売買が行われます。
バックテストでEAの性格を把握する
EAを動かす前に、MT4のストラテジーテスターでバックテストを行い、ロジックの特徴を確認しておきましょう。バックテストの基本的な手順は次の通りです。
- MT4のメニューから「表示」→「ストラテジーテスター」を開く
- テスター画面でEA名、通貨ペア、期間(例:H1)、テスト期間などを設定する
- モデルを「始値のみ」から試し、余裕があれば「全ティック」でも確認する
- 初期証拠金やロット、スプレッドなどを設定し、「スタート」をクリック
- テスト結果とエクイティカーブを確認し、どのような相場局面で利益・損失が出ているかを把握する
バックテストの結果は、単に「総利益」や「勝率」だけで判断するのではなく、ドローダウン(最大含み損)や連敗数、どのようなトレンド局面に強いのか・弱いのかなど、複数の観点から確認することが大切です。移動平均線とRSIを組み合わせたロジックは比較的トレンド局面に強く、レンジ局面でダマシが増える傾向があります。
パラメータ調整と過剰最適化の注意点
EAの性能を改善しようとすると、ついパラメータを細かく調整したくなります。たとえば、RSIの閾値を「30/70」から「25/75」に変える、移動平均線の期間を変える、利確・損切り幅を変える、などです。MT4のストラテジーテスターには、こうしたパラメータを自動で最適化する「最適化」機能もあります。
しかし、過去データに対してパラメータを細かく合わせすぎると、いわゆる「過剰最適化(オーバーフィッティング)」に陥りやすくなります。過去の特定期間では好成績でも、別の期間やリアルタイムの相場では全く通用しない、という状況です。
過剰最適化を避けるための基本的な考え方として、次のような点を意識すると良いでしょう。
- パラメータの候補レンジを広めに取り、常識的な範囲に収める
- テスト期間を分割し、一部を開発用、一部を検証用(アウトオブサンプル)として使う
- 少しパラメータをずらしても傾向が大きく変わらないロジックを採用する
- あまりに複雑な条件を重ねすぎない(シンプルさを維持する)
今回のような移動平均線+RSIのシンプルなロジックは、パラメータの数も多くなく、過剰最適化に陥りにくい構造です。それでも、「テスト期間をずらしても傾向が維持されるか」「別の通貨ペアではどうか」などを確認しておくと、ロジックの強みと弱みが見えやすくなります。
リスク管理とロットコントロール
EAであっても、リスク管理の基本は裁量トレードと変わりません。1トレードあたりの損失が口座全体に与える影響を意識し、ロットサイズを決める必要があります。
一例として、「1トレードの最大損失を口座残高の1%以内に抑える」という目安を置きます。たとえば残高10,000ドルで、1トレードの最大損失を100ドルに抑えたいとします。損切り幅が50pipsなら、1pipsあたりの価値は2ドル(100ドル ÷ 50pips)までにする必要があります。通貨ペアごとの1ロットあたりのpips価値を確認し、それに合わせてロットサイズを逆算します。
記事のサンプルEAでは固定ロットを使っていますが、実際には口座残高に応じて自動的にロットを調整するロジックを組み込むことも可能です。例えば、MQL4のAccountBalance()関数で残高を取得し、目標リスク割合からロットを計算する関数を作るなどの工夫が考えられます。
よくある失敗パターンと改善のヒント
EAを自作し始めた初心者の方が陥りがちな失敗パターンとして、次のようなものがあります。
- サインが出るたびにナンピン的にポジションを増やしてしまう:トレンドが続いている間は利益が伸びますが、反転時に大きな損失を招きやすくなります。まずは1ポジションのみ運用するシンプルな構成から始めるのがおすすめです。
- 損切りを入れずに放置する:含み損が膨らみ、いつの間にか口座が耐えられないレベルのドローダウンに陥るリスクがあります。EAでは必ず損切り幅を決めて注文にセットする習慣をつけましょう。
- バックテスト結果だけを見て判断する:テスト期間を変えたり、別の通貨ペアでテストしたり、フォワードテスト(一定期間リアルタイムで動かす)を行うなど、多角的にロジックを検証することが重要です。
- ロジックを頻繁に変えすぎる:短期間の結果だけを見てロジックを変え続けると、何が良くて何が悪かったのか分からなくなります。一定期間は同じルールで運用し、統計的な傾向を確認してから改良する姿勢が大切です。
改善のヒントとしては、「トレンドフィルターを強化する」「ボラティリティに応じて利確・損切り幅を変える」「時間帯フィルターを導入する」などがあります。たとえば、ATRを使ってそのときの値動きの大きさに応じて損切り幅を調整したり、ロンドン時間やニューヨーク時間に限定してエントリーするなどの工夫も考えられます。
ステップバイステップでEA作成スキルを高めていく
MT4で自動売買EAを自作することは、最初は難しく感じるかもしれません。しかし、今回紹介したように、
- ロジックを日本語で明確に言語化する
- 移動平均線やRSIなど、基本的なインジケーターから始める
- シンプルな条件でEAを書き、バックテストで特徴を把握する
- 少しずつパラメータやフィルターを加えて改良する
という流れを踏めば、着実にスキルを積み上げることができます。最初は小さなロジックでも、バックテストや検証を通じて「どんな相場に強いのか」「どこが弱点なのか」を自分の目で確かめることで、売買戦略に対する理解が深まります。
EA作成は、単に自動売買を行うためだけでなく、自分のトレードルールを客観的に見直し、再現性のある戦略に磨き上げていくための強力な手段です。まずはこの記事のサンプルEAをベースに、パラメータや条件を少しずつ変えながら、自分なりのロジックを組み立ててみてください。


コメント