
Volumesによる取引システムの設計方法を学ぶ
はじめに
最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶための連載の新しい記事へようこそ。今回は、市場の異なる視点について洞察を与えてくれる新しい重要なVolumesテクニカル指標を紹介します。この指標を次のトピックを通してカバーしていきます。
ここでは、Volumesとは何で何を測るものかを学びます。その主な概念に基づく簡単な戦略を紹介しながら、取引にどのように利用できるのか、どのように役立つのかを探っていきます。その後、各戦略に基づいた取引システムの設計を進めるために、ステップバイステップで設計する方法を学びます。この手順は、あらゆる取引システムを設計する上で非常に重要です。次に、Volumes取引システムについて説明します。これは最も興味深い部分です。ここで述べたこと、あるいは関連する洞察に満ちたアイデアを、MQL5によって取引システムに変換し、これらの戦略に基づいて必要なものを自動的に生成し、取引の旅を容易に、改善、強化する方法を学びます。
MetaTrader 5取引ターミナルに内蔵されているMQL5(MetaQuotes言語)を使用することにします。MetaEditorをダウンロードする方法と使う方法を知りたい方は、前回の記事で「MetaEditorでMQL5コードを書く」トピックをお読みください。また、学んだことを応用することで理解が深まるため、学習にも非常に有効です。練習は、どんな学習プロセスにおいても非常に重要な要素です。
免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。
では、早速、取引に役立つ新しいツールを学んでみましょう。
Volumesの定義
外国為替市場において、出来高指標は、特定の時間内に価格が変化した数、すなわち契約、資金、単位などを識別して実際に取引された出来高を示すものです。出来高指標は、需要と供給、または市場の流動性の指標となります。出来高が多ければ、上がる場合は需要の高さ、下がる場合は供給の高さを示すことになります。出来高はトレンドの確認になるため、非常に有用と言えます。トレンドについてもっと知りたい方は、以前の記事の「トレンドの定義」トピックをお読みください。
出来高はトレンドに従います。これは、現在の動きが強くなるのか、弱くなるのかを確認するのに非常に有効なツールです。より望ましいのは、上昇トレンドの時は出来高が増加し、下降トレンドの時は出来高が減少することです。下降トレンドでは、下降とともに出来高が増加して重要なシグナルとなりますが、出来高がなくても価格が下落することがあるため、出来高が高くなくても下降が見られることもあります。つまり、下降トレンドでは、下降の動きで出来高が高くなるとは限りません。下降トレンドの途中で強気に修正された場合、出来高は減少します。
ダイバージェンスの場合、出来高は現在のトレンドに弱さがあることを示すことができます。ダイバージェンスとは、出来高が価格の方向性を確認することなく、価格と反対方向に動くことです。
その計算方法については、先に述べたとおりです。
外国為替市場において:
出来高 = 一定期間内に価格が変化した数
株式市場において:
出来高 = 取引量 * 価格
例:ある銘柄の価格が10ドルで1000株の取引量がある場合、出来高は以下のようになります。
出来高 = 1000 * $10 = $10,000
この違いは、株式市場と違ってFX市場は分散化されているために発生します。
MetaTrader5にあるため、手動で計算する必要はありません。利用可能な指標の中から選択するだけです。
[挿入]>[インディケータ]>[ボリューム系]>[Volumes]
前図の手順4のようにVolumes指標を選択すると、Volumes指標のウィンドウが表示されます。
1.アップ出来高バーの色
2.ダウン出来高バーの色
3.適用される出来高(TickまたはReal)
4.バーの幅
上記のパラメータを決定した後、チャートに接続されます。
緑色は、現在のバーが前のバーより高いことを意味し、赤色は、現在のバーが前のバーより低いことを意味します。
Volumes戦略
このセクションでは、Volumes指標の使い方を理解するために、簡単なVolumes戦略について説明します。これらの戦略には間違えなく最適化の余地があります。その主な目的は、Volumes指標の概念に基づいてどのように使用することができるかを理解し、その基本に基づいて取引システムを設計する方法であるためです。これらの戦略を実際の口座で使用する前に、テストする必要があります。
- 戦略1:Vol - Movement
この戦略では、現在の出来高と前回の出来高を比較して適切なシグナルを決定します。現在が前回より大きければ出来高増加のシグナルとなり、現在が前回より小されば、出来高減少のシグナルとなります。
単純に言うと
現在の出来高 > 前回の出来高 -> 出来高増加
現在の出来高 < 前回の出来高 -> 出来高減少
- 戦略2:Vol - Strength
この戦略では、現在の出来高値と過去5回の出来高値の平均を比較し、出来高指標の強さを決定します。現在値が平均値を上回れば、強い出来高のシグナルになります。現在値が平均値を下回れば、弱い出来高のシグナルになります。
つまり
現在値 > AVG -> 強い出来高
現在値 < AVG -> 弱い出来高
- 戦略3:Price & Vol - Uptrend
この戦略では、上昇トレンドの時は、現在と前回の高値と現在と前回の出来高の値を比較して、買いシグナルのあるなしを判断します。現在の高値が前回を上回って現在の出来高が前回を上回れば買いシグナルになりますが、現在の高値が前回を上回るが現在の出来高が前回の出来高を下回ればシグナルなしになります。
現在の高値 > 前回の高値 & 現在の出来高 > 前回の出来高 -> 上昇トレンド中の買いシグナル
- 戦略4:Price & Vol - Downtrend
この戦略は、先ほどとは逆に、下降トレンドの時に、現在と前回の安値と現在と前回の出来高の値を比較して、売りシグナルのあるなしを判断します。現在の安値が前回よりも低く、現在の出来高が前回よりも高ければ売りシグナルとなりますが、現在の安値が前回よりも低く、現在の出来高が前回の出来高よりも低ければシグナルなしとなります。
現在の安値 < 前回の安値 & 現在の出来高 > 前回の出来高 -> 下降トレンド中の売りシグナル
- 戦略5:MA & Vol戦略
この戦略では、2つ(1つは売り、もう1つは買い)の移動平均の長さと、現在と前回の出来高の値を比較して、買いか売りのシグナルがあるかどうかを判断します。売りMAが買いMAを下回った後、売りが買いを上回り、同時に現在の出来高が前回の出来高を上回った場合、買いシグナルになります。売りMAが買いMAを上回った後、売りが買いを下回り、同時に現在の出来高が前回の出来高を上回った場合、売りシグナルになります。
売りMA < 買いMAの後、売りMA > 買いMA & 現在の出来高 > 前回の出来高 -> 買いシグナル
売りMA > 買いMAの後、売りMA < 買いMA & 現在の出来高 > 前回の出来高 -> 売りシグナル
Volumes戦略の設計図
このセクションでは、各戦略の設計図を作成していきます。設計図を作成する理由は、取引システムを作るためにやりたいことを整理するためです。この手順は非常に重要で、ステップバイステップでやりたいことを明確にすることに加えて、アイデアを整理するために不可欠です。
まず、Volumes指標の現在値のみをチャート上のコメントとして生成する簡単な取引システムの設計図を作成します。Volumes指標の値をティックごとに確認し、現在の値をコメントとしてチャートに返すシステムが必要です。以下は、この取引システムを作成するためのステップバイステップの設計図です。
- 戦略1:Vol - Movement
この戦略に従って、現在と前回の2つのVolumes指標の値を比較することによって、出来高の動き(増加/減少)を知らせるシグナルを生成する簡単な取引システムを作成します。この2つの値をティックごとに確認し、現在の出来高が前の出来高を上回れば出来高が増加していることを、現在の出来高が前の出来高を下回れば出来高が減少していることを知らせるシステムが必要です。以下は、この取引システムを作成するためのステップバイステップの設計図です。
- 戦略2:Vol - Strength
この戦略に従って、現在の出来高指標値と過去5回の平均値との比較に基づいて出来高の強さを知らせるシグナルを生成する簡単な取引システムを作成します。これらの値をすべて確認させた上で、ティックごとに過去5回のVol値の平均を計算させる必要があります。その後、適切なシグナルが生成され、現在の出来高値が平均出来高値を上回る場合、生成されたシグナルは強い出来高、現在の出来高、過去5回の出来高値、平均値で、それぞれの値が別行でチャートにコメントとして表示されます。現在値が平均値を下回る場合、生成される値は、弱い出来高、現在の出来高値、過去5回の出来高値、平均値で、それぞれの値が別行でチャートにコメントとして表示されます。以下は、この取引システムを作成するためのステップバイステップの設計図です。
- 戦略3:Price & Vol - Uptrend
この戦略に従って、現在と過去の出来高の指標値に加えて、現在と過去の高値をティックごとに確認して、買いシグナルを生成する上昇トレンド時に機能するシンプルな取引システムを作成します。この戦略に基づき、現在の高値が前回を上回り、現在の出来高が前回を上回る場合、チャート上に買いシグナル、現在の高値、前回の高値、現在の出来高、前回の出来高のそれぞれの値が別行でチャートにコメントとして表示されます。あるいは現在の高値が前回を上回り、現在の出来高が前回を下回る場合、買いシグナルがないため、以前のすべての種類の値のみを表示する、といった機能が必要です。以下は、この取引システムを作成するためのステップバイステップの設計図です。
- 戦略4:Price & Vol - Downtrend
この戦略は、先ほどとは逆になります。下降トレンドの時に、現在と前回の出来高指標の値に加えて、現在と過去の安値をティックごとに確認して、売りシグナルを生成する簡単な取引システムを作成します。現在の安値が前回を下回り現在の出来高が前回を上回る場合には、チャート上に現在の安値、前回の安値、現在の出来高、前回の出来高のそれぞれの値を別行でチャートにコメントとして表示し、現在の安値が前回を下回り同時に現在の出来高が前回を下回る場合は、売りシグナルを発生せずに前の種類のすべての値のみを発生するシステムが必要です。次は、この取引システムを作成するためのステップバイステップの設計図です。
- 戦略5:MA & Vol戦略
この戦略に従って、出来高と移動平均の2つの指標をティックごとに確認して、2つ(売りと買い)の移動平均の比較に基づいて買いまたは売りのシグナルがあるかどうかを判断できる取引システムを作成します。売りが買いを上回り、その後、売りが買いを下回り、同時に現在の出来高値が以前よりも大きくなった場合、システムは買いシグナルを生成します。2番目のシナリオは、売りMAが買いMAを下回り、その後、売りMAが買いMAを上回り、同時に現在の出来高値が以前よりも大きくなった場合で、システムは売りシグナルを生成します。次は、このような戦略を立てるためのステップバイステップの設計図です。
Volumes取引システム
この記事で最も興味深いのは、これまでのものをすべて取引システムに変換して、自動的かつ正確にシグナルを出す方法についてです。各戦略の取引システムを設計しますが、まずは各戦略の基礎となる出来高の現在値を生成する取引システムを設計します。
- double型の出来高配列を作成します。
double VolArray[];
- ArraySetAsSeries関数を使用して配列を並び替え、ブール値(trueまたはfalse)を返します。
ArraySetAsSeries(VolArray,true);
- VolDefの変数を作成した後、iVolumesを使用して出来高を定義します。iVolumes関数は、Volumes指標のハンドルを返し、そのパラメータは(銘柄、期間、適用出来高)です。現在の銘柄に適用できるように(_Symbol)を、現在の時間枠に適用できるように(_period)を使用しました。
int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
- CopyBuffer関数を使ってVolumes指標からデータを取得し、配列に入力します。
CopyBuffer(VolDef,0,0,3,VolArray);
- VolValue用の変数を作成後、NormalizeDouble関数で出来高値を算出します。NormalizeDouble関数は、double型の値を返します。
int VolValue=NormalizeDouble(VolArray[0],5);
- Comment関数によるVolumes指標値のコメントの関数を作成します。
Comment("Volumes Value is: ",VolValue);
以下は、前回の取引システムの全コードです。
//+------------------------------------------------------------------+ //| Simple Volumes.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 an array for Volume double VolArray[]; //sorting the array from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating current vol value int VolValue=NormalizeDouble(VolArray[0],5); //creating a comment with current vol value Comment("Volumes Value is: ",VolValue); } //+------------------------------------------------------------------+
MetaTrader 5で実行できるようにこのコードをコンパイルした後、次がナビゲータウィンドウで表示されます。
ファイルをダブルクリックするかチャート上にドラッグ&ドロップすると、EAウィンドウが表示されます。
その後、EAがチャートに接続されます。
以下は、テストによって生成されたシグナルの例です。
- 戦略1:Vol Movement
現在の出来高と前回の出来高の値の比較に基づいて、Volumes指標の動きをチャート上のコメントによって通知する取引システムを作成するには、次のようにコードを記述することになります。
//+------------------------------------------------------------------+ //| Vol - 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() { //Create an array for Volume double VolArray[]; //sorting the array from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating current vol value double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //Conditions of vol movements //Volume increasing if(VolCurrentValue>VolPrevValue) { Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); } //Volume decreasing if(VolCurrentValue<VolPrevValue) { Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); } } //+------------------------------------------------------------------+
次がコードの違いです。
出来高の現在値と前回値の計算:
double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5);
戦略の条件:
Volumes指標が増加:
if(VolCurrentValue>VolPrevValue) { Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); }
Volumes指標が減少:
if(VolCurrentValue<VolPrevValue) { Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); }
このコードをコンパイルすると、ナビゲータウィンドウにEAが表示されるようになります。
ダブルクリックすることで、ウィンドウが表示されます。
[アルゴリズム取引を許可する]にチェックを入れて[OK]ボタンを押すと、チャートにプログラムが接続されます。
以下は、Vol-Movement戦略の生成シグナルの例で、現在と前回のデータをデータウィンドウに表示したものです。
出来高の増加
現在のデータウィンドウ:
前回のデータウィンドウ:
出来高が減少:
現在のデータウィンドウ:
前回のデータウィンドウ:
- 戦略2:Vol - Strength
以下は、この戦略の取引システムを作成するための完全なコードで、現在のVolumes指標の値と以前の値の比較に基づいて、Volumes指標の強さのシグナルを自動生成します。
//+------------------------------------------------------------------+ //| Vol - 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() { //Create an array for Volume double VolArray[]; //sorting the array from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,11,VolArray); //calculating current vol && 5 previous volume values double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue1=NormalizeDouble(VolArray[1],5); double VolPrevValue2=NormalizeDouble(VolArray[2],5); double VolPrevValue3=NormalizeDouble(VolArray[3],5); double VolPrevValue4=NormalizeDouble(VolArray[4],5); double VolPrevValue5=NormalizeDouble(VolArray[5],5); //calculating AVG of 5 previous volume values double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5); //conditions of Volume strength based on comparing current to AVG //strong volume if(VolCurrentValue>VolAVGVal) { Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); } //weak volume if(VolCurrentValue<VolAVGVal) { Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); } } //+------------------------------------------------------------------+
次がコードの違いです。
Volumes指標の現在と過去5回の値の計算:
double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue1=NormalizeDouble(VolArray[1],5); double VolPrevValue2=NormalizeDouble(VolArray[2],5); double VolPrevValue3=NormalizeDouble(VolArray[3],5); double VolPrevValue4=NormalizeDouble(VolArray[4],5); double VolPrevValue5=NormalizeDouble(VolArray[5],5);
Volume指標の過去5回の平均値の計算:
double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5);
戦略の条件:
強い出来高:
if(VolCurrentValue>VolAVGVal) { Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); }
弱い出来高:
if(VolCurrentValue<VolAVGVal) { Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); }
この戦略をコンパイルした後、EAがナビゲータウィンドウで表示されます。
ファイルをチャート上にドラッグ&ドロップすることで、EA ウィンドウが表示されます。
[OK]をクリックすると、チャートに接続されます。
以下は、出来高の強弱に応じた生成シグナルの例です。
強い出来高:
弱い出来高:
- 戦略3:Price & Vol - uptrend
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| Price&Vol - 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() { //Create arrays for price & Volume MqlRates PriceArray[]; double VolArray[]; //filling price array with data int Data=CopyRates(_Symbol,_Period,0,3,PriceArray); //sorting arrays from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating the current and previous values of highs and volume double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5); double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //Conditions of buy signal //Buy signal if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue) { Comment("Buy Signal during uptrend", "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } //no signal if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue) { Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } } //+------------------------------------------------------------------+
次がコードの違いです。
出来高と価格の配列を作るために、出来高の配列は先ほどと同じようにdouble型にします。価格、出来高、スプレッドを格納する価格の配列には「MqlRates」を使用することにします。
MqlRates PriceArray[]; double VolArray[];
Dataの整数型変数を作成した後、CopyRates関数を使って価格配列に入力します。
int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
高値と出来高の現在値と前回値の計算:
double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5); double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5);
高値と出来高の値をもとにした戦略の条件:
買いシグナル:
if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue) { Comment("Buy Signal during uptrend", "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
シグナルなし:
if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue) { Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
このコードをコンパイルすると、ナビゲータウィンドウにEAが表示されます。
このEAを実行して、上記の戦略に従ってシグナルを発生させたい場合は、ファイルをダブルクリックしてウィンドウを開きます。
[OK]をクリックすると、EAがチャートに接続されます。
次は、Price and Vol - Uptrend戦略に基づき、データウィンドウで生成されたシグナルの例です。
買いシグナル:
現在のデータ:
前回のデータ:
シグナルなし:
現在のデータ:
前回のデータ:
- 戦略4:Price & Vol - downtrend
この戦略に基づく取引システムを作成するための完全なコードは、次のものと同じになります。
//+------------------------------------------------------------------+ //| Price&Vol - 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 arrays for price & Volume MqlRates PriceArray[]; double VolArray[]; //filling price array with data int Data=CopyRates(_Symbol,_Period,0,3,PriceArray); //sorting arrays from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating current and previous of lows and volume double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5); double PrevLowValue=NormalizeDouble(PriceArray[1].low,5); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //Conditions of short signal //short signal if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue) { Comment("Short Signal during downtrend", "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } //no signal if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue) { Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } } //+------------------------------------------------------------------+
次がコードの違いです。
Price & Vol - Downtrend戦略に基づくシグナルの発生条件:
売りシグナル:
if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue) { Comment("Short Signal during downtrend", "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
シグナルなし:
if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue) { Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
このコードをコンパイルすると、ナビゲータでEAが利用できるようになります。
ファイルをダブルクリックすると、EAのウィンドウが表示されます。
[OK]をクリックすると、EAがチャートに接続されます。
次は、現在と前回のデータウィンドウで生成されたシグナルの例です。
売りシグナル:
現在のデータ:
前回のデータ:
シグナルなし:
現在のデータ:
前回のデータ:
- 戦略5:MA & Vol戦略
この戦略に基づいて、以下のコードで取引システムを作成します。
//+------------------------------------------------------------------+ //| MA&Vol Strategy.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 arrays for MA & Volume double MAShortArray[],MALongArray[]; double VolArray[]; //sorting arrays from the current data ArraySetAsSeries(MAShortArray,true); ArraySetAsSeries(MALongArray,true); ArraySetAsSeries(VolArray,true); //defining MA & Volume int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE); int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE); int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling arrays CopyBuffer(MAShortDef,0,0,3,MAShortArray); CopyBuffer(MALongDef,0,0,3,MALongArray); CopyBuffer(VolDef,0,0,3,VolArray); //calculating MA && current volume values double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6); double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6); double MALongCurrentValue=NormalizeDouble(MALongArray[0],6); double MALongPrevValue=NormalizeDouble(MALongArray[1],6); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //conditions of buy and short signals //buy signal if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Buy signal"); } //short signal if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Short signal"); } } //+------------------------------------------------------------------+
次がコードの違いです。
売り移動平均、買い移動平均、出来高の配列の作成:
double MAShortArray[],MALongArray[]; double VolArray[];
これらの配列の並べ替え:
ArraySetAsSeries(MAShortArray,true); ArraySetAsSeries(MALongArray,true); ArraySetAsSeries(VolArray,true);
移動平均のハンドルを返すiMA関数を使って売りMAと買いMAを定義し、そのパラメータは(銘柄、期間、平均期間、水平シフト、MAの種類である平滑化タイプ、適用価格)であり、iVolumes関数で出来高を定義することは、前に述べたのと同様です。
int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE); int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE); int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
配列への入力:
CopyBuffer(MAShortDef,0,0,3,MAShortArray); CopyBuffer(MALongDef,0,0,3,MALongArray); CopyBuffer(VolDef,0,0,3,VolArray);
売りMA、買いMA、出来高の前回値に加え、今回値の計算:
double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6); double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6); double MALongCurrentValue=NormalizeDouble(MALongArray[0],6); double MALongPrevValue=NormalizeDouble(MALongArray[1],6); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5);
戦略のシグナルが生成される条件:
買いシグナル:
if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Buy signal"); }
売りシグナル:
if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Short signal"); }
このコードをコンパイルすることで、ナビゲータにEAが表示されるようになります。
チャート上にドラッグ&ドロップすることで、EAが接続されます。
以下は、この戦略に基づき生成されたシグナルの例です。
買いシグナル:
売りシグナル:
結論
この便利なテクニカル指標をうまく取り上げ、取引に役立つ出来高指標の適切な使用方法を学んでいただけたと思います。出来高指標とは何か、何を測定するのか、どのように読み、どのように使うのか、さらに出来高の定義というトピックを通じて、FXと株式市場における出来高の違いを明らかにしました。また、簡単な出来高戦略も学びました。
- Vol - Movement:出来高の増減があった場合にその動きを知らせる
- Vol - Strength:出来高平均と比較した現在の出来高の動きの強さを知らせる
- Price and Vol - Uptrend:上昇トレンドの間、価格の動きとそれに伴う出来高から買いシグナルを得る
- Price and Vol - Downtrend:下降トレンドの間、価格の動きとそれに伴う出来高から売りシグナルを得る
- MA and Vol:移動平均線とそれに付随する出来高のクロスオーバーに基づいて買いシグナルと売りシグナルを取得する
これらの戦略は、インジケーターの基本概念に基づき、必要に応じてテストと最適化を行った後でも使用することができます。そのすべてを、Volumesの戦略というトピックを通して学びました。Volumes戦略の設計図というトピックを通して、言及された各戦略の取引システムを作るために、考えを整理するためのステップバイステップの設計図の作成方法を学びました。今回の記事の中で最も興味深い部分、すなわち、MetaTrader5の取引ターミナルで使用できるように、シグナルを自動的かつ正確に生成するためのMQL5による各戦略の取引システムの作成方法について学びました。
すべての人に適した戦略は存在しないので、実際の口座で使用する前に必ずテストすることが重要です。この記事がお役に立ち、記事のトピックや関連する他のトピックに関連する新しいアイデアを見つける手助けとなれば幸いです。また、この指標を他のテクニカルツールと組み合わせることで、より有意義なものにすることもできます。記事では、非常に洞察力のあるアプローチとして、出来高と移動平均の組み合わせを取り上げました。同じような記事をもっと読みたい方は、最も人気のあるテクニカル指標に基づいて取引システムを設計する方法についての私の他の記事をお読みください。ぜひ、参考にしてください。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11050





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索