English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
preview
OBVによる取引システムの設計方法を学ぶ

OBVによる取引システムの設計方法を学ぶ

MetaTrader 5トレーディング | 22 8月 2022, 09:15
267 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

はじめに

この新しい記事は、出来高を扱うことができる新しいテクニカル指標について学び、異なる視点を得るのに役立ちます。この興味深いテーマを取り上げ、このテクニカル指標を有利に使用する方法を学ぶために、OBV (On Balance Volume指標について詳しく説明します。以下のトピックでこの指標を取り上げます。

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

「OBVの定義」では、OBVとは何か、どのように測定され、どのように計算されるのか、また、その計算例など、OBV指標について詳細に学びます。その上で、この指標を見極め、深く学ぶことで、正しい使い方を知ることができるのです。OBV指標の使い方は、指標の概念に基づいた簡単な戦略を使って学びます。これは「OBV戦略」トピックを通しておこないます。シンプルな戦略に基づいた使い方を確認した後、シンプルな戦略の設計図を作成します。この設計図は、エキスパートアドバイザー(EA)を作成する手順を整理する手助けとなり、これらの戦略のMQL5コードを記述するのに役立つでしょう。戦略の設計図が完成したら、MQL5でコードを書いてEAを作成し、MetaTrader 5でそれを使って手動操作で自動的かつ正確に取引戦略を実行する準備が整うでしょう。

この記事ではMQL5(MetaQuotes言語)を使ってEAを作成することに言及する必要があります。その後、MetaTrader 5取引プラットフォームで実行します。MetaTrader5をインストールし、MetaTrader5に組み込まれているMQL5を使用できるようにする方法については、以前の記事で「MetaEditorでMQL5のコードを書く」のトピックを参照してください。何事も実践が大切なので、学んだことをマスターしたいのであれば、読んだことを自分で実践することをお勧めします。

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

さて、この記事では、新しいツールを学び、より充実した取引体験ができるようにツールキットに加えることで、深く掘り下げていきます。


OBVの定義

このセクションでは、OBV (On-balance Volume)指標についてより詳しく学びます。ただし、この指標は出来高指標の1つであるため、まず出来高について説明します。出来高とは、特定の期間に取引された株式数または契約数のことです。出来高が多いということは、その商品の取引が活発であることを意味し、逆に出来高が少ないということは、その商品の取引が活発でないことを意味します。

出来高は非常に重要な概念です。大きな出来高を伴って上下する商品の動きは小さな出来高を伴う場合よりも強くなります。上昇トレンドでは出来高はトレンドと一緒に移動する必要があります。出来高は上昇トレンドでは増加して下降トレンドでは減少するほうがよいのですが、上昇トレンドで減少し、下降トレンドで増加する場合もあります。

また、出来高は、ブレイクアウトが本物であるか、それとも単なる偽のブレイクアウトであるかを確認します。ブレイクアウトが高い出来高でおこなわれた場合、このブレイクアウトが続くというシグナルになります。 

先ほど言ったようにこのトレンドと出来高の関係が同じであれば、現在のトレンドの強さを示すことになり、変化した場合は弱さを示すことになります。トレンドとは何かがわからない場合は、以前の記事から「トレンドの定義」トピックをお読みください。

OBV (On-Balance Volume)は、ジョセフ・グランビルによって開発され、正負の出来高流量を測定するものです。あとは、どうやって計算するかです。計算手順は以下の通りです。

  1. 終値を確認する(上がっているか下がっているか)
  2. 前回のOBV値に上昇日の出来高を加算する
  3. 前回のOBV値から下降日の出来高を減算する
  4. 今日の終値が昨日の終値と同じ場合、今日のOBV値は昨日のOBV値と同じになる

これらの手順の例を見て、OBV指標を計算してみましょう。ある商品について、次のようなデータがあったとします。

終値 数量
1 54
2 55 10000
3 60 15000
4 65 20000
5 60 10000
6 55 5000
7 60 7000
8 50 7500
9 48.75 8000
10 49 5000
11 48 6000
12 47.75 7500
13 48 9000
14 47.50 10000
15 48 7000
16 47 7500
17 46 6000
18 44 5000
19 45 15000

過去のデータからOBV指標を算出するには、次をおこないます。

終値を確認し、前回の終値より高いかどうかを判断します。前日の終値より高い場合は、この日に上昇したことを示す「Positive」をその横に付けます。前日の終値より低い場合は、その日に下降したことを示すために「Negative」を付けます。

OBV計算1

そして、前回のOBVの値にpositiveの日の出来高を加算し、negativeの日の出来高を減算します。

OBV計算2

すると、今度はOBVの値が計算され、正負の出来高流量を測定するための曲線として表示されるのです。幸いなことに、MetaTrader 5に内蔵されている指標の中から見つけることができるので、この指標を手動で計算する必要はありません。次の図は、この指標をチャート上に挿入する方法を示しています。

OBVの挿入

指標を選択すると、以下の指標パラメータウィンドウが開きます。

OBVの挿入1

1 - Volumesの種類。

2 - OBV曲線の色

3 - OBV曲線のスタイル

4 - OBV曲線の太さ

必要なパラメータを設定し、[OK]をクリックすると、指標がチャートに接続されます。

OBVの接続


OBV戦略

このセクションでは、OBV指標の概念に基づいてその使い方を学びます。簡単な攻略法を見てみます。ただし、これらの戦略はすべての人に合うとは限りません。したがって、どのような戦略であっても、使う前にテストを行い、どれだけ自分にとって役に立つかを知る必要があります。ここでは、これらの戦略はすべて、OBV指標の基本を学び、その機能を確認することを主な目的として検討します。

  • 戦略1:Simple OBV Movement

この戦略によれば、現在のOBV値と前回のOBV値を比較して、現在の値が前回よりも大きいかどうか、つまりOBVが上昇していることを確認することで、OBV曲線の方向を特定する必要があるのです。逆に、現在値が前回値より小さい場合は、OBVは減少しています。

現在のOBVと過去のデータを比較するために必要なデータの長さは変更可能ですが、ここでは、この指標の使用方法とMQL5でこの使用方法をコード化する方法についてのアイデアを共有します。後で、各自の好みに合わせて最適化することができます。

現在のOBV>前回のOBV→OBVが上昇

現在のOBV<以前のOBV→OBVが減少

  • 戦略2:Simple OBV Strength

この戦略によれば、過去4回のOBV値の平均値と比較することで、現在のOBV値の強さを特定する必要があります。現在のOBV値が過去4回のOBV値の平均より大きければOBVは強く、逆に現在のOBV値が過去4回のOBV値の平均より小さければOBVは弱いと言えます。

平均値を長くして現在のデータと比較することもできますが、ここでは指標の使い方を確認することが目的です。そして、自分の好みやテスト結果に応じて、好きなように調整すればいいのです。 

現在のOBV>過去4回のOBV値のAVG→OBVが強い

現在のOBV<過去4回のOBV値のAVG→OBVが弱い

  • 戦略3:Simple OBV - Uptrend

上昇トレンドの時は、ご存知の通り、トレンドに沿った出来高の動きを見た方が良いです。ですから、上昇に伴ってOBVも増加するはずです。つまり、この戦略によって、動きが強いかどうかを評価することができるのです。現在のOBV値と前回のOBV値を比較し、現在の高値と前回の高値を比較します。今回のOBV値が前回のOBV値より大きく、今回の高値が前回の高値より大きい場合、上昇トレンド中の動きは強くなります。

現在のOBV>前回のOBV、現在の高値>前回の高値→上昇トレンド中の強い動き

  • 戦略4:Simple OBV - Downtrend

下降トレンドの時は、トレンドに沿った出来高の推移を見るのがより望ましいです。OBVは下降に伴い増加するはずです。これにより、動きが強いかどうかを把握することができます。現在のOBV値と前回のOBV値を比較し、現在の安値と前回の安値を同じ時間で比較することになります。今回のOBV値が前回のOBV値より小さく、今回の安値が前回の安値より小さい場合、下降トレンドの時は下降の動きが強くなります。

現在のOBV<前回のOBVかつ現在の安値<前回の安値→下降トレンド中の強い動き


OBV戦略の設計図

このセクションでは、各戦略の設計図を作成していきます。言及されている各戦略について、取引システムの設計方法をステップバイステップでわかりやすく解説します。まず、簡単なOBVを設計して、チャート上に現在のOBVの値でコメントを提示する必要があります。そのための設計図がここにあります。

Simple OBVの設計図

  • 戦略1:Simple OBV Movement

この戦略では、現在のOBV値と前回のOBV値から、OBV曲線の方向を知る必要があります。1ティックごとに、現在のOBVと前回のOBVの値を確認し、現在の値が前回よりも大きければ、OBVが上昇している印となり、逆に、現在の値が前回よりも小さければ、OBVが下降している印となるのです。

以下は、この戦略の取引システムを設計するためのステップバイステップの設計図です。

Simple OBV Movementの設計図

  • 戦略2:Simple OBV Strength

この戦略では、過去4回の平均値と比較することで、現在のOBVの強さを測定する必要があります。現在のOBVが過去4回のOBVの平均値より大きければOBVは強く、逆に現在のOBVが過去4回のOBVの平均値より小さければOBVは弱いと言えます。

以下は、この取引システムを作成するためのステップバイステップの設計図です。

Simple OBV Strengthの設計図

  • 戦略3:Simple OBV - Uptrend

この戦略では、価格の現在の動きを測定するために、OBVであるボリューム指標の1つを利用する必要があります。上昇トレンドの間、現在のOBV値を確認して以前のOBV値と比較する必要があります。現在の値が以前の値よりも大きい場合は、現在の高値をチェックして以前の高値と比較します。 現在の値が以前の値よりも大きい場合、現在のOBVが以前のOBVよりも大きく、現在の高値が以前の高値よりも大きいため、上昇トレンド中に現在の上昇の動きが強いことを示します。

以下は、この戦略をコード化するためのステップバイステップの設計図です。

Simple OBV - Uptrendの設計図

  • 戦略4:Simple OBV - Downtrend

この戦略では、下降トレンドの間、現在のOBVの値を確認して前回のOBVの値と比較します。現在の値が前回の値より小さい場合、現在の安値を確認して前回の安値と比較します。現在の値が前回の値より小さい場合は、現在のOBVが前回のOBVより小さく、現在の安値が前回の安値より小さいため、下降トレンドの間に強い動きがある印になるのです。

以下は、この戦略をコード化するためのステップバイステップの設計図です。

Simple OBV - Downtrendの設計図


OBV取引システム

この興味深いセクションでは、プログラミングとMQL5を活用した各戦略の取引システムの作成方法を学びます。プログラミングは、私たちが手動でおこなうことを実行ことができるシステムを作成することによって私たちの生活を楽にするのに役立つ魔法のツールで、必要なことを正確かつ迅速に実行します。これは唯一の利点ではありません。プログラミングから受けることができるメリットは多数あります。

さて、ここからは各戦略に対応した取引システムの作成に入ります。まず、簡単なOBV取引システムを作成し、チャート上に現在のOBV値をコメントとして生成します。

  • OBV用のdouble型配列を作成します。doubleは実数型または浮動小数点型の1つで、小数部分を持つ値を表します。ちなみに、浮動小数点にはdoubleとfloatの2種類があり、doubleはfloatの2倍の精度を持つ数値を表します。
double OBVArray[];
  • ArraySetAsSeries関数を用いてOBV配列を並び替え、trueまたはfalseを返します。
ArraySetAsSeries(OBVArray,true);

  • OBVDefの整数変数を作成した後、iOBV関数を使ってOBVを定義すると、iOBV関数はオンバランスボリューム指標のハンドルを返し、そのパラメータは(銘柄、期間、適用ボリューム)です。
int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
  • コピーしたデータ数を返すCopyBuffer関数とそのパラメータ(指標ハンドル、バッファ番号、開始時間、停止時間、バッファ)を使用してOBVArrayにOBVDefを入力します。
CopyBuffer(OBVDef,0,0,3,OBVArray);
  • OBVValueのdouble変数を作成した後、現在のOBV値を計算します。
double OBVValue=OBVArray[0];
  • Comment関数でコメントを作成し、現在のOBVの値でチャートにコメントを表示します。
Comment("OBV Value is: ",OBVValue);

現在のOBVの値でコメントが表示される前回の取引システムの全コードを以下に示します。

//+------------------------------------------------------------------+
//|                                                   Simple OBV.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an array for OBV
   double OBVArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(OBVArray,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray);
   
   //calculating current OBV value
   double OBVValue=OBVArray[0];
   
   //creating a comment with OBV value
   Comment("OBV Value is: ",OBVValue);  
  }
//+------------------------------------------------------------------+

このコードをコンパイルすると、ナビゲータウィンドウには下図のように表示されます。

OBVナビゲータ1

実行する場合は、ファイルをダブルクリックするか、チャート上にドラッグ&ドロップすると、次のようなウィンドウが表示されます。

Simple OBVのウィンドウ

[OK]を押すと、下図のようにEAがチャートに表示されます。

Simple OBVの接続

そして、生成されたシグナルは、以下のテストの例と同じように表示されることがわかります。

Simple OBVのテストシグナル

メタトレーダー5内蔵のOBV指標と同じ値を取得することを確認したい場合は、作成したEAを接続した後、前に述べたようにOBV指標を挿入することによっておこなうことができます。値が同じであることがわかります。以下が例です。

Simple OBVと同シグナルの指標

 さて、ここで紹介した各戦略について、取引システムを作成する必要がありますが、その方法は以下のとおりです。

  • 戦略1:Simple OBV Movement

この戦略では、前述したように、以前のOBV値と現在のOBV値の2つの値を比較する必要があります。現在の値が以前の値よりも大きい場合、「OBVは上昇している」というチャート上のコメントとして表示されるシグナル、OBV現在の値、以前のOBV値が必要であると判断します。以下は、このような戦略を作成するための完全なコードです。

//+------------------------------------------------------------------+
//|                                          Simple OBV movement.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
//creating an two arrays for OBV
   double OBVArray1[];
   double OBVArray2[];

//sorting the array from the current data
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);

//defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

//defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
   CopyBuffer(OBVDef,0,0,3,OBVArray2);

//getting the value of current and previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
   double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

//creating conditions of rising and declining OBV based on its values   
   if(OBVCurrentValue>OBVPrevValue)
     {
      Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

   if(OBVCurrentValue<OBVPrevValue)
     {
      Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

  }
//+------------------------------------------------------------------+
  • このコードの相違点
 OBV用の配列を2つ作成します。
double OBVArray1[];
double OBVArray2[];

この2つの配列を現在のデータから並べ替えます。

ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);

この2つの配列に入力します。

CopyBuffer(OBVDef,0,0,3,OBVArray1);
CopyBuffer(OBVDef,0,0,3,OBVArray2);

double型のOBVCurrentValue変数とOBVPrevValue変数を作成して、事前設定された精度でdouble型の値を返すNormalizeDouble関数を使用して、それぞれに現在および以前のOBVの値を割り当てます。NormalizeDoubleのパラメータは(値、数)で、値はOBVArray、数は5(小数点以下の桁数)となります。

double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

ifを使用してOBV上昇/下降の条件を設定します。

if(OBVCurrentValue>OBVPrevValue)
   {
    Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

if(OBVCurrentValue<OBVPrevValue)
   {
    Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

コンパイル後、EAはMetaTrader 5取引プラットフォームの「Expert Advisors」フォルダの中のナビゲータウィンドウに次のように表示されます。

OBVナビゲータ2

EAファイルをダブルクリックすると、以下のウィンドウが表示されます。

Simple OBV Movementのウィンドウ

[OK]を押すと、次のようにEAがチャートに接続されます。

Simple OBV Movementの接続

以下は、この戦略に従って生成されたシグナルのテスト例です。

OBVの上昇

Simple OBV Movementの上昇シグナル

OBVの下降

Simple OBV Movementの下降シグナル

  • 戦略2:Simple OBV Strength

この戦略では、前述したように、現在のOBV値とこの平均を計算した後の過去4つのOBV値の平均値の2つの値を比較する必要があります。現在の値が平均よりも大きい場合、これは「OBVが強い」ことを意味し、その逆は、現在の値が平均よりも小さい場合、これは「OBVが弱い」という意味です。以下は、この戦略の取引システムを作成するための完全なコードです。

//+------------------------------------------------------------------+
//|                                          Simple OBV Strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an six arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   double OBVArray2[];
   double OBVArray3[];
   double OBVArray4[];
   
   //sorting arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);
   ArraySetAsSeries(OBVArray3,true);
   ArraySetAsSeries(OBVArray4,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,5,OBVArray0);
   CopyBuffer(OBVDef,0,0,5,OBVArray1);
   CopyBuffer(OBVDef,0,0,5,OBVArray2);
   CopyBuffer(OBVDef,0,0,5,OBVArray3);
   CopyBuffer(OBVDef,0,0,5,OBVArray4);
   
   //getting the value of current OBV & previous 5 values
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
   double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
   double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
   double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);
   
   //calculating average of previous OBV value
   double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);
   
   if(OBVCurrentValue>OBVAVG)
   {
      Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
   if(OBVCurrentValue<OBVAVG)
   {
      Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
  }
//+------------------------------------------------------------------+
  • このコードの相違点

OBV値用に5つの配列を作成します。

double OBVArray0[];
double OBVArray1[];
double OBVArray2[];
double OBVArray3[];
double OBVArray4[];

これらの作成された配列を現在のデータから並び替えます。

ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);
ArraySetAsSeries(OBVArray3,true);
ArraySetAsSeries(OBVArray4,true);

定義されたOBVDefを入力します。

CopyBuffer(OBVDef,0,0,5,OBVArray0);
CopyBuffer(OBVDef,0,0,5,OBVArray1);
CopyBuffer(OBVDef,0,0,5,OBVArray2);
CopyBuffer(OBVDef,0,0,5,OBVArray3);
CopyBuffer(OBVDef,0,0,5,OBVArray4);

現在のOBVと過去4回のOBVの値を取得します。

double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);

OBVAVGのdouble変数を作成後、過去4回のOBV値の平均を計算します。

double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);

OBVの強弱の条件をコメントに設定します。

if(OBVCurrentValue>OBVAVG)
{
 Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}
   
if(OBVCurrentValue<OBVAVG)
{
 Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}

コンパイル後、ナビゲータウィンドウに以下と同EAが表示されます。

OBVナビゲータ3

MetaTrader5で実行するファイルを選択した後のEAのウィンドウは以下のとおりです。

Simple OBV Strengthのウィンドウ

[OK]を押すと、下図のようにEAがチャートに接続されます。

Simple OBV Strengthの接続

以下は、テストからのシグナル例です。

強いOBV

Simple OBV Strengthの強いシグナル

弱いOBV

Simple OBV Strengthの弱いシグナル

  • 戦略3:Simple OBV - Uptrend

この戦略では、上昇トレンドの時は、高値と同時にOBVの値が高いかどうかを確認する必要があります。そこで、現在のOBVの値が前回のOBVの値よりも大きいかどうかを確認し、現在の高値が前回の高値よりも大きければ、「上昇トレンド中の強い動き」のシグナルとなります。以下は、このような戦略を作成するための完全なコードです。

//+------------------------------------------------------------------+
//|                                         Simple OBV - Uptrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating a string variable for signal
   string signal="";
   
   //creating two OBV arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill arrays with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current & the previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current high & the previous high
   double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 
      
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current high> previous high
   if(OBVCurrentValue > OBVPrevValue && PriceArray0[0].high>PriceArray0[1].high)
   {
      signal="Strong move during uptrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue);            
  }
//+------------------------------------------------------------------+

このコードの相違点

後で計算するので、空に割り当てた文字列を格納するstringを使用して、signal用の文字列変数を作成します。

string signal="";

OBV用のdouble型配列を2つ作成し、MqlRates関数で価格、出来高、スプレッドの情報を格納した価格用の配列を2つ作成します。

//creating two OBV arrays for OBV
double OBVArray0[];
double OBVArray1[];
   
//creating two price arrays
MqlRates PriceArray0[];
MqlRates PriceArray1[];1[];

これらの配列を現在のデータから並び替えします。

//sorting OBV arrays from the current data
ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);   
   
//sorting Price arrays from the current data
ArraySetAsSeries(PriceArray0,true);
ArraySetAsSeries(PriceArray1,true);

各配列にData0とData1の整数変数を作成し、MqlRates構造体の履歴データを取得するCopyRates関数を使用して、価格配列に価格データを入力します。

int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);

OBVを定義し、2つのOBVArrayに入力します。

int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

CopyBuffer(OBVDef,0,0,3,OBVArray0);
CopyBuffer(OBVDef,0,0,3,OBVArray1);

OBVと高値の値を取得します。

//getting the value of current & the previous OBV
double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
//getting the value of current high & the previous high
double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 

「上昇トレンド中の強い動き」の条件設定とコメント。

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue); 

コンパイルすると、ナビゲータウィンドウにEAが表示されます。

OBVナビゲータ4

MetaTrader5で実行するファイルを選択した後のEAウィンドウは、以下のようなものになります。

Simple OBV - Uptrendのウィンドウ

[OK]を押すと、下図のようにEAがチャートに接続されます。

Simple OBV - Uptrendの接続

以下は、テストからのシグナルの例です。

現在のデータのシグナルとデータウィンドウ

Simple OBV Uptrendシグナルと現在のデータウィンドウ

前のデータに対するシグナルとデータウィンドウ

Simple OBV - Uptrendシグナルと直前のデータウィンドウ

  • 戦略4:Simple OBV - Downtrend

この戦略によると、Simple OBV - Uptrend戦略の逆となり、安値と同時にOBVの値が低いかどうかを確認する必要があります。そこで、現在のOBVの値が前回のOBVの値より小さいかどうかを確認し、現在の安値が前回の安値より小さければ、「下降トレンド中の強い動き」のシグナルとなります。以下は、このような戦略を作成するための完全なコードです。


//+------------------------------------------------------------------+
//|                                       Simple OBV - Downtrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //create a string variable for signal
   string signal="";
   
   //creating two OBV arrays
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill array with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current OBV & the previous value
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current OBV & the previous value
   double CurrentLowValue=NormalizeDouble(PriceArray0[0].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray1[1].low,5); 
       
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current low> previous low
   if(OBVCurrentValue < OBVPrevValue && PriceArray0[0].low<PriceArray0[1].low)
   {
      signal="Strong move during downtrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue);            
  }
//+------------------------------------------------------------------+

  • このコードの相違点

「下降トレンド中の強い動き」の設定条件とコメント。

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue); 

さて、これをコンパイルすると、ナビゲータウィンドウに以下のようにEAが表示されるようになります。

OBVナビゲータ5

このファイルをチャート上にドラッグ&ドロップすると、次のようなウィンドウが表示されます。

Simple OBV - Downtrendのウィンドウ

[OK]ボタンを押すと、下図と同じようにEAが接続されます。

Simple OBV - Downtrendの接続

以下は、テストによって生成されたシグナルの例です。

現在のデータウィンドウとシグナル

Simple OBV - Downtrendのシグナルと現在のデータウィンドウ

前のデータウィンドウととシグナル

Simple OBV - Downtrendのシグナルと前のデータウィンドウ


結論

取引の意思決定を強化するために、チャートに別の視点を見るために、その計算でボリュームを使用して、別の新しいテクニカル指標を学びました。この指標は、OBV (On Balance Volume)で、OBV指標とは何か、それが何を測定し、その基本を超えて隠れているものを知るために手動で計算できるように詳細を学びました。また、その基本的な使い方を学び、役に立つ、あるいは利益を生む新しいアイデアを実現するのに役立つ、いくつかの簡単な戦略を学びました。私たちは、言及された各戦略について、その取引システムを作るためのコードを書くのに役立つ設計図を作りました。その後、MQL5(MetaQuotes言語)により各戦略のEAを作成し、MetaTrader 5取引プラットフォームで実行することにより、各戦略の設定条件やルールに従って自動的かつ正確にシグナルを発生させることができます。

テクニカル分析で最も有益なことの1つは、使用するツールによって金融商品に関する複数の視点を見ることができて、複数のツールや指標を組み合わせることができることです。特に、いくつかのツールを使用して金融商品の全体像を見ると、適切な判断を明確に下すことができ、このアプローチは信頼できる取引システムの構築に役立ちます。何かを読んだり学習したりしながら、このアプローチを目の前に置いて、より明確な洞察とより良い結果を得るためにどのツールを別のツールと併用できるかを理解できるようにしてください.

この記事とこの連載の他の記事は、物事の根本を学び、プログラミング、特にMQL5によって何ができるのか、そしてそれが取引業務をどれだけ楽にして向上させてくれるのかを理解するための、教育目的のみかつ初心者のためのものだということを、もう一度確認しておく必要があります。戦略を使用する前にテストする必要があります。万人に合うものはなく、テストと検証という作業をおこなって、それが自分にとって役立つかどうかを確認する必要があるためです。すべて自分で実践し、学びと理解を深めることをお勧めします。

この記事がお役に立ち、この記事のトピックや取引の世界での関連トピックについて何か学んでいただけたなら幸いです。この記事がお役に立ち、同様の記事をお読みになりたい場合は、この連載の過去の記事を読んで、人気のあるテクニカル指標に基づいて取引システムを設計する方法を学んでください。

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

一からの取引エキスパートアドバイザーの開発(第16部):Web上のデータにアクセスする(II) 一からの取引エキスパートアドバイザーの開発(第16部):Web上のデータにアクセスする(II)
Webからエキスパートアドバイザー(EA)にデータを入力する方法はそれほど明らかにはわかりません。MetaTrader 5が提供するすべての可能性を理解しなければ、そう簡単にはいきません。
DoEasy - コントロール(第6部):パネルコントロール、内部コンテンツに合わせたコンテナサイズの自動変更 DoEasy - コントロール(第6部):パネルコントロール、内部コンテンツに合わせたコンテナサイズの自動変更
本稿では、Panel WinFormsオブジェクトの作業を続け、パネル内にあるDockオブジェクトの一般的なサイズに合わせた自動サイズ変更を実装します。さらに、銘柄ライブラリオブジェクトに新しいプロパティを追加します。
ニューラルネットワークが簡単に(第15部):MQL5によるデータクラスタリング ニューラルネットワークが簡単に(第15部):MQL5によるデータクラスタリング
クラスタリング法について引き続き検討します。今回は、最も一般的なk-meansクラスタリング手法の1つを実装するために、新しいCKmeansクラスを作成します。テスト中には約500のパターンを識別することができました。
ビデオ:シンプルな自動取引 – MQL5でシンプルなエキスパートアドバイザーを作成する方法 ビデオ:シンプルな自動取引 – MQL5でシンプルなエキスパートアドバイザーを作成する方法
私のコースの学生の大半は、MQL5を理解するのが本当に難しいと感じていました。これに加えて、彼らはいくつかのプロセスを自動化する簡単な方法を探していました。この記事に含まれる情報を読んで、今すぐMQL5のを使い始める方法を見つけてください。これまでに何らかの形のプログラミングをおこなったことがない場合でも、観察した前のイラストを理解できない場合でも.です。