English Русский 中文 Español Deutsch Português
preview
知っておくべきMQL5ウィザードのテクニック(第38回):ボリンジャーバンド

知っておくべきMQL5ウィザードのテクニック(第38回):ボリンジャーバンド

MetaTrader 5トレーディングシステム |
335 5
Stephen Njuki
Stephen Njuki

はじめに

ボリンジャーバンドは、1987年にジョン・ボリンジャーが開発した人気のテクニカル指標で、3本の線(またはデータバッファ)で構成されています。その主な機能は、取引されている証券の買われすぎおよび売られすぎの価格ポイントを特定し、市場のボラティリティを定量化する方法を提供することです。ボリンジャーバンドは市場のボラティリティによって拡大および縮小し、ボラティリティが増加すると2つの外側バンドは離れ、ボラティリティが縮小すると2つの外側バンドは近づきます。

トレーダーは、この拡大と縮小を利用して価格のブレークアウトや保合期間を予測します。また、上バンドと下バンドは動的な支持と抵抗のレベルとしても機能し、価格がこれらのレベルから反発する傾向があるため、反転や継続の潜在的な手がかりにもなります。ボリンジャーバンドは多くの場合、平均回帰戦略をサポートします。この戦略では、価格が上バンドや下バンドに触れた後、中間バンド(平均)に戻ることが期待されます。買われすぎや売られすぎの状態は、価格が外側のバンドを越えて伸び、潜在的な反転ポイントを示唆する場合にも判断されます。 

さらに、価格が一貫して上バンドに近い場合は強気トレンドが近づいていることを示し、価格が下バンドに近い場合は下降トレンドが続いていることがよくあります。したがって、バンドからのブレークアウト(またはブレークアウェイ)は、新しいトレンドの開始または転換点を示す可能性があります。最後に、ボリンジャーバンドのスクイーズは、上バンドと下バンドが一定期間非常に接近してボラティリティが低く、ブレークアウトの機会が迫っている場合に発生します。  トレーダーはこのスクイーズを注意深く監視し、ブレークアウトの方向を判断する手がかりとして使用します。3つのデータバッファの式はシンプルで、次の式で表すことができます。

ここで

  • MBはミドルバンドバッファ
  • SMAは単純移動平均関数
  • Pは終値の履歴
  • nは単純移動平均を計算する期間

ここで

  • UBは上バンドバッファ
  • κは調整可能な係数で、デフォルトでは2が割り当てられることが多い
  • σは平均化された期間における標準偏差

ここで

  • LBは下バンドバッファ

この記事の目的は、ボリンジャーバンドが生成するさまざまなシグナルを列挙するだけでなく、それらを1つのカスタムシグナルクラスファイルに統合する方法を示すことにあります。通常、本連載ではアイデアの背後にある理論が最初に提示され、戦略のテストとその結果が最後に示される構成です。しかし、この記事では、以前の記事と同様に、各シグナルセットアップのコードと共にそのテスト結果も紹介します。つまり、最後にまとめて結果を示すのではなく、記事全体にわたって複数のテスト結果を共有します。今回は、トレーダーが活用できる可能性のあるボリンジャーバンドのシグナルを最大8つ検討します。

カスタムシグナルクラスは、さまざまな戦略を組み合わせることで多用途で堅牢なシグナルの開発を可能にし、さらに最小限のコーディングアプローチにより、短時間でアイデアの迅速なテストと交差検証をおこなう上で重要です。この記事の最後に添付してあるコードは、MQL5ウィザードを使ってエキスパートアドバイザー(EA)を組み立てる際に使用でき、新しい読者はこちらおよびこちらでその方法についてのガイダンスを参照できます。アイデアが交差検証された後、トレーダーは構築したEAを展開するか、基本戦略を保持しつつ取引執行をカスタマイズするために再コーディングするかを選択することができます。

シグナルについて説明する前に、これらの8つのシグナルオプションに対応できるカスタムシグナルクラスの準備方法について簡単に解説しておくと役立つでしょう。以下は、カスタムシグナルクラスのインターフェイスです。

//+------------------------------------------------------------------+
//| Class CSignalBollingerBands.                                     |
//| Purpose: Class of generator of trade signals based on            |
//|          the 'BollingerBands' indicator.                         |
//| Is derived from the CExpertSignal class.                         |
//+------------------------------------------------------------------+
class CSignalBollingerBands : public CExpertSignal
{
protected:
   CiBands           m_bands;            // object-indicator

   ....

   //--- "weights" of market models (0-100)
   int               m_pattern_0;      // model 0 "Price Crossing the Upper Band or the Lower Band"
   int               m_pattern_1;      // model 1 "Price Bouncing Off Lower Band or Upper Band "
   int               m_pattern_2;      // model 2 "Price Squeeze Followed by a Breakout Above Upper Band or Below Lower Band "
   int               m_pattern_3;      // model 3 "Price Double Bottoms Near Lower Band or Double Top Near Upper Band "
   int               m_pattern_4;      // model 4 "Price Bounces Off the Middle Band from Above & Bounce Off from Below "
   int               m_pattern_5;      // model 5 "Volume Divergence at Lower Band or Upper Band "
   int               m_pattern_6;      // model 6 "Bands Widening After Downtrend or After Uptrend "
   int               m_pattern_7;      // model 7 "Bands Orientation and Angle Changes "
   uchar             m_patterns_used;  // bit-map integer for used pattens

public:
                     CSignalBollingerBands(void);
                    ~CSignalBollingerBands(void);
   
  ....

protected:
   
   ...


   //--- methods to check for patterns
   bool              IsPattern_0(ENUM_POSITION_TYPE T);
   bool              IsPattern_1(ENUM_POSITION_TYPE T);
   bool              IsPattern_2(ENUM_POSITION_TYPE T);
   bool              IsPattern_3(ENUM_POSITION_TYPE T);
   bool              IsPattern_4(ENUM_POSITION_TYPE T);
   bool              IsPattern_5(ENUM_POSITION_TYPE T);
   bool              IsPattern_6(ENUM_POSITION_TYPE T);
   bool              IsPattern_7(ENUM_POSITION_TYPE T);
};

これはほとんどのカスタムシグナルに対する標準的なアプローチに従っていますが、この記事で主に追加したのは、コード内で強調表示されているm_pattern_XX変数です。これらの変数は重み付け(0~100の範囲の値)を表しており、ウィザードを使用してアセンブルされるカスタムシグナルクラスでよく利用されます。たとえば、エンベロープシグナルクラスRSIシグナルクラスがあります。これらのクラスでは、ほとんどの場合、100未満のプリセット定数重みを持つこれらのパターン変数を使用します。パターン変数に定数重みを割り当てること自体は問題ではありません。なぜなら、各クラスは他のシグナルクラスと共に使用され、最適化や調整が行われるのは全体のEAシグナルに対する各クラスの相対的な重みだからです。

しかし、最適化の概念には課題もあります。特定の取引銘柄や証券に過剰適合するリスクがあるため、これらのパターンを使用する際、トレーダーは各パターンの相対的な重要性と重み付けを理解していることが求められます。トレーダーがそのためにオプティマイザを必要とすることは少ないでしょう。さらに、複数のシグナルクラスが独自のパターンを持っている場合、最適化要件が非常に増加します。そのため、訓練される重みではなく「知識ベース」の定数としてこれらのパターンを持つ方が適切です。

ただし、この記事では例外的にこれらのパターンを最適化するオプションも検討します。なぜなら、このクラスがウィザード内でのみアセンブルされるため、他のシグナルに対して重み付けされることがないからです。このシグナルの重み付けパラメータは、他のシグナルクラスと同様に1.0のままとします。加えて、通常は特定のパターンのみが使用され、他のパターンはアイドル状態になります。これは、シグナルクラスが他のシグナルと共にアセンブルされる際、最適化によって選択されたパターンのみが機能し、選ばれなかったパターンはアイドル状態になるということです。

この記事では、すべてのパターンを積極的に使用します。パターンはロングおよびショートの条件を示すペアになっており、異なるタイプのパターンが同時に表示されることは稀です(パターン1とパターン2が同時にシグナルを出す可能性はありますが、単一のパターンがロングとショートの条件を同時に示すことはありません)。そのため、1つのパターンがロングポジションを示し、別のパターンが別のタイミングでショートポジションやクローズのシグナルを出す可能性があります。このカスタムシグナルクラスはクローズとオープンの閾値を持ち、特定のパターンが存在する際に最適化された値に応じて既存のポジションをクローズしたり、新たな反転ポジションを開くことが可能です。したがって、EAは、1つの銘柄について、短期間でこれらのパターンの重みを最適化し、それによって何か興味深いものが得られるかどうかを確認します。

カスタムシグナルクラスは、パターンのビットマスク整数を入力として受け取るPatternsUsage関数を備えたCExpertSignalクラスから継承されます。最大8つのシグナルパターンを使用できるため、ビットマップの範囲は0から2の8乗マイナス1である255までとなります。これは、個々のパターン閾値(これらの閾値によってポジションのクローズとオープンが設定されます)を決定するだけでなく、8つのパターンの中からボリンジャーバンドを使用する戦略において最適なパターンを選択することを意味します。同時に使用するパターンの組み合わせの選択は、この記事の最後にある最終テスターレポートに示されています(記事が長いため、次回に延期されます)。使用可能な各パターンについて、EAが単一のパターンを使用した場合のテスト結果を以下に示します。

しかし、テストの結果、使用されたパターンの数を割り当てても、期待どおりに定義関数IS_PATTERN_USAGE()の使用が適切に有効になりません。使用されたパターンの数としてデフォルトで-1が割り当てられ、すべてのパターンが使用可能であることを意味するこの設定は、入力内容に関係なく常に実装されているようです。この問題を回避するために、入力ハッシュマップの整数を0と1に変換し、どのパターンが選択されたかを読み取る独自のビット単位の実装を使用します。以下の表は、主要な8つのパターンマップと、コード内でそれらをどのように解釈するかについてのガイドとして役立ちます。

入力マップ 
(m_patterns_used)

暗黙のビット
byte-checker
100000001
0x01
200000010
0x02
400000100
0x04
800001000
0x08
1600010000
0x10
3200100000
0x20
6401000000
0x40
12810000000
0x80

ご覧のとおり、リストされた8つのマップはそれぞれ、1つのパターンの使用を意味します。これは、8文字の文字列全体において1つのビットだけが1で、残りはすべて0である暗黙のビットによって示されます。入力は実際には0から255までの任意の値に割り当てることができるため、符号なし文字(ucharデータ型)として扱われます。


上バンドまたは下バンドを超える価格

最初のシグナルは、価格が上バンドまたは下バンドのいずれかを越えた時に発生します。価格が上から上バンドを越えて下回る場合、これを弱気シグナルと解釈します。逆に、価格が下から下バンドを越えて上回り、終値を付けた場合、これを強気シグナルと解釈することがあります。このロジックは、パターン0をチェックする関数に次のように実装します。

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_0(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Close(StartIndex() + 1) < Lower(StartIndex() + 1) && Close(StartIndex()) > Lower(StartIndex()))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(StartIndex() + 1) > Upper(StartIndex() + 1) && Close(StartIndex()) < Upper(StartIndex()))
   {  return(true);
   }
   return(false);
}

コードは非常にシンプルです。これは、MQL5の標準ライブラリコードのおかげです。MQL5では、ボリンジャーバンド指標のコーディングが最小限に抑えられており、指標のクラスインスタンスを宣言すると、次のようになります。

//+------------------------------------------------------------------+
//| Class CSignalBollingerBands.                                     |
//| Purpose: Class of generator of trade signals based on            |
//|          the 'BollingerBands' indicator.                         |
//| Is derived from the CExpertSignal class.                         |
//+------------------------------------------------------------------+
class CSignalBollingerBands : public CExpertSignal
{
protected:
   CiBands           m_bands;            // object-indicator
   
  ...

  ...

};

そして、次のように初期化されます。

//+------------------------------------------------------------------+
//| Create indicators.                                               |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::InitIndicators(CIndicators *indicators)
{
//--- check pointer
   if(indicators == NULL)
      return(false);
//--- initialization of indicators and timeseries of additional filters
   if(!CExpertSignal::InitIndicators(indicators))
      return(false);
//--- create and initialize MA indicator
   if(!InitMA(indicators))
      return(false);
//--- ok
   return(true);
}

上記の関数に示されているように、更新するだけで済みます。上バンド、下バンド、メイン(またはミドル)バンドに対応する関数がクラス内に組み込まれているため、バッファ番号について心配する必要はありません。また、メイン銘柄の始値、高値、安値、終値は、次のようにクラスコンストラクタ内で宣言されている場合、参照クラス内で初期化されます。

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CSignalBollingerBands::CSignalBollingerBands(void) 
...

{
//--- initialization of protected data
   m_used_series = USE_SERIES_OPEN + USE_SERIES_HIGH + USE_SERIES_LOW + USE_SERIES_CLOSE;
   ...
}

この場合も、現在の価格を取得する前に、各バーのそれぞれの価格ハンドルを更新するという要件だけが残ります。このケースでは、終値を使用しているため、更新する必要があるのはそれだけです。ウィザードで組み立てられたEAでテストを実行します。ここでは、最初のパターンのみを使用しているため、パターンの使用済み入力ビットマップを1に割り当てます。パターン0のみを使用している間に部分的に最適化されたテスト結果から、次のレポートが得られます。

r0

c0

上記の結果は、2023年の毎日の時間枠でのUSDCHFテスト実行によるものです。パターン0のみを使用しているため、使用されるパターンの入力ハッシュマップ整数は1ですこの記事の下部にあるコードで共有されているロングとショートの条件に基づき、すべてのパターンのテスト結果とともに、次のようにこのパターンをチェックします。


外側バンドでの反発

次のシグナルは、どちらかの外側のバンドでの価格の反発です。価格が上バンドに触れてから後退した場合、これは弱気シグナルと推測されます。逆に、価格が下部ボリンジャーバンドまで下落してから回復した場合、これは強気シグナルを示すと解釈されます。この解釈は、上バンドと下バンドが重要な反転ゾーンであることに由来しています。これは、トレーダーが価格が特定の方向に過度に上昇すると修正が必要だと感じる市場の心理によって説明できます。ボリンジャーバンドは、ベースライン(またはミッド)バッファのおかげでトレンドを追跡するだけでなく、ボラティリティも監視していることを思い出してください。したがって、価格がいずれかの外側のバンドに近づくか、外側のバンドが広がると、ボラティリティが暗示されます。

代替指標となる確認ツールは、理想的にはボリンジャーバンドと一緒に使用します。このチェックを実装するには、MQL5で外側のバンドから跳ね返らせるために、次のソースを使用します。

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_1(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Close(StartIndex() + 2) > Lower(StartIndex() + 2) && Close(StartIndex() + 1) <= Lower(StartIndex() + 1) && Close(StartIndex()) > Lower(StartIndex()))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(StartIndex() + 2) < Upper(StartIndex() + 2) && Close(StartIndex() + 1) >= Upper(StartIndex() + 1) && Close(StartIndex()) < Upper(StartIndex()))
   {  return(true);
   }
   return(false);
}

最大8つのパターンを使用しており、上記の表からわかるように、2番目のパターンの入力マップ(使用されるパターン入力)は2です。これにより、ロングとショートの条件を確認するときに、このパターン(上バンドと下バンドの跳ね返り)のみを使用することが保証されます。2023年の日次時間枠でUSDCHFペアのテストを実行すると、次の結果が得られます。

r1

с1

この設定で機能するように開発できる取引の影響と可能な戦略には、リミットストップ注文の使用が含まれます。これらの極端なバンドに触れる前に、上限または下限のバンドがどの価格レベルにあるかを示す指標があるため、この情報と、反転が発生したときにトリガーされる適切なストップ価格を使用して、これらの取引をおこなうことができます。



価格スクイーズ後の外側バンドのブレークアウト

パターンタイプ2は、価格がスクイーズを経てブレークアウトするパターンです。価格のスクイーズとは、通常、ボラティリティが低く、長期間にわたって続く状態を指します。ボリンジャーバンドでは、この状態が上バンドと下バンドの間のギャップが狭くなることで示されます。ギャップの期間の長さには主観的な判断が必要ですが、私たちの目的では、単に、スクイーズが上限と下限の両方に向かって同時に縮小していくものとして解釈します。言い換えれば、スクイーズが1バーの長さであれば、それを使用します。以下は、このロジックをMQL5で実装したものです。

//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_2(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   if(Upper(StartIndex()) > Upper(StartIndex() + 1) && Upper(StartIndex() + 1) < Upper(StartIndex() + 2)  && Lower(StartIndex()) < Lower(StartIndex() + 1) && Lower(StartIndex() + 1) > Lower(StartIndex() + 2))
   {  if(T == POSITION_TYPE_BUY && Close(StartIndex()) >= Upper(StartIndex()))
      {  return(true);
      }
      else if(T == POSITION_TYPE_SELL && Close(StartIndex()) <= Lower(StartIndex()))
      {  return(true);
      }
   }
   return(false);
}

実際、コードでは、スクイーズ期間は厳密に1バーと設定しています。上バンドと下バンドの間のギャップの広さについては考慮していませんが、これはスクイーズを定義する際に考慮すべきもう1つの重要な要素です。前述のソースコードでは、下バンドのスパイクと同時に上バンドが落ち込む現象をスクイーズと見なしています。このスクイーズ後に価格が上バンド付近、またはそれに近い位置にある場合、強気のシグナルとして解釈されます。一方、価格が下バンドに近い位置にある場合は、それを弱気のシグナルと見なします。このパターンだけでテストを実行した結果は以下の通りです。

r2

c2

上記の結果は、2023年にUSDCHF銘柄の日次時間枠で実行された簡単な最適化から得られたもので、交差検証されておらず、パターン2の可能性を示すことのみを目的としています。


下バンド付近のダブルボトムまたは上バンド付近のダブルトップ

このパターンもリストに載っており、率直に言ってパターン1(上記の2番目のパターン)と少し似ています。主な違いは、パターン1では1回だけ跳ね返ったのに対し、ここでは外側のバンドから1回以上跳ね返ることです。したがって、パターン3とラベル付けされたこのパターンは、確認済みのパターン1と考えることができます。このため、このパターンだけに頼って取引設定に入ることはあまりありません。MQL5 での実装は次のとおりです。

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_3(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if
   (
      T == POSITION_TYPE_BUY &&
      Close(StartIndex() + 4) < Close(StartIndex() + 3) &&
      Close(StartIndex() + 3) > Close(StartIndex() + 2) &&
      Close(StartIndex() + 2) < Close(StartIndex() + 1) &&
      Close(StartIndex() + 1) > Close(StartIndex()) &&
      Close(m_close.MinIndex(StartIndex(), 5)) - Upper(StartIndex()) >= -1.0 * Range(StartIndex())
   )
   {  return(true);
   }
   else if
   (
      T == POSITION_TYPE_SELL &&
      Close(StartIndex() + 4) > Close(StartIndex() + 3) &&
      Close(StartIndex() + 3) < Close(StartIndex() + 2) &&
      Close(StartIndex() + 2) > Close(StartIndex() + 1) &&
      Close(StartIndex() + 1) < Close(StartIndex()) &&
      Lower(StartIndex()) - Close(m_close.MaxIndex(StartIndex(), 5)) >= -1.0 * Range(StartIndex())
   )
   {  return(true);
   }
   return(false);
}

このパターンのみでの取引を制限する入力マップがビットマップ4です。上の参照表からわかるように、暗黙のビットを見ると、右から数えて左へ向かうとき、パターン3を表す4番目の文字以外はすべてゼロです。上記と同様の設定、USDCHF、日足時間枠、2023でテストを実行すると、次の結果が得られます。

r3

c3

明らかに、上バンドまたは下バンドのいずれかでダブルボトムが発生することは一般的ではないため、多くの取引はおこなわれません。これは、おそらく、上で見たいくつかのパターンとは異なり、このパターンは別の指標と組み合わせることなく独立して使用できることを意味しています。


ミドルバンドでの反発(上方向・下方向)

次のパターンは、パターン5番目で、これはトレンドの途中で継続的な動きを示すパターンです。価格が特定の方向にトレンドしているとき、一時的に停滞する場面がよく見られます。このようなブレーク期間中は、トレンドの進行よりも急激な変動が起こりやすいですが、トレンドが再開する前に価格が抵抗(下降トレンドの場合)または支持(上昇トレンドの場合)をテストすることがよくあります(必ずしもそうなるわけではありません)。これらのテストは、ボリンジャーバンドのベースバッファで示され、上バンドや下バンドと同様に、ボリンジャーバンドは動的な支持および抵抗レベルとして機能することが多いです。

このパターンでは、価格が上から中間バンド(ベース)をテストし、そこから上方向に反発する場合、強気のパターンと解釈します。逆に、下方向に反発した場合は、弱気のパターンと解釈されます。MQL5での実装は次の通りです。

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_4(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Close(StartIndex() + 2) > Base(StartIndex() + 2) && Close(StartIndex() + 1) <= Base(StartIndex() + 1) && Close(StartIndex()) > Base(StartIndex()))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(StartIndex() + 2) < Base(StartIndex() + 2) && Close(StartIndex() + 1) >= Base(StartIndex() + 1) && Close(StartIndex()) < Base(StartIndex()))
   {  return(true);
   }
   return(false);
}

上記と同様の環境設定でテストすると、次の結果が得られます。

r4

c4

ボリンジャーバンド指標は、この記事のすべてのテスト実行を通じて同じ設定を使用しており、期間は20、偏差は2です。


外側バンドでのボリュームの乖離

次に紹介するのは、ボリュームとボラティリティの乖離を追跡する6番目のパターンです。現在、多くのトレーダー、特にこのプラットフォームを利用しているトレーダーは外国為替ペアを取引していますが、複数のブローカー間でデータを統合することが難しく、そのため信頼できるボリュームデータが不足していることが多いです。そのため、ボリュームを追跡または測定する代わりに、「価格バーの範囲」を使うことが一般的です。この理由は、特定のペアに多くの買い手が入札すると、価格がその入札方向に大きく動くということです。もちろん、これは完全な真実ではなく、反対側の同数のショート契約が価格の動きを妨げる可能性もあります。しかし、関連する合計ボリュームは最終的にバーの価格範囲に反映されません。

このアプローチはあくまで妥協策ですが、次のようなパターンが発生した場合、強気または弱気のシグナルとして解釈します。まず、価格バーの範囲が3つの連続した価格バーで系統的に減少し、同時に終値がボリンジャーバンドの下限を下回った場合は、強気のシグナルと解釈します。逆に、価格バーの範囲が3つのバーで減少し、終値がボリンジャーバンドの上限を上回った場合は、弱気のシグナルとなります。このパターンが示唆するのは、以前のトレンドが枯渇し、価格範囲の極端な端での「ボリューム」の減少が反転、または少なくともプルバックを予兆している可能性があるということです。これをMQL5で次のように実装しています。

//+------------------------------------------------------------------+
//| Check for Pattern 5.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_5(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if(Range(StartIndex()) < Range(StartIndex() + 1) && Range(StartIndex() + 1) < Range(StartIndex() + 2))
   {  if(T == POSITION_TYPE_BUY && fabs(m_close.GetData(StartIndex()) - Lower(StartIndex())) < fabs(m_close.GetData(StartIndex()) - Base(StartIndex())))
      {  return(true);
      }
      else if(T == POSITION_TYPE_SELL && fabs(m_close.GetData(StartIndex()) - Upper(StartIndex())) < fabs(m_close.GetData(StartIndex()) - Base(StartIndex())))
      {  return(true);
      }
   }
   return(false);
}

これまでのテストと同様の実行環境設定で、このパターンだけでテストを実行したところ、次のような結果が得られます。

r5

c5


結論

今回の記事では、ボリンジャーバンド指標に基づく8つのパターンのうち5つを解説しました。記事が少し長くなりすぎたため、残りの部分については次回のフォローアップ記事で詳しくご説明します。

結論として、ボリンジャーバンドを使った取引では、少なくとも8つのシグナルパターンが使用可能で、そのうち5つを今回取り上げました。この指標は、価格の一般的な傾向を把握するだけでなく、2つの外側のバンドバッファによりボラティリティも追跡します。市場心理をこれと組み合わせることで、この1つの指標からさまざまなシグナルを生成することが可能です。各パターンは単独で使用することもできますが、入力パラメーターを調整することで複数のパターンを組み合わせ、さまざまな市場に合わせたより動的な設定にすることができます。次回の記事では、これらに加え、さらに多くのポイントについて取り上げたいと考えています。

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/15803

添付されたファイル |
SignalWZ_38.mqh (21.4 KB)
wz_38.mq5 (8.67 KB)
最後のコメント | ディスカッションに移動 (5)
Livio Alves
Livio Alves | 13 9月 2024 において 17:29
よくやった!この結果のセットファイルを共有できますか?
Stephen Njuki
Stephen Njuki | 16 9月 2024 において 11:43
Livio Alves #:
よくやった!この結果のセットファイルを共有できますか?

いいえ。あまりに特殊だから。

Chika Echezona Anumba
Chika Echezona Anumba | 21 4月 2025 において 16:41
スティーブンに感謝します。

3つ目のパターンのコード部分について説明してもらえますか?
Close(m_close.MinIndex(StartIndex(), 5)) - Upper(StartIndex()) >= -1.0 * Range(StartIndex())
Roman Shiredchenko
Roman Shiredchenko | 21 4月 2025 において 17:06
Chika Echezona Anumba #:
良い記事をありがとう。

3つ目のパターンのコードのいくつかを説明してもらえますか?
範囲が与えられた開始範囲を超えている - 変数名は意味がある....
whylis
whylis | 21 7月 2025 において 12:49
シグナル3に間違いがあると思います。Rangeの代わりにGapと書きたかったのでしょう。
クローズ(m_close.MinIndex(StartIndex(), 5)) - アッパー(StartIndex()) >= -1.0 * ギャップ(StartIndex())
MQL5-Telegram統合エキスパートアドバイザーの作成(第6回):レスポンシブなインラインボタンの追加 MQL5-Telegram統合エキスパートアドバイザーの作成(第6回):レスポンシブなインラインボタンの追加
この記事では、インタラクティブなインラインボタンをMQL5エキスパートアドバイザー(EA)に統合し、Telegram経由でリアルタイムにコントロールできるようにします。各ボタンを押すたびに特定のアクションがトリガーされ、ユーザーにレスポンスが返されます。また、Telegramメッセージやコールバッククエリを効率的に処理するための関数もモジュール化します。
MQL5で取引管理者パネルを作成する(第2回):応答性と迅速なメッセージングの強化 MQL5で取引管理者パネルを作成する(第2回):応答性と迅速なメッセージングの強化
この記事では、以前作成した管理パネルの応答性を強化します。さらに、取引シグナルの文脈におけるクイックメッセージングの重要性についても検討します。
ディープラーニングを用いたCNA(因果ネットワーク分析)、SMOC(確率モデル最適制御)、ナッシュゲーム理論の例 ディープラーニングを用いたCNA(因果ネットワーク分析)、SMOC(確率モデル最適制御)、ナッシュゲーム理論の例
以前の記事で発表されたこれら3つの例にディープラーニング(DL)を加え、以前の結果と比較します。目的は、他のEAにディープラーニングを追加する方法を学ぶことです。
Connexus入門(第1回):WebRequest関数の使い方 Connexus入門(第1回):WebRequest関数の使い方
この記事は、MQL5でHTTPリクエストを容易にするための「Connexus」と呼ばれるライブラリの開発シリーズの始まりです。このプロジェクトの目標は、エンドユーザーにこの機会を提供し、このヘルパーライブラリーの使い方を示すことです。学習を容易にし、将来の発展の可能性を提供するために、できるだけシンプルにすることを意図しました。