English Русский 中文 Español Deutsch Português
preview
ビル・ウィリアムズのMFIによる取引システムの設計方法を学ぶ

ビル・ウィリアムズのMFIによる取引システムの設計方法を学ぶ

MetaTrader 5トレーディング | 4 5月 2023, 09:49
540 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

はじめに

最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶための連載の新しい記事です。この記事では、特に他のテクニカルツールと併用することでより良い洞察を得ることができる、読者の取引に役立つ新しいテクニカルツールを紹介します。今回はビル・ウィリアムズの「マーケット・ファシリテーション・インデックス(BW MFI、Bill Williams' Market Facilitation Index)」を取り上げます。この指標は、以下のトピックを通じてカバーされます。

  1. BW MFIの定義
  2. BW MFI戦略
  3. BW MFI戦略の設計図
  4. BW MFI取引システム
  5. 結論

この記事の戦略をテストするためにMetaTrader 5取引プラットフォームを使用し、また記事の取引システムを構築するためにMQL5(MetaQuotes言語)IDEを使用する予定です。ダウンロードの仕方や使い方がわからない方は、前の記事から「MetaEditorでMQL5コードを書く」のトピックを読んでいただくと詳細がわかると思います。

この記事で紹介した戦略はすべて教育目的であり、実際の口座で使用する前にテストする必要があります。確かに最適化が必要です。すべての人に適した戦略は存在しません。中には読者の取引スタイルに合わないものもあるかもしれません。また、読んだ内容を自分で実践してみることは、プログラミングのスキルアップにつながるので、コーダーにもとても役に立つと思います。

免責事項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。


BW MFIの定義

このトピックでは、MFI (Market Facilitation Index)指標について詳しく学びます。著名なトレーダーかつ作家のビル・ウィリアムズが開発したテクニカル指標の1つです。この指標は、価格だけでなく、ボリュームも調査・分析することで、相場の方向性を測ることを目的としています。市場の将来の動きを検出するのに役立つ可能性があり、現在の価格の動きの強さ(続くかまたは逆転する可能性があるか)についての洞察も提供するため、トレーダーに役立つものです。市場の強者と取引し、正しい判断を下すのに役立つので、私たちにとって非常に有益です。

状況を把握するためには、MFIとボリュームを分析することができます。以下の通りに場合分けできます。

  • BW MFIとボリュームが増加した場合、市場参加者がこの金融商品に関心を示していることを示す
  • BW MFIとボリュームが減少した場合、市場参加者がこの金融商品に関心を示していないことを示す
  • BW MFIが上昇してボリュームが減少した場合は、現在の動きがボリュームに支えられていないことを示す
  • BW MFIが減少してボリュームが増加した場合、市場では買い手と売り手のバランスがとれていることを示す

次に、BW MFIを手動で計算する方法を紹介します。MetaTrader 5に内蔵されている指標を使用すればよいので、現在では手動計算は必要はありません。BW MFIを算出するには、高値から安値を引いた結果をボリュームで割ります。

BW MFI = (High - Low) / Volume

ここで、

High:最高値
Low:最安値
Volume:現在のボリューム

しかし、上述したように、実は手動で計算する必要はなく、MetaTrader 5で利用できる指標の中から選ぶだけでいいのです。以下、その方法を紹介します。

MetaTrader 5ターミナルを開き、[挿入]メニュー→[指標]→Bill Williams→Market Facilitation Indexを選択します。下図のようになります。

BW MFIの挿入

その後、指標のウィンドウが以下のように表示されます。

BW MFIウィンドウ

1:MFIとボリュームが増加した場合を示す色

2:MFIとボリュームが減少した場合を示す色

3:MFIが増加し、ボリュームが減少した場合を示す色

4:MFIが減少し、ボリュームが増加する場合を示す色

5:ボリュームタイプ(TickまたはReal)

6:指標のバーの太さ

上記のパラメータを決定し、[OK]を押すと、以下の例と同じようにチャートに指標が接続されていることがわかります。

BW MFIの接続

前の図でお分かりのように、チャートのサブウィンドウに指標が表示されます。BW MFI指標の算出に基づく価格とボリュームに応じて、異なる値や色のバーとして表示されます。指標のすべての色と値は、価格の動きの特定の状態を示しています。

  • 緑色のバー:BW MFIとボリュームの増加を意味し、市場参加者がこの商品に関心を持っていることを示す
  • 茶色のバー:BWのMFIとボリュームが減少していることを意味し、この楽器に興味を持つ人がいないことを示す
  • 青色のバー:BW MFIが上昇し、ボリュームが減少していることを意味し、市場の動きがボリュームによって支持されていないことを示す
  • ピンクのバー:BW MFIが低下し、ボリュームが増加することを意味し、強気と弱気のバランスがとれていることを示す

BW MFI戦略

このトピックでは、教育を目的としたBW MFI指標の主旨に基づき、簡単に使える戦略を紹介します。より良い結果を得るためには、最適化、パラメータの変更、他のテクニカル指標との組み合わせが必要であることを忘れないでください。実際の口座で使用する前には、テストして、利益が出るか取引に役立つかを確認することが非常に重要です。

戦略1:BW MFI - Movement Status

この戦略では、BW MFI値とボリューム値の順序に基づいて、BW MFI指標の動きの状況を把握する必要があります。それによると、4つの状態を持つことになります。

  • 現在のBW MFIが前より大きく、かつ現在のボリュームが前より大きい場合(緑色のバー、Green状態のシグナル)
  • 現在のBW MFIが前より小さく、かつ現在のボリュームが前より小さい場合(茶色のバー、Fade状態のシグナル)
  • 現在のBW MFIが前より大きく、かつ現在のボリュームが前より小さい場合(青色のバー、Fake状態のシグナル)
  • 現在のBW MFIが前より小さく、かつ現在のボリュームが前より大きい場合(ピンク色のバー、Squat状態のシグナル)

単純に言うと次のようになります。

  • 現在のBW MFI > 前のBW MFI、かつ現在のボリューム > 前のボリューム ==> Green状態-緑色のバー
  • 現在のBW MFI < 前のBW MFI、かつ現在のボリューム< 前のボリューム ==> Fade状態-茶色のバー
  • 現在のBW MFI > 前のBW MFI、かつ現在のボリューム < 前のボリューム ==> Fake状態-青色のバー
  • 現在のBW MFI < 前のBW MFI、かつ現在のボリューム > 前のボリューム ==> Squat状態-ピンクのバー

戦略2:BW MFI Signals

この戦略では、BW MFI指標の状態に基づいたシグナルを得る必要があります。まず、前の戦略で確認したように、市場の状態を把握する必要があります。そして、それを踏まえて判断することになります。この戦略では、4つのシグナルを持つことになります。

  • 状態がGreenであれば、Find a good entryシグナル(良いエントリを見つける)シグナル
  • 状態がFadeであれば、Find a good exit(良いエグジットを見つける)シグナル
  • 状態がFakeであれば、False breakout probability(偽のブレイクアウトの可能性)シグナル
  • 状態がSquatであれば、Market is Balanced(市場のバランスが取れている)シグナル

戦略3:BW MFI with MA

この戦略では、もう1つのテクニカル指標である移動平均線を用いて売買シグナルを得ます。状態がGreenで、終値が移動平均線を上回っていれば、買いシグナルとなります。もう1つのシナリオは、状態がGreenで、終値が移動平均線を下回る場合で、これは売りシグナルとなります。このようにテクニカル分析の特徴から、テクニカルツールを組み合わせることで、より多くの洞察を得たり、異なる視点を見ることができるのです。また、支持と抵抗、MACD、移動平均線など、生成されたシグナルのフィルタリングに役立つ他のテクニカルツールと一緒におこなうことで、より多くの洞察を得ることができます。

単純に言うと次のようになります。

  • Green状態、かつ終値 > MA ==>買いシグナル
  • Green状態、かつ終値 < MA ==>売りシグナル

BW MFI戦略の設計図

この部分では、取引システムを設計する上で非常に重要なステップである、各戦略のステップバイステップの設計図を考えていきます。設計図は、コンピュータに指示すべきことを視覚化するため、取引システムをスムーズに作成するのに役立ちます。このステップは、これからの戦略の計画ステップと考えることができます。

 戦略1:BW MFI - Movement Status

この戦略では、ティックごとに4つの値を比較してすべての位置を決定するという指標の性質に従って指標のバーの色が決定され、それに基づいて、BW MFI指標の動きのシグナルを得るために使用できる取引システムを作成する必要があります。この4つの値は、現在のBW MFI、前のBW MFI、現在のボリューム、前のボリュームです。それらを確認し、各値の位置を決定するプログラムが必要です。BW MFIの現在値が前より大きく、同時に現在のボリュームが前より大きい場合、取引システムはチャートに「Green State - Green Bar」というコメントを返します。これが最初のケースです。2つ目は、現在のBW MFIが前よりも小さく、同時に現在のボリュームの値が前よりも小さい場合です。取引システムはチャートに「Fade Statue - Brown Bar」というコメントを返します。3つ目のケースは、現在のBW MFIの値が前のより大きく、同時に現在のボリュームの値が前より小さい場合です。システムはチャートに「Fake State - Blue Bar」というコメントを返します。最後の4つ目は、現在のBW MFIの値が前より小さく、同時に現在のボリュームの値が前より大きい場合です。チャートには「Squat State - Pink Bar」というコメントが表示されます。

次のグラフは、Movement Status戦略設計図のものです。

Movement Status設計図

戦略2:BW MFI Signals

この戦略では、指標バーに基づいてすべての状態を特定した後、BW MFI指標のこの状態に基づいてチャートに適切なコメントとしてシグナルを返す取引システムを作成する必要があります。そのためには、1ティックごとに4つの状態を確認し、それに基づいて適切なシグナルを返すことができる取引システムを作成する必要があります。BW MFIの状態が取引システムで確認されるGreen状態であれば、チャートは「Find a good entry」というコメントとしてのシグナルを得る必要があります。指標の状態を確認し、Fade状態であることがわかった場合は2つ目の状態です。取引システムからチャートに「Find a good exit」というコメントとしてのシグナルが返されます。3つ目のシナリオ(状態)は、BW MFIの状態を確認し、Fake状態であることがわかった場合です。取引システムは「False breakout probability」というコメントとしてシグナルをチャートに返します。最後の状態は、Squat状態であることが確認された場合で、チャートは「Market is Balanced」というコメントとしてシグナルを受け取ります。

次のグラフは、シグナル戦略設計図のものです。

BW MFI Signalsの設計図

戦略3:BW MFI with MA

この戦略では、BW MFI指標と単純移動平均線に基づいて売買シグナルを返すことができる取引システムを作成することが必要です。終値、現在の単純移動平均、そしてその4つの状態を識別した後の現在のBW MFI指標の状態を1ティックごとに継続的に確認する取引システムが必要です。終値が単純移動平均の現在値より大きく、同時に現在のBW MFIの状態がGreenであることがわかった場合、チャートにコメントとして買いシグナルが返されます。終値が現在の単純移動平均より低く、同時に現在のBW MFIの状態がGreenであることがわかった場合、チャートにコメントとして売りシグナルをが返されます。他に何かあっても、何も返されません。

以下のグラフは、BW MFI with the MA戦略の設計図です。

BW MFI with the MAの設計図

BW MFI取引システム

この部分では、それぞれの戦略に対応した取引システムの作成を開始します。BW MFIの現在値をチャートにコメントとして返すことで、他の戦略のベースとして利用するための簡単な取引システムの作成を開始します。以下は、そのための手順です。

実数型の1つであるdoubleを使って、分数の値を返すBWMFIArrayのArrayを作成します。

double BWMFIArray[];

この配列のデータをArraySetAsSeries関数で並び替えます。そのパラメータは次の通りです。

  • array[]:作成された配列(BMWFIArray)
  • flag:配列のインデックス方向(true)
ArraySetAsSeries(BWMFIArray,true);

BWMFIDefの整数変数を作成し、「iBWMFI」関数でBill Williams Market Facilitation Indexを定義します。 次のパラメータを指標ハンドルに返します。

  • symbol_name:銘柄(現在の銘柄に適用される_Symbolを使用)
  • timeframe:期間を現在の期間に適用(_Periodを使用)
  • applied_volume - ボリュームの種類(ティックボリューム(VOLUME_TICK)を使用)
int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);

BWMFIArrayのデータを定義して、CopyBuffer関数を使用して結果を保存します。そのパラメータは次の通りです。

  • indicator_handle:指標ハンドル(BWMFIDefを使用)
  • buffer_num:指標バッファの番号(0を使用)
  • start_pos:開始位置(0を使用)
  • count:コピーする量(3を使用)
  • buffer[]:コピー先配列(BWMFIArrayを使用)
CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);

BWMFIVal用のdouble変数を作成後、BWMFIの現在値を取得します。四捨五入のためにNormalizeDouble関数を使用します。

  • value:現在値(BWMFIArray[0]を使用)
  • digits:小数点以下の桁(5を使用)
double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);

Comment関数を使って、現在のBW MFI値を表示させます。

Comment("BW MFI Value = ",BWMFIVal);

以下は、この取引システムの1ブロックの完全なコードです。

//+------------------------------------------------------------------+
//|                             Simple Market Facilitation Index.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   ArraySetAsSeries(BWMFIArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   Comment("BW MFI Value = ",BWMFIVal);
  }
//+------------------------------------------------------------------+

前のコードの行をエラーなくコンパイルした後、MetaTrader 5取引ターミナルのナビゲータウィンドウで、Expert Advisorsフォルダの下にこのEAが次のように表示されます。

BW MFIナビゲータ

Simple Market Facilitation Index EAを目的のチャートにドラッグ&ドロップすると、EAのウィンドウが以下のようになります。

BW MFI ウィンドウ

[アルゴリズム取引を許可する]の横にチェックを入れて[OK]を押すと、この取引システムのEAが以下のようにチャートに追加されます。

Simple BW MFIの接続

これで、テストによる以下の例と同じシグナルを受信する準備が整いました。

Simple BW MFIシグナル

先ほどのチャートでわかるように、この取引戦略に基づいたシグナルがあり、左上に現在のBW MFI値とともにコメントとして表示されています。

戦略1:BW MFI - Movement Status

このタイプの取引システムを作成するための完全なコードを以下に示します。

//+------------------------------------------------------------------+
//|                                     BW MFI - Movement Status.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   if(BWMFIVal>BWMFIVal1&&volVal>volVal1)
     {
      Comment("Green State - Green Bar");
     }
   if(BWMFIVal<BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fade State - Brown Bar");
     }
   if(BWMFIVal>BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fake State - Blue Bar");
     }
   if(BWMFIVal<BWMFIVal1&&volVal>volVal1)
     {
      Comment("Squat State - Pink Bar");
     }
  }
//+------------------------------------------------------------------+

このコードの違いは次の通りです。

BWMFIArrayとvolArrayの2つの配列を作成し、ArraySetAsSeries関数を使ってこれらの配列のデータを並び替えます。

   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
BWMFIDefとvolDefの整数変数を作成します。iBWMFI関数でビBW MFIを、iVolumes関数でVolumesを定義します。
  • symbol_name:銘柄(現在の銘柄に適用される_Symbolを使用)
  • timeframe:期間を現在の期間に適用(_Periodを使用)
  • applied_volume:ボリュームの種類(ティックボリューム(VOLUME_TICK)を使用)
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

volArrayのデータを定義して、CopyBuffer関数を使用して結果を保存します。

CopyBuffer(volDef,0,0,3,volArray);

BWMFIとボリュームの現在値と前値を定義します。

   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);

戦略の条件は次の通りです。

緑色のバーの場合:

   if(BWMFIVal>BWMFIVal1&&volVal>volVal1)
     {
      Comment("Green State - Green Bar");
     }

茶色のバーの場合:

   if(BWMFIVal<BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fade State - Brown Bar");
     }

青色のバーの場合:

   if(BWMFIVal>BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fake State - Blue Bar");
     }

ピンクバーの場合:

   if(BWMFIVal<BWMFIVal1&&volVal>volVal1)
     {
      Comment("Squat State - Pink Bar");
     }

このコードをエラーなくコンパイルし、実行すると、以下のようにチャートに接続されていることがわかります。

Movement Status接続

ご覧の通り、前図の右上にEAが接続されています。この取引システムのシグナルは、以下のテスト例と同じように受け取ることができるようになっています。

Green状態の場合:

Movement Status - Greenシグナル

 

前の図にあるように、左上にGreen状態のシグナルがあります。

Fade状態の場合:

Movement Status - Fadeシグナル

この戦略に基づくFadeのシグナルが左上にコメントとして表示されています。

Fake状態の場合:

Movement Status - Fakeシグナル

前の例のように、この取引システムに基づいてFake状態のシグナルを得ています。

Squat状態の場合:

Movement Status - Squatシグナル

この取引戦略に基づき、チャート左上にコメントとしてSquat状態のシグナルが表示されています。 

戦略2:BW MFI Signals

以下は、この戦略の取引システムの完全なコードです。

//+------------------------------------------------------------------+
//|                                               BW MFI Signals.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;
   
   if(greenState)
     {
      Comment("Find a good entry");
     }
   if(fadeState)
     {
      Comment("Find a good exit");
     }
   if(fakeState)
     {
      Comment("False breakout Probability");
     }
   if(squatState)
     {
      Comment("Market is Balanced");
     }
  }
//+------------------------------------------------------------------+

このコードの違いは次の通りです。

green、fade、fake、squatの4つの状態のブール変数を、各状態の特定の条件に対して宣言します。

   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;

戦略の条件は次の通りです。

Green状態の場合:

   if(greenState)
     {
      Comment("Find a good entry");
     }

Fade状態の場合:

   if(fadeState)
     {
      Comment("Find a good exit");
     }

Fake状態の場合:

   if(fakeState)
     {
      Comment("False breakout Probability");
     }

Squat状態の場合:

   if(squatState)
     {
      Comment("Market is Balanced");
     }

このコードをコンパイルして実行すると、以下のようにEAがチャートに接続されていることがわかります。

BW MFI Signalsの接続

チャート右上にBW MFI Signals EAが接続されていることが確認できます。この取引システムに基づくシグナルは、以下のように得ることができます。

Find a good entryシグナルの場合:

Find a good entryシグナル

Find a good entryシグナルがチャートの左上隅にコメントとして表示されます。

Find a good exitシグナルの場合:

Find a good exitシグナル

ご覧のように、Find a good exitシグナルがチャートの左上隅にコメントとして表示されます。

False breakout probabilityシグナルの場合:

BW MFI Signals - False breakout probabilityシグナル

ご覧のように、False breakout probabilityシグナルがチャートの左上隅にコメントとして表示されます。

Market is Balancedシグナルの場合:

BW MFI Signals -バランスシグナル

ご覧のように、Market is Balancedシグナルがチャートの左上隅にコメントとして表示されます。

戦略3:BW MFI with MA:

以下は、BW MFIと移動平均の間に組み合わせる戦略に基づく、この取引システムのフルコードです。

//+------------------------------------------------------------------+
//|                                               BW MFI with MA.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   double maArray[];
   MqlRates pArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   ArraySetAsSeries(maArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   int maDef=iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);
   int data=CopyRates(_Symbol,_Period,0,10,pArray);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   CopyBuffer(maDef,0,0,3,maArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   double maVal=NormalizeDouble(maArray[0],5);
   double closingPrice=pArray[0].close;
   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;
   if(closingPrice>maVal&&greenState)
     {
      Comment("Buy Signal");
     }
   else
      if(closingPrice<maVal&&greenState)
        {
         Comment("Sell signal");
        }
      else
         Comment("");
  }
//+------------------------------------------------------------------+

このコードの違いは次の通りです。

double型のmaArray、MqlRates関数でpArrayと、2つの配列を追加で作成します。

   double maArray[];
   MqlRates pArray[];

ArraySetAsSeries関数を使用してmaArrayのデータを並び替えます。

ArraySetAsSeries(maArray,true);

整数型maDef変数を作成し、iMA関数で移動平均を定義し、指標ハンドルとそのパラメータを返します。

  • symbol:銘柄名(現在のチャートに適用される_SYMBOLを使用)
  • period:期間(現在の時間枠に適用される_PERIODを使用、PERIOD_CURRENTも使用可能)
  • ma_period:平均化期間(10を使用)
  • ma_shift:水平方向のシフト(オプション)(MAを移動させる必要がないので0を使用)
  • ma_method - 移動平均の種類(SMA(Simple Moving Average、単純移動平均)を使用)
  • applied_price:価格の種類(終値を使用)
int maDef=iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

CopyRatesを使用してMqlRatesの履歴データを取得します。

  • symbol_name:銘柄(現在の銘柄に適用される_Symbolを使用)
  • timeframe:期間(現在の期間に適用される_Periodを使用)
  • start_pos:開始点またはポジション(現在のポジションから開始するために0を使用)
  • count:コピーする量(10を使用)
  • rates_array[]:コピー先配列(pArrayを使用)
int data=CopyRates(_Symbol,_Period,0,10,pArray);

BWMFIArray、volArray、maArrayのデータを定義しCopyBuffer関数を用いて結果を格納します。

   int data=CopyRates(_Symbol,_Period,0,10,pArray);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   CopyBuffer(maDef,0,0,3,maArray);

BW MFI、ボリューム、単純移動平均、終値の前値と現在値を習得します。

   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   double maVal=NormalizeDouble(maArray[0],5);
   double closingPrice=pArray[0].close;

Green、Fade、Fake、Squatの各状態のブール変数を作成します。

   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;

この戦略の条件は次の通りです。

買いシグナルの場合:

   if(closingPrice>maVal&&greenState)
     {
      Comment("Buy Signal");
     }

売りシグナルの場合:

   else
      if(closingPrice<maVal&&greenState)
        {
         Comment("Sell signal");
        }

その他の場合:

      else
         Comment("");

このコードをコンパイルして実行すると、以下のようにチャートに接続されていることがわかります。

 BW MFI with MAの接続

買いシグナルの場合:

BW MFI with MA - 買いシグナル

チャート左上にコメントとして買いシグナルが表示されています。

売りシグナルの場合:

BW MFI with MA - 売りシグナル

チャート左上にコメントとして売りシグナルが表示されています。このトピックでは、前述した戦略に基づいてさまざまな取引システムを作成する方法を学びました。

結論

この記事を読んで、ビル・ウィリアムズが開発したテクニカル指標「Market Facilitation Index」の主な概念が理解できたと思います。手動でそれを計算する方法、また、MetaTrader 5取引プラットフォームのチャートにこの指標を挿入してその値を解釈する方法がお分かりだと思います。また、その使い方を学びました。そのために、その主な概念に基づいて、いくつかの簡単な戦略を考えました。

  • BW MFI - Movement Status戦略:指標のバーを基にチャート上のシグナルとして市場の状態を取得する(Green、Fade、Fake、Squatの状態)
  • BW MFI Signals戦略:BW MFI指標に基づく適切な判断のシグナルをチャートに取得する(Find a good entry、Find a good exit、False breakout probability、Market is Balanced)
  • BW MFI with MA戦略:BW MFIと単純移動平均指標に基づく売買シグナルを得るために使用する

より良い結果を得るために、また市場の全体像を見るために、テクニカルツールを追加で使ってみることを皆さんにお勧めします。また、この記事の主な概念は、教育目的のための情報共有であるため、実際の取引で使用する前にテストして、それらがあなたにとって有用であるかどうかを確認する必要があります。その後、MetaTrader 5で使用する取引システムを簡単に作成できるように、各戦略のステップバイステップの設計図を作成しました。MQL5という言語を使って学習し、作成しました。

この記事がお役に立ち、読者がこのトピックや関連するトピックに関するより多くの洞察を得て取引を改善できることを願っています。また、この記事で学んだことを応用して、ご自分でコードを書いて見ていただければと思います。MQL5のプログラミングスキルを向上させたいのであれば、これは学習プロセスにおいて非常に重要なステップです。さらに同様の記事を読みたい方は、この連載の他の記事を読んで、最も人気のあるテクニカル指標に基づいて取引システムを設計する方法について学んでください。それらもお役に立つことを願っています。

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

ニューラルネットワークが簡単に(第36回):関係強化学習 ニューラルネットワークが簡単に(第36回):関係強化学習
前回の記事で説明した強化学習モデルでは、元のデータ内のさまざまなオブジェクトを識別できる畳み込みネットワークのさまざまなバリアントを使用しました。畳み込みネットワークの主な利点は、場所に関係なくオブジェクトを識別できることです。同時に、畳み込みネットワークは、オブジェクトやノイズのさまざまな変形がある場合、常にうまく機能するとは限りません。これらは、関係モデルが解決できる問題です。
ニューラルネットワークの実験(第4回):テンプレート ニューラルネットワークの実験(第4回):テンプレート
この記事では、実験と非標準的な方法を使用して収益性の高い取引システムを開発し、ニューラルネットワークがトレーダーに役立つかどうかを確認します。ニューラルネットワークを取引に活用するための自給自足ツールとしてMetaTrader 5を使用します。簡単に説明します。
MQL5でONNXモデルを使用する方法 MQL5でONNXモデルを使用する方法
ONNX (Open Neural Network Exchange)は、機械学習モデルを表現するために構築されたオープンフォーマットです。この記事では、CNN-LSTMモデルを作成して金融時系列を予測する方法を検討します。MQL5エキスパートアドバイザー(EA)で作成されたONNXモデルを使用する方法も示します。
自動で動くEAを作る(第10回):自動化(II) 自動で動くEAを作る(第10回):自動化(II)
自動化は、そのスケジュールを制御できなければ意味がありません。1日24時間働く効率的な労働者はいません。しかし、多くの人は、自動化されたシステムは24時間稼働するべきだと考えています。しかし、EAの稼働時間範囲を設定する手段を持つことは常に良いことです。この記事では、このような時間範囲を適切に設定する方法を検討します。