「移動平均線(MA)を使ったEAを作りたいけれど、どんなロジックを組めばいいの?」 「上抜け・傾き・クロス判定って、どうMQL4で書けば良いの?」
この記事では、FX初心者でも迷わずEAを作れるように、
移動平均線を使った3つの王道ロジック(上抜け/傾き/クロス)と、 MQL4での実装方法をわかりやすく解説します。
本記事では、EA作成の基礎となる移動平均線ロジックを最も汎用的な形で整理しました。
- 移動平均線を使ったEAロジックの基本(上抜け・傾き・クロス)
- 各ロジックのメリット・デメリット
- MQL4での実装サンプルコード
まずは、最も基本的な判定である「移動平均線の上抜け判定」から解説していきます。
まずは基礎:EAで移動平均線(MA)の値を取得する方法
上抜け・傾き・クロスのロジックを実装する前に、まずは 「移動平均線の値をどう取得するか」を押さえておきましょう。
iMA() 関数で MA の値を取る仕組みを理解しておくと、後の判定処理がスムーズになります。
取得方法
【使用例】 double dMA_atai = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
移動平均線の値を取得するにはiMA()関数を使います。これをEAに書き込むと、dMA_ataiに最新の移動平均線の値が取得できるという感じです。
移動平均線の最新の値や1つ前の値について
何故最新の値が取得されるのかというと、引数の最後が0となっているからです。
【例】 double dMA_atai = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
こんな感じで1にすると1つ前の値といった感じです。
最新(0)?1つ前(1)?と思うかもしれませんが、実際のチャートで表すとこんな感じです。

各ローソク足に移動平均線の値が1つあると思いましょう。実は移動平均線って線で見えますが、実際は点って考えておくとこの辺はわかりやすいです。見た目上、見やすいように点を結んで移動平均線という形にしてるんですね。
iMA()関数の引数について
iMA()関数の引数は以下の通りです。
- 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
- 引数2・・・時間軸です(0でチャートの時間軸になります)
- 引数3・・・期間です(20で20移動平均線、25で25移動平均線になります)
- 引数4・・・表示移動です
- 引数5・・・移動平均の種別です(MODE_SMAで単純移動平均線)
- 引数6・・・適用価格です(PRICE_CLOSEでクローズ値)
- 引数7・・・バーシフトです(0で現在の値、1で1つ前ーのバーの時の値です)
基本的に3,5,7しか触りません。(7は先ほど説明した最新や1つ前の値を取る場合に触ります)
3:期間、5:移動平均線の種別種別は用途や好みによって変えますが、MT4の移動平均線設定画面上で見るとイメージしやすいですね。

期間は、何日(20日)移動平均線とかのあの数値です。
移動平均線の種別は、4種類あり単純移動平均線や指数移動平均線を設定できます。
- 単純移動平均線:MODE_SMA
- 指数移動平均線:MODE_EMA
- 平滑移動平均線:MODE_SMMA
- 線形加重移動平均線:MODE_LWMA
移動平均線の値をどう使う?|4つの基本ロジック
MAの値が取得できるようになったら、次は「それをどう判定に使うか」です。 EAでよく使う移動平均線ロジックは以下の4つです。
- ローソク足の終値による上抜け・下抜け
- 移動平均線そのものの上向き・下向き
- 複数MAのパーフェクトオーダー
- ゴールデンクロス・デッドクロス
① 終値の上抜け・下抜けを使った判定
もっとも基本的なロジックが「終値がMAを上抜けたら買い」というパターンです。 高値ではなく終値を使うのは、“だまし”を減らすためです。
//----MA値取得
double MA_ATAI_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
//移動平均線をローソク足の終値が上抜けた場合
if(MA_ATAI_1 < iClose(NULL, 0, 1))
{
//ロングエントリーする処理を書く
OrderSend(NULL,・・・省略);
}
else
{
//エントリーしない
}すごくシンプルですね!
移動平均線の値(MA_ATAI_1)を、ローソク足の終値(iClose(NULL, 0, 1))が大きかった場合、つまり上抜けた場合にロングエントリーという感じです。

赤〇箇所のように、ローソク足の終値が移動平均線より大きい(上抜けしている)場合にロングエントリーといった感じですね!もう少し手前に黄色〇がある箇所はローソク足の高値は移動平均線を超えていますが、ローソク足の終値が移動平均線を超えていない為ロングエントリーしません。
//----MA値取得
double MA_ATAI_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
//移動平均線をローソク足の終値が下抜けた場合
if(MA_ATAI_1 > iClose(NULL, 0, 1))
{
//ショートエントリーする処理を書く
OrderSend(NULL,・・・省略);
}
else
{
//エントリーしない
}ショートエントリーする際は、こんな感じで5行目を下抜けしたらという感じに書き換えてあげるだけでOKですね!
② 移動平均線の上向き・下向きを判断
次に「MAが上向きか下向きか?」を判断する方法です。 これは最新の値と1本前の値を比較するだけで判定できます。
//----MA値取得
double MA_ATAI_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA_ATAI_2 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 2);
//移動平均線が下向きになった場合
if(MA_ATAI_2 > MA_ATAI_1)
{
//ショートエントリーする処理を書く
OrderSend(NULL,・・・省略);
}
else
{
//エントリーしない
}今回は3行目のように移動平均線の値を、1つ前の値と2つ前の値という感じで2つ取得しています。
移動平均線の上向き、下向きを判断する場合はこのように2つ取得する必要があるので覚えておきましょう。理由は、以下の画像を見てもらえばわかります。

このように移動平均線の値1つ前が2つ前よりも(わずかでも)下だったら移動平均線が下向きとなっている事がわかります。反対に、移動平均線の値1つ前が2つ前よりも(わずかでも)上だったら移動平均線は上向きとなります。
//----MA値取得
double MA_ATAI_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA_ATAI_2 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 2);
//移動平均線が上向きだった場合
if(MA_ATAI_2 < MA_ATAI_1)
{
//ロングエントリーする処理を書く
OrderSend(NULL,・・・省略);
}
else
{
//エントリーしない
}上向きにしたい場合は、7行目のところで不等号を変えているだけですね。
③ パーフェクトオーダーを判断
複数のMAが「全部上向き」「全部下向き」になっている状態がパーフェクトオーダーです。 トレンド順張りで非常に強いサインになります。
先ほどの『②移動平均線の上向き・下向きを判断』をちょっと応用した感じになりますね。早速ソースコードはこんな感じです。
//----MA値取得(短期)
double MA_ATAI_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA_ATAI_2 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 2);
//----MA値取得(中期)
double MA_ATAI_3 = iMA(NULL, 0, 60, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA_ATAI_4 = iMA(NULL, 0, 60, 0, MODE_SMA, PRICE_CLOSE, 2);
//移動平均線(短期・中期)が上向きだった場合
if(MA_ATAI_2 < MA_ATAI_1 && MA_ATAI_4 < MA_ATAI_3)
{
//ロングエントリーする処理を書く
OrderSend(NULL,・・・省略);
}
else
{
//エントリーしない
}移動平均線の値を4つも取得してきています。短期移動平均線(20)と中期移動平均線(60)の値を取得してきているためですね。長期などもう1本移動平均線を増やす場合は、移動平均線の値が6つ必要になるという事です。
10行目のif文の条件のところは、移動平均線(短期・中期)が上向きだった場合という感じにしています。
④ ゴールデンクロス・デッドクロスを判断
<p style=”font-size:15px; line-height:1.9;”> 短期線が中期線を上抜けたらゴールデンクロス。 単純ですが、EAでもよく使う強力なロジックです。 </p>
//----MA値取得(短期)
double MA_ATAI_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
//----MA値取得(中期)
double MA_ATAI_2 = iMA(NULL, 0, 60, 0, MODE_SMA, PRICE_CLOSE, 1);
//移動平均線(短期・中期)がゴールデンクロスした場合
if(MA_ATAI_2 < MA_ATAI_1)
{
//ロングエントリーする処理を書く
OrderSend(NULL,・・・省略);
}
else
{
//エントリーしない
}こちらは、移動平均線のゴールデンクロスは短期移動平均線が中期や長期の移動平均線を上抜けていく事になるので、このような感じになります。
移動平均線のゴールデンクロスやデッドクロスを使ったEAのサンプルソースはこちらの記事に記載していますので参考にしてみてください。
まとめ|MAロジックはEAの基礎であり最強の“相場フィルター”
今回紹介したロジックは、すべてのEA開発の基盤になります。 難しい計算式を使わず、価格とMAの位置関係だけで市場の方向を判断できるため、初心者でも扱いやすく、応用もしやすいのが特徴です。
特に「傾き判定」「クロス判定」は、組み合わせることで ・トレンドの方向 ・エントリーのタイミング ・無駄な逆張りの回避 などが一気に安定します。
ここまで理解できれば、あなたはもう「MAを使ったEAの基本ロジック」をしっかり理解しています。 次のステップでは、これらのロジックを組み合わせて「負けにくいEA」へ発展させていきましょう。
🔗 関連記事(あわせて読みたい)
✅EA開発初心者の方はこちらもチェック!
MT4やMQL4の知識がなくても大丈夫!
当サイトでは、プログラミング未経験者でも分かるEA開発の基本から、サンプルコードを使った実践的なチュートリアルまで多数ご用意しています。
ChatGPTやEAつくーるでのEAの作り方に興味がある方は是非参考にしてください。













コメント