超初心者向けEAプログラミング入門⑧|移動平均線で賢くエントリーしよう

EA作成入門
記事内に商品プロモーションを含む場合があります
スポンサーリンク

🔰はじめに|移動平均線でEAを一歩進化させよう

「EA作ったはいいけど、何となく動くだけでエントリーの根拠がなくて不安…」
そんな悩みを持つ初心者のあなたへ。今回は、代表的なインジケーターである 移動平均線 を使って、より戦略的にエントリーするEAの作り方を解説します。

「移動平均線を上抜けたら買う」「下を向いたら売る」このシンプルなロジックで、あなたのEAは一気に賢くなります。EAプログラミング入門の集大成として、自作EAにさらなる実用性を加えていきましょう!

🔗 前回の記事:
▶ 超初心者向けEAプログラミング入門⑦|新規注文&ポジション管理を習得

iMA()関数で移動平均線の値を取得する

EAで移動平均線を使うには、MQL4の iMA() 関数を使うだけ。例えば下のコードで、20期間の単純移動平均(SMA)の最新値を取得できます。

EAで移動平均線の値を取得するにはiMA()関数を使います。

()の中の引数が今回も複数ありますので、さっそく引数を確認していきましょう。

double dMA_atai   = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

まず、iMA()関数の書き方はこんな感じです。

これだけで『20(日)』の『単純移動平均線』の『現在』の値が変数「dMA_atai」に返ってきます。

この、『』で囲まれている所はもちろん引数で指定しています。詳しく引数を見ていくと、

  • 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
  • 引数2・・・時間軸です(0でチャートの時間軸になります)
  • 引数3・・・期間です(20で20移動平均線、25で25移動平均線になります)
  • 引数4・・・表示移動です
  • 引数5・・・移動平均の種別です(MODE_SMAで単純移動平均線)
  • 引数6・・・適用価格です(PRICE_CLOSEでクローズ値)
  • 引数7・・・バーシフトです(0で現在の値、1で1つ前ーのバーの時の値です)

実際にMT4の画面で移動平均線のインジケータの設定を見てみると、もっとイメージしやすくて、引数3、4、5、6の箇所が変更できることがわかりますね。

※よく触る値は大体黄色マーカーの箇所だと思います

引数7について画面からも指定できなくて、バーシフトというと?となるかもしれませんが、実際にMT4で見てみるとこんな感じです。

※実際MT4の、ユーロ/ドルチャートで確認するとこんな感じ

0が現在の移動平均線の値、1が1つ前のバーの移動平均線の値が取れるという形です。バー単位で移動平均線の値が取れるようになっています。

0にすると・・・1.08424
1にすると・・・1.08429
2にすると・・・1.08428

という形で、ユーロ/ドルの値(移動平均線の値)が取れます。

スポンサーリンク

移動平均線を上抜けたらエントリー

では実際に、移動平均線よりも現在の値段が上にいる場合のみロングでエントリーするようにプログラムを組んでみましょう。

前回入門⑦の最後で使ったプログラムに変更を加えていくと、こんな感じです。

void OnTick()
  {
//---
    
   //20移動平均線の値を取得する
   double dMA_atai   = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
    
   if(OrdersTotal()==0 && Ask > dMA_atai) //ポジションを保有していない かつ 移動平均線より上の時だけエントリーする
   {
      // 新規エントリー注文
      int CNo = OrderSend(
               NULL,                // 通貨ペア
               OP_BUY,              // オーダータイプ[OP_BUY / OP_SELL]
               1,                   // ロット[0.01単位](FXTFは0.01で1000通貨)
               Ask,                 // オーダープライスレート
               20,                  // スリップ上限    (int)[分解能 0.1pips]
               Ask-50 * Point,      // ストップレート
               Ask+50 * Point,      // リミットレート
               "EAテスト",            // オーダーコメント
               0,                   // マジックナンバー(識別用)
               0,                   // オーダーリミット時間
               clrRed               // オーダーアイコンカラー
               );
   }
  }

移動平均線の値を取得し、if(OrdersTotal()==0)の箇所に、移動平均線の値の条件を追加しました。

※変更前(左)と変更後(右)で比較してみると、変更された場所はこんな感じです

まずは、iMA()で20移動平均線の値をdMA_atai変数に入れています。そして、その値をAsk(現在の買値)と比較しています。

Ask(現在の買値) > dMA_atai(20移動平均線の値)

という形で、現在の買値が移動平均線より大きい(上にいる)場合、ロングでエントリーするという内容をつけ足しています。

if文のつけ足しているところですが、

if(OrdersTotal()==0) 

のところを、以下のようにつけ足しています。

if(OrdersTotal()==0 && Ask > dMA_atai)

&&と書くことによって「ポジションを持っていない事」アンド「現在の買値が移動平均線より大きい事」という風に条件を追加することができます。

ですので、「ポジションを持っていない」けど「現在の買値が移動平均線より小さい」場合は新規注文しませんし、「ポジションを持っている」けど「現在の買値が移動平均線より大きい」場合も新規注文しません。どちらも合致している場合しか新規注文しないという形にしているわけですね。

移動平均線が下を向いたらエントリー

では次に別のエントリータイミングとして、移動平均線が下を向いたらショートでエントリーするプログラムを組んでみましょう。

前回入門⑦の最後で使ったプログラムに変更を加えていくと、こんな感じです。

void OnTick()
  {
//---
    
   //20移動平均線(現在値)を取得する
   double dMA_atai_0   = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
    
   //20移動平均線(1つ前)を取得する
   double dMA_atai_1   = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
    
    
   if(OrdersTotal()==0 && dMA_atai_0 < dMA_atai_1) //ポジションを保有していない かつ 移動平均線が下向きの場合エントリーする
   {
      // 新規エントリー注文
      int CNo = OrderSend(
               NULL,                // 通貨ペア
               OP_SELL,             // オーダータイプ[OP_BUY / OP_SELL]
               1,                   // ロット[0.01単位](FXTFは0.01で1000通貨)
               Bid,                 // オーダープライスレート
               20,                  // スリップ上限    (int)[分解能 0.1pips]
               Bid+50 * Point,      // ストップレート
               Bid-50 * Point,      // リミットレート
               "EAテスト",            // オーダーコメント
               0,                   // マジックナンバー(識別用)
               0,                   // オーダーリミット時間
               clrRed               // オーダーアイコンカラー
               );
   }
  }

移動平均線の現在の値と1つ前の値を取得し、if(OrdersTotal()==0)の箇所に、移動平均線の値の条件を追加しました。

dMA_atai_0(移動平均線の現在値)< dMA_atai_1(移動平均線の1つ前の値)

という形にして、移動平均線が下を向く条件としています。

どうしてこれで移動平均線が下を向いた条件になるのかわからないかもしれないですが、実際のチャート上の移動平均線を想像してみてください。

※実際MT4の、ドル/円チャートで確認するとこんな感じ

移動平均線が下を向くという事は、現在の移動平均線の値の方が前回の移動平均線の値より小さいという事になっていますよね。

※反対に、移動平均線が上を向くという事は、現在の移動平均線の値の方が前回の移動兵器戦の値より大きいという事になっています

したがって、簡単に移動平均線の向きを確認したい場合、移動平均線の前後の値を確認すれば良いという事になりますね。

※変更前(左)と変更後(右)で比較してみると、変更された場所はこんな感じです

今回はショートにしましたので、新規エントリー注文の部分も前回入門⑦から若干変わっていますので参考にしてみてください。

スポンサーリンク

おまけ|ロング&ショート両対応パターン

これで、移動平均線とロング・ショートエントリーを組み合わせたEAが作れると思います。簡単に今回の内容を組み合わせたサンプルプログラムを組んでみました。

void OnTick()
{
//---
   int CNo = 0;
    
   //20移動平均線(現在値)を取得する
   double dMA_atai_0   = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
    
   //20移動平均線(1つ前)を取得する
   double dMA_atai_1   = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
    
   //ロングエントリー(ポジションを保有していない かつ 移動平均線より上 かつ 移動平均線が上向き)
   if(OrdersTotal()==0 && Ask > dMA_atai_0 && dMA_atai_0 > dMA_atai_1) 
   {
      // 新規エントリー注文
      CNo = OrderSend(
               NULL,                // 通貨ペア
               OP_BUY,              // オーダータイプ[OP_BUY / OP_SELL]
               1,                   // ロット[0.01単位](FXTFは0.01で1000通貨)
               Ask,                 // オーダープライスレート
               20,                  // スリップ上限    (int)[分解能 0.1pips]
               Ask-50 * Point,      // ストップレート
               Ask+50 * Point,      // リミットレート
               "EAテスト",            // オーダーコメント
               0,                   // マジックナンバー(識別用)
               0,                   // オーダーリミット時間
               clrRed               // オーダーアイコンカラー
               );
   }
   //ショートエントリー(ポジションを保有していない かつ 移動平均線より下 かつ 移動平均線が下向き)
   if(OrdersTotal()==0 && Bid < dMA_atai_0 && dMA_atai_0 < dMA_atai_1) 
   {
      // 新規エントリー注文
      CNo = OrderSend(
               NULL,                // 通貨ペア
               OP_SELL,             // オーダータイプ[OP_BUY / OP_SELL]
               1,                   // ロット[0.01単位](FXTFは0.01で1000通貨)
               Bid,                 // オーダープライスレート
               20,                  // スリップ上限    (int)[分解能 0.1pips]
               Bid+50 * Point,      // ストップレート
               Bid-50 * Point,      // リミットレート
               "EAテスト",            // オーダーコメント
               0,                   // マジックナンバー(識別用)
               0,                   // オーダーリミット時間
               clrRed               // オーダーアイコンカラー
               );
   }
}

EA動作の概要

ポジションを保有していない&移動平均線より上&移動平均線が上向きの場合にロングエントリー(利益確定、損切りともに5pips)

ポジションを保有していない&移動平均線より下&移動平均線が下向きの場合にショートエントリー(利益確定、損切りともに5pips)

あとは、実際にこのEAの動作を確認してもらうとわかりますが、わりと自動売買感が出てきて面白いと思います。

✅まとめ|EAに“チャートを読む力”を持たせよう

  • iMA() 関数で移動平均線の値を簡単取得
  • ロングとショートのエントリーを条件付きで制御
  • EAがチャートの傾向を判断して動くようになった!

ここまできたら、EAプログラミング入門シリーズは完結です。

▶ 🧩次のステップ

次は作成したEAをバックテストし、実運用に向けてチューニングしていきましょう。バックテストは過去の値動きを全て再現してくれるので、ビジュアルモードで確認してみると、このエントリーじゃまずい!等がよくわかって楽しいですよ。

以下がバックテスト動画です。(※画質が悪い場合、設定で720pを選択すると良くなります)

※バックテスト方法はこちら👇

※初めてEAを作る際の、トレード戦略の立て方についてはこちら👇

コメント