【MQL4】ボリンジャーバンドEAの作り方|順張りロジックのサンプルコード付き

WS000180
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

「ボリンジャーバンドを使ったEAを作ってみたい」
「逆張りではなく、トレンドに乗る順張りロジックとして使えないのか知りたい」
そんな方に向けて、この記事ではMT4(MQL4)で動作するボリンジャーバンドEAの無料サンプルを解説します。

ボリンジャーバンドは「±2σに触れたら逆張り」という使い方が有名ですが、
実際にEAとして検証すると、逆張りが機能しにくい場面も多いのが実情です。

そこで本記事では、
バンドの拡大と価格の位置関係を利用した「順張りロジック」に着目し、
iBands() を使ったバンド値の取得方法から、
コピペですぐ動かせる実践的なボリンジャーバンドEAサンプルコードまで、
プログラミング初心者の方にも分かるよう丁寧に解説します。

📘 この記事で解説する内容
  • MT4のEAで使われるボリンジャーバンドの仕組みと基本的な考え方
  • iBands() を使った±σラインの取得方法
  • ボリンジャーバンドを使った順張りエントリー判定ロジック
  • 利確・損切をTP/SLで管理するシンプルなEA構成
  • コピペで動くボリンジャーバンドEAサンプルコードとカスタマイズのポイント

📊 MT4のEAで使われるボリンジャーバンドとは?仕組みと特徴(順張り)

ボリンジャーバンドは、価格の平均値とそのばらつき(標準偏差)をもとに、
相場の状態を視覚的に捉えるテクニカル指標です。

基本構成は以下の3本のラインで成り立っています。

  • 中央線:移動平均線(多くは20期間)
  • 上限バンド:平均値 + 標準偏差 × n
  • 下限バンド:平均値 − 標準偏差 × n

価格の変動が大きくなるとバンドは広がり、
値動きが落ち着くとバンドは収縮します。

この「バンドの広がり=トレンド発生」「収縮=レンジ」という性質が、
ボリンジャーバンド最大の特徴です。


🔁 逆張りだけでなく「順張り」にも使える指標

ボリンジャーバンドは、
「±2σに触れたら逆張り」という使い方が有名ですが、
トレンド発生時の順張り判断にも非常に有効です。

順張りでよく使われる基本的な考え方は次の通りです。

  • 価格が上側バンドに沿って推移 → 上昇トレンド(買い優勢)
  • 価格が下側バンドに沿って推移 → 下降トレンド(売り優勢)
  • バンドが拡大しながら価格が追随 → トレンド継続のサイン

このように、
「バンドを抜けたか」ではなく「バンドに沿っているか」を見ることで、
トレンドフォロー型のロジックを組み立てることができます。


🤖 EA(自動売買)との相性が良い理由

ボリンジャーバンドは、EAとの相性も非常に良いインジケーターです。

  • バンド値を数値として明確に取得できる
  • トレンド判定・エントリー条件を論理的に定義しやすい
  • iBands() 関数で上限・下限・中央線を簡単に取得できる

そのため、
順張りEAのベースロジックとしても扱いやすく、再現性の高い実装が可能です。

本記事では、
ボリンジャーバンドのこの特性を活かし、
バンドの拡大と価格位置を使った順張りEAロジックを、
初心者の方にも分かる形で解説していきます。

📈 エントリーロジック解説(ボリンジャーバンド順張り)

ボリンジャーバンドEAの順張りエントリーポイントを示したMT4チャート

本EAでは、ボリンジャーバンドの位置関係と価格の動きをもとに、あらかじめ定義した条件を満たした場合のみ新規エントリーを行います。

逆張りのように「バンドに触れたら反転」を狙うのではなく、バンドに沿って動く=トレンドが発生している状態を順張りで捉えるのが特徴です。

🔵 ロングエントリー条件

  • 価格が上側ボリンジャーバンドを上抜け、または上側バンド付近で推移
  • トレンド継続と判断した場合にロングエントリー

(※ 判定には iBands() で取得した上側バンドの値を使用します)

🔴 ショートエントリー条件

  • 価格が下側ボリンジャーバンドを下抜け、または下側バンド付近で推移
  • 下落トレンド継続と判断した場合にショートエントリー

⚠️ 注意点(必ず押さえておきたいポイント)

  • ボリンジャーバンドは、レンジ相場ではダマシが発生しやすい
  • バンドが収縮している状態では、順張りエントリーは控えるのが無難
  • トレンド発生後(バンド拡大時)に効果を発揮しやすい
  • 新しいローソク足確定時に1回だけ判定を行う仕様
  • マジックナンバー非対応のため、このEA単独での運用を推奨

📌 精度を上げるための考え方

順張りEAでは、トレンドが実際に発生している相場だけを選別することが非常に重要です。

ボリンジャーバンドは、中央線(移動平均線)とバンド幅の両方を持つため、
単体でもトレンド判定と相場環境の判断が可能です。

  • 価格が中央線より上/下にあるかで方向を判定する
  • バンド幅が拡大している状態のみエントリーを許可する

このように、ボリンジャーバンドの特性をそのまま活用することで
レンジ相場を回避し、順張りエントリーの精度を高めることができます。

より厳密にトレンド相場を判定したい場合は、ADXのようなトレンド強度指標を併用する方法もあります。

ダウンロード

上記のEAファイルになります。

📥 ボリンジャーバンドEA をダウンロード

\ 国内最大級のEAプラットフォーム /
GogoJungle(ゴゴジャン)でEAの評価・レビューをチェック!

▶ GogoJungleでEAを探す 【MQL4】ボリンジャーバンドEAの作り方|順張りロジックのサンプルコード付き

📜 ボリンジャーバンド EAのサンプルコード解説

以下にMQL4サンプルコードを掲載します。
そのままコピーしてMT4(MetaEditor)に貼り付ければコンパイル可能で、動作確認も済んでいます。

//+------------------------------------------------------------------+
//|                                            02_BollingerBands.mq4 |
//|                                Copyright © 2020-2025 ぷろぐらむFX |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020-2025 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict


input double Lots = 0.01;              //ロット
input int TP = 100;                    //利確(pips)
input int SL = 100;                    //損切り(pips)
//***【パラメータ設定・グローバル変数↓】ボリンジャーバンド***//
input int BB_KIKAN = 20;               //ボリンジャーバンドの期間

int waitBB = 0;			               //ボリンジャーバンド待機フラグ
//***【パラメータ設定・グローバル変数↑】ボリンジャーバンド***//

string Ea_Name = WindowExpertName();   //チャート上のEA名称を取得(オーダーコメントに使用)

double PipValue;                       //ブローカー桁数に対応した Point 補正
datetime prevtime;                     //ローソク足時間保持用
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){

   //デジットチェック
   if (Digits == 3 || Digits == 5){
      PipValue = Point * 10;   // 例: EURUSD 1.23456 → 1pip = 0.00010
   }else{
      PipValue = Point;        // 例: USDJPY 123.45 → 1pip = 0.01
   }

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){

   int total = OrdersTotal();    //ポジショントータル数をセット  
   int ea_order_Type = -1; //0:OP_BUY  1:OP_SELL
   double ea_order_stop_price = 0; //ストップロスレート
   double ea_order_good_price = 0; //利確レート

   //ポジションがない場合はエントリー判定
   if(total == 0){

      bool openBuy  = false;    //買い新規注文判断
      bool openSell = false;    //売り新規注文判断
      
//***【新規注文判断↓】***//

      bool isBullBollinger_S = false;
      bool isBearBollinger_S = false;
   
      //ボリンジャーバンドの値を取得
      double BB3UP = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_UPPER,0); //3σの上側
      double BB3LO = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_LOWER,0); //3σの下側
            
      double BB2UP = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_UPPER,0); //2σの上側
      double BB2LO = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_LOWER,0); //2σの下側
   
   
      // --- 3σタッチで待機モードに入る ---
      if(Ask > BB3UP)   waitBB =  1; // 買い待ち
      if(Bid < BB3LO)   waitBB = -1; // 売り待ち
      
      // --- 待機モード中の処理 ---
      if(waitBB ==  1 && Ask < BB2UP && Bid > BB2LO){
         isBullBollinger_S = true;  // 買いエントリー
         waitBB  = 0;   // 待機解除
      }
      else if(waitBB == -1 && Bid > BB2LO && Ask < BB2UP){
         isBearBollinger_S = true;  // 売りエントリー
         waitBB  = 0;   // 待機解除
      }
      
//***【新規注文判断↑】***//

      //参照するサンプルEAの買いエントリーフラグをセットしてください
      if(isBullBollinger_S){
         openBuy =true;
         ea_order_Type = OP_BUY;
      //参照するサンプルEAの売りエントリーフラグをセットしてください      
      }else if(isBearBollinger_S){
         openSell =true;
         ea_order_Type = OP_SELL;
      }

//***【TP/SL判断↓】***//
      if(openBuy){
         ea_order_stop_price = Ask - SL * PipValue;
         ea_order_good_price = Ask + TP * PipValue;
      }else if(openSell){
         ea_order_stop_price = Bid + SL * PipValue;  
         ea_order_good_price = Bid - TP * PipValue;   
      }
//***【TP/SL判断↑】***//

      if(ea_order_Type > -1){
         funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
      }
   }

   return;
}


//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★
//+------------------------------------------------------------------+
//|【関数】新規注文関数
//|
//|【引数】 orderType:売買(0=BUY, 1=SELL)
//|【引数】 sl:損切り価格  tp:利確価格
//|【引数】 lots:取引ロット数
//|【引数】 orderComment:オーダーコメント
//|【引数】 magic:マジックNo
//|【引数】 maxSpreadPips: 許容スプレッド[Point] (0=制限なし)
//|
//|【戻値】true=成功 false=失敗
//+------------------------------------------------------------------+
bool funcOrder_Send(int orderType, double sl, double tp, double lots,
                    string orderComment, int magic, int maxSpreadPoints){
   int    ticket = -1;
   double price  = 0;
   color  clr    = clrNONE;
   double spread = 0;

   // 最大10回リトライ
   for(int retry=0; retry<10; retry++)
   {
      RefreshRates();
      
      // スプレッド取得(MT4表示と同じポイント単位)
      spread = MarketInfo(Symbol(), MODE_SPREAD);

      // スプレッドチェック(maxSpreadPoints=0 の場合はスキップ)
      if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
         Print("スプレッド拡大中(", spread,
               "ポイント) → 待機中 (リトライ=", retry+1, ")");
         Sleep(2000);
         continue;
      }

      // エントリー価格と色を決定
      if(orderType == OP_BUY){
         price = Ask;
         clr   = clrBlue;
      }else if(orderType == OP_SELL){
         price = Bid;
         clr   = clrRed;
      }

      ticket = OrderSend(Symbol(), orderType, lots, price,
                         20, sl, tp, orderComment, magic, 0, clr);

      if(ticket > 0){
         Print("新規注文成功! チケットNo=", ticket,
               " レート=", price, " Lots=", lots,
               " スプレッド=", spread, "ポイント");
         return true;
      }else{
         int err = GetLastError();
         Print("新規注文失敗 エラーNo=", err,
               " リトライ回数=", retry+1);
         Sleep(2000);
      }
   }

   return false;
}
 
スポンサーリンク

ボリンジャーバンド利用箇所

  • 新規注文処理(67-71行目) … iBands()関数でボリンジャーバンドの上線・下値を取得
  • 決済処理は無し(本EAは「TP/SLで管理」)

iBands()でボリンジャーバンドを取得する方法【MQL4】

今回は、ボリンジャーバンドの値を取得できるiBands()関数を使っています。

【使用例】
iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_UPPER,0);


このように、ボリンジャーバンドは iBands() を使うことで MQL4上でも簡単に売買条件へ組み込むことができます。

引数は以下の通りです。

  1. 通貨ペア(NULLで当該通貨)
  2. 時間軸(0で当該時間軸)
  3. 期間(メインのラインとなる期間です)
  4. 偏差(3:3σ、2:2σ、1:1σ)
  5. 表示移動
  6. 適用価格
  7. モード(MODE_MAIN:中心線 MODE_UPPER:上線 MODE_LOWER:下線)
  8. バーシフト

基本的に、3,4,7,8を変更して使う形です。

3:期間、4:偏差、5:表示移動、6:適用価格はMT4のボリンジャーバンド設定画面上で見るとイメージしやすいですね。

MT4のボリンジャーバンド設定画面(期間と偏差)
※ボリンジャーバンドの設定画面で触りそうなのは(3:期間、4:偏差)ですね

7:モードは、上線の値が欲しい場合はMODE_UPPERとし、中央線の値が欲しい場合はMODE_MAIN、下線の値が欲しい場合はMODE_LOWERとします。

ボリンジャーバンド線の解説

8:バーシフトは過去のボリンジャーバンド値をとりたい場合変更します(0:最新バーの位置、1:1つ前のバーの位置)

ローソク足確定でエントリーしたい場合

今回のEAは、私が自作している他のEAとは違いtickでのエントリーとなっています。もし、ローソク足確定でエントリしたい場合は、

   double ea_order_stop_price = 0; //ストップロスレート
   double ea_order_good_price = 0; //利確レート

上記(void OnTick()の上の方)を目印に下記をコピペで入れて下さい。

   //新しい足ができた時だけやる
   if(Time[0] != prevtime){
      prevtime = Time[0];
   }else{
      return;
   }

3σで売り買いしたい場合

上記サンプルソースは2σでエントリーするタイプで作りましたが、もし3σでエントリーしたいといった場合、まず以下の部分を全て削除してください。

      double BB2UP = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_UPPER,0); //2σの上側
      double BB2LO = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_LOWER,0); //2σの下側
   
   
      // --- 3σタッチで待機モードに入る ---
      if(Ask > BB3UP)   waitBB =  1; // 買い待ち
      if(Bid < BB3LO)   waitBB = -1; // 売り待ち
      
      // --- 待機モード中の処理 ---
      if(waitBB ==  1 && Ask < BB2UP && Bid > BB2LO){
         isBullBollinger_S = true;  // 買いエントリー
         waitBB  = 0;   // 待機解除
      }
      else if(waitBB == -1 && Bid > BB2LO && Ask < BB2UP){
         isBearBollinger_S = true;  // 売りエントリー
         waitBB  = 0;   // 待機解除
      }

消した場所に以下を追加します。

      // --- 3σタッチでエントリーする ---
      if(Ask > BB3UP)  isBullBollinger_S = true;  // 買いエントリー
      if(Bid < BB3LO)  isBearBollinger_S = true;  // 売りエントリー

決済タイミング

OCOの形で、TP/SLをパラメータ設定で変更可能です。

新規注文について

本記事のMACD EAで使用している「新規注文処理」は、当サイト共通のベースソースに含まれています。
EAを効率的に自作したい方は、以下の記事もあわせて参考にしてください。
👉 MT4 EAベースソースコード(無料配布・カスタマイズ容易)
👉 新規・変更・決済注文関数の詳しい解説はこちら

パラメータとカスタマイズ

今回のパラメータ設定は以下の通り:

  • 取引ロット数(0.01で1000通貨)
  • 利確(pips)
  • 損切り(pips)
  • ボリンジャーバンドの期間(例:20)

👉 値を調整することで、短期トレード〜長期トレードまで幅広く対応可能です。

ボリンジャーバンドEAのパラメータ設定入力画面

EAバックテストレポート

USDJPY(H1, 2024/08〜2025/08, 初期証拠金100万円, FXTFヒストリカル)での結果:

通貨ペア・時間足PF勝率最大DD取引回数備考
USDJPY M151.9366%0.17%103回取引回数は少ないものの、かなり安定した成績
バックテストレポート

まとめ

以上、ボリンジャーバンドを使ったEAのサンプルソースでした。

今回は、ボリンジャーバンドの王道である3σで逆張りが全然機能しなかったので、順張り方向でのエントリーで考える事で良い感じに利益を出す事ができました。

順張りEAでは、トレンドが本当に発生している相場だけを選別することが重要です。
ボリンジャーバンドと併用しやすい指標として、トレンドの強さを数値で判断できるADXがあります。

👉 MT4でADXを使ったEAの作り方|トレンド判定ロジック解説
👉 MT4でADX連携ボリンジャーバンドEAを作成|順張り特化MQL4サンプル解説

今回のEAをベースに、ADX等を組み合わせることで、より実用的なロジックへ発展させることも可能です。

🛠️ EAを効率的にカスタマイズしたい方へ
▶ 【MT4 EAベースソース】を無料公開中!初心者でもすぐに使えます。


✅ 今回のロジックをベースにしたEAサンプルも多数公開中

今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。

ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。


📊 EA運用・検証フェーズに進みたい方へ

今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。


EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。

コメント

  1. masaさんのアイコン masa より:

    勉強させてもらってます。ありがとうございます。

    SL=28, TP=28にすると同じようなバックテスト結果になるのですが、Pipsの計算が変わったりしているのでしょうか?

    • りょう りょう より:

      masa さん。
      記事を見て頂きましてありがとうございます。返信が遅れてしまいました。
      ご質問の件ですが、すこしソースコードを修正しておりまして現在はSTとTPは28で同じような結果になると思います。
      ※元々280で28pips設定でしたが、28で28pipsになるよう修正しました。

タイトルとURLをコピーしました