VIDYAによる取引システムの設計方法を学ぶ
はじめに
新しいテクニカルツールと、シンプルな戦略に基づいた取引システムの設計方法について学ぶ、初心者向け連載の新しい記事です。今回取り上げるのはVIDYA(Variable Index Dynamic Average、可変インデックス動的平均)指標です。この指標は、取引で使用することができるトレンドフォロー型指標の1つです。この用語の概念は、この指標がトレンドに従うということ、つまり、遅行指標であり、値動きの後に動くということです。この指標を次のトピックを通してカバーしていきます。
プログラミングスキルを高めたい方は、理解を深めるために、学んだことをご自分で応用してみてください。学習プロセスにおいて練習は非常に重要なステップです。MetaTrader 5の取引ターミナルに組み込まれているMQL5(MetaQuotes言語5)を使用します。ダウンロード方法や使用方法がわからない場合は、以前の記事から「MetaEditorでMQL5コードを書く」を読んでみてください。
免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。
VIDYAの定義
VIDYA(Variable Index Dynamic Average、可変インデックス動的平均)は、Tushar Chande氏によって開発されたトレンドフォロー型の指標です。指数移動平均のように見えますが、相対的な価格変動に基づいて動的に調整されます。この指標では、ボラティリティは、正と負の動きの合計の間の比率を測定することによってChande Momentum Oscillator (CMO)によって測定されます。これは計算法を学ぶときにわかります。CMOを使用して指数移動平均が平滑化されます。この指標の設定はパラメータで、CMO期間とEMA期間になります。他の移動平均同様、この指標はトレンドの種類(上昇トレンドまたは下降トレンド)を取得するために使用できます。トレンドの種類とその見極め方について詳しく知りたい方は、以前の記事で紹介したトレンドの定義を読んでみてください。また、この指標は売買シグナルを生成するために使用することもできます。「VIDYA戦略」を通して、それに基づいた簡単な戦略をいくつか見てみましょう。
次に、VIDYA指標の計算方法を学び、その主な概念をより深く理解する必要があります。手動で計算するには以下の手順に従います。
- EMAを算出します
EMA(i) = 価格(i) * F + EMA(i-1)*(1-F)
ここで、
EMA(i) = 現在のEMA
価格(i)=現在価格
F(平滑化係数)=2/(期間+1のEMA)
EMA(i-1) = 前回のEMA値
- VIDYA値を算出します
VIDYA(i) = Price(i) * F * ABS(CMO(i)) + VIDYA(i-1) * (1 - F* ABS(CMO(i)))
ここで、
VIDYA(i)=現在のVIDYA値
ABS(CMO(i)) = Chande Momentum Oscillatorの現在値の絶対値
VIDYA(i-1)=前回のVIDYA値
- Chande Momentum Oscillator (CMO)を算出します
CMO(i) = (UpSum(i) - DnSum(i))/(UpSum(i) + DnSum(i))
ここで、
UpSum(i) = 期間中のプラス移動量の総和の現在値
DnSum(i) = 期間中のマイナス移動量の総和の現在値
その後、VIDYA指標を取得することができます。現在では、手動で計算する必要はなく、MetaTrader 5の取引プラットフォームで利用可能な指標から選択してチャートに挿入するだけです。次が挿入方法です。
[挿入] --> [インディケータ] --> [トレンド] --> [Variable Index Dynamic Average]にアクセスします。
以下のウィンドウが開いて指標のパラメータが表示されます。
1 - Chande Momentum Oscillator (CMO)の期間
2 - 指数移動平均(EMA)の期間
3 - 価格の種類
4 - VIDYA線の色
5 - VIDYA線のスタイル
6 - VIDYA線の太さ
これまでのパラメータをすべて決定し、[OK]を押すと、以下のようにチャートに指標が表示されます。
先のチャートでわかるように、この指標はチャートに挿入され、その値と値動きに基づいて価格の上下に線が引かれます。VIDYAの線が価格の上にあるときは弱気のコントロールがあることを意味し、逆にVIDYAの線が価格の下にあるときは強気のコントロールがあることを意味します。
VIDYA戦略
このトピックでは、VIDYA指標の主要概念に基づいた簡単な戦略を通じて、VIDYA指標の使い方を学びます。この指標は、他のテクニカルツールや指標と組み合わせることで、より信頼性が高く効果的な結果を得ることができます。なぜなら、多角的な見識を深めることができ、これがテクニカル分析の特徴の1つだからです。
デフォルト設定(9,12)で現在の終値と現在のVIDYAを比較して、上か下かトレンドタイプでシグナルを出します。現在の終値がVIDYAを上回ったら上昇トレンドのシグナルを出します。一方、現在の終値がVIDYAを下回る場合、下降トレンドでシグナルを出します。
現在の終値 > VIDYA → 上昇トレンド
現在終値 < VIDYA → 下降トレンド
前の戦略の同じ値を比較して、売買シグナルを出します。現在の終値がVIDYAを上回ったら買いシグナルを出します。逆に、現在の終値が現在のVIDYAを下回ったら売りシグナルを出します。
現在の終値 > VIDYA → 買いシグナル
現在の終値 < VIDYA → 売りシグナル
VIDYA (9、12)とVIDYA (20、50)と比較し、売買シグナルを出します。VIDYA(9、12)がVIDYA(20、50)を上回った場合は買いシグナルを出します。一方、現在のVIDYA(9、12)が現在のVIDYA(20、50)を下回った場合は売りシグナルを出します。
VIDYA (9, 12) > VIDYA (20, 50) → 買いシグナル
VIDYA (9, 12) < VIDYA (20, 50) → 売りシグナル
これまでの3つのシンプルな戦略を通じて、VIDYA指標の主要概念に基づいた使い方を学びました。
VIDYA戦略の設計図
このトピックでは、各戦略の取引システムをスムーズに構築できるよう、ステップバイステップの設計図を作成します。
この戦略では、トレンドの種類についてのシグナルを発生させることができる取引システムを作ります。トレンドの種類を判断するために、取引システムは現在の終値と現在のVIDYA値という2つの値を確認する必要があります。現在の終値がVIDYA値を上回ったら、トレンドが上向きであることを示すシグナルをデします。
取引システムは、以下のような値でチャートにコメントを返します。
- 上昇トレンド
- 現在の終値
- 現在のVIDYA値
もう1つのシナリオでは、現在の終値が現在のVIDYAの値を下回った場合に、トレンドが下降していることを示すシグナルを出します。
取引システムは、以下のような値でチャートにコメントを返します。
- 下降トレンド
- 現在の終値
- 現在のVIDYA値
次の図は、この戦略の設計図です。
この戦略では、売買シグナルがある場合に警告するために使用することができる取引システムを作成します。この戦略では、VIDYA Trend Identifierと同じ値を使用して、異なるシグナルを出します。取引システムは、現在の終値と現在のVIDYA値の2つの値を確認して、現在の終値がVIDYA値を上回った場合は買いシグナルを出します。
取引システムは次のような値を返します。
- 買いシグナル
- 現在の終値
- 現在のVIDYA値
逆に、現在の終値がVIDYAを下回れば売りシグナルを出します。
取引システムは、以下のような値でチャートにコメントを返します。
- 売りシグナル
- 現在の終値
- 現在のVIDYA値
この戦略では、売買のシグナルを生成するために使用できる取引システムを作成します。(9, 12) VIDYAの現在値と(20, 50) VIDYAの現在値の2つの値を連続して確認します。(9、12)の現在値が(20、50)の現在値を上回ったら買いシグナルを出します。
取引システムは次のような値を返します。
- 買いシグナル
- 現在の終値
- VIDYA(9、12)の現在値
- VIDYA (20, 50)の現在値
一方、VIDYA(9、12)の現在値がVIDYA (20, 50)の現在値を下回ったら売りシグナルを出します。
取引システムは次のような値を返します。
- 売りシグナル
- 現在の終値
- VIDYA(9、12)の現在値
- VIDYA (20, 50)の現在値
次の図は、この戦略の設計図です。
自動売買システムを作るのに役立つように、言及した各戦略の簡単なステップバイステップの設計図を設計しました。これで、VIDYA取引システムの最も興味深いトピックである、各戦略の取引システムを作るための準備が整いました。
VIDYA取引システム
このシンプルな取引システムでは、VIDYA指標の現在値がチャート上にコメントとして表示されるため、継続的に確認することができます。
以下の手順は、必要なことをおこなうための取引システムを作成する方法です。
実数型または浮動小数点型の1つで端数のある値を表す doubleを使用して、vidyaArray の配列を作成します。
double vidyaArray[];
作成した配列vidyaArrayをArraySetAsSeries関数で並び替え、ブーリアン値を返すようにします。
ArraySetAsSeries(vidyaArray,true);
iVIDyA関数で指標のハンドルを返し、vidyaDefにVIDYAの定義と等しい整数変数を作成することにします。
そのパラメータは次の通りです。
- symbol:現在の銘柄に適用(_Symbolを使用)
- period:現在の期間または時間枠に適用(_Periodを使用)
- cmo_period:Chande Momentumの期間(9を使用)
- ema_period:指数移動平均の平滑化期間(12を使用)
- ma_shift:チャート上の水平方向のシフト(オプション)(0を使用)
- applied_price:価格の種類(終値を使用)
int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
作成した配列に、CopyBuffer関数を使ってVIDYA指標からデータを取得し、埋めていきます。
この関数のパラメータは次の通りです。
- indicator_handle:指標ハンドル(vidyaDefを使用))
- buffer_num: 指標バッファの番号(0を使用)
- start_pos:開始位置(0を使用)
- count:コピーする量(3を使用)
- buffer[]:コピーのターゲット配列(vidyaArrayを使用)
CopyBuffer(vidyaDef,0,0,3,vidyaArray);
NormalizeDouble関数で変数を作成後、double型の値を返すvidyaValを定義します。
この関数のパラメータは次の通りです。
- value:正規化した数値(vidyaArray[0]を使用)
- digit:小数点以下の桁数(6を使用)
double vidyaVal = NormalizeDouble(vidyaArray[0],6);
Comment関数を使って、現在のVIDYAの値をチャートにコメントとして生成します。
Comment("VIDYA Value is ",vidyaVal);
この取引システムの完全なコードは、次のようになります。
//+------------------------------------------------------------------+ //| Simple VIDYA.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() { double vidyaArray[]; ArraySetAsSeries(vidyaArray,true); int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE); CopyBuffer(vidyaDef,0,0,3,vidyaArray); double vidyaVal = NormalizeDouble(vidyaArray[0],6); Comment("VIDYA Value is ",vidyaVal); } //+------------------------------------------------------------------+
この取引システムのエキスパートアドバイザー(EA)がナビゲータウィンドウで次のように表示されるようになります。
チャート上にドラッグ&ドロップすると、このEAのウィンドウが以下のように表示されます。
[OK]を押すと、以下のようにEAが接続されていることがわかります。
前のチャートでわかるように、右上でEAが接続されています。そして、以下のように目的のシグナルが現れることがわかります。
先ほどのチャートの左上にあるように、VIDYAの現在値が表示されます。内蔵のVIDYA指標の値と同じ値であることを確認する必要がある場合、EAを接続した後に、EAと同じ設定で内蔵指標を挿入することができます。これは次のようになります。
先ほどのチャートでは、右上にEAが表示され、左上にはこのEAの現在値が表示されています。また、右のデータウィンドウでは、ビルトイン指標が価格チャートに接続されており、その値が表示されています。明らかに、どちらの値も同じであることがわかります。
この戦略の取引システムを作成する場合、この戦略の全コードは以下のようになります。
//+------------------------------------------------------------------+ //| VIDYA trend identifier.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() { MqlRates priceArray[]; double vidyaArray[]; int Data=CopyRates(_Symbol,_Period,0,3,priceArray); ArraySetAsSeries(vidyaArray,true); int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE); CopyBuffer(vidyaDef,0,0,3,vidyaArray); double currentClose=NormalizeDouble(priceArray[2].close,6); double vidyaVal = NormalizeDouble(vidyaArray[0],6); if(currentClose>vidyaVal) { Comment("Uptrend","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); } if(currentClose<vidyaVal) { Comment("Downtrend","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
配列を2つ作成します(MqlRates関数を使って価格用の配列を、先ほどのdoubleを使ってVIDYA用の配列)。
MqlRates priceArray[]; double vidyaArray[];
priceArrayについては、次のパラメータでMqlRatesの履歴データを取得するCopyRates関数を使用します。そのパラメータは次の通りです。
- 銘柄名:_Symbolを使用
- timeframe:_Periodを使用
- 開始時間:0を使用
- 停止時間:3を使用
- レート配列:priceArrayを使用
vidyaArrayには、先ほどと同じようにArraySetAsSeries関数を使用します。
int Data=CopyRates(_Symbol,_Period,0,3,priceArray); ArraySetAsSeries(vidyaArray,true);
現在の価格の終値と現在のVIDYAの値を定義します。
double currentClose=NormalizeDouble(priceArray[2].close,6); double vidyaVal = NormalizeDouble(vidyaArray[0],6);
この戦略の条件は次の通りです。
1.上昇トレンドの場合
if(currentClose>vidyaVal) { Comment("Uptrend","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); }
2.下降トレンドの場合
if(currentClose<vidyaVal) { Comment("Downtrend","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); }
このコードをコンパイルして、目的のチャートに挿入すると、次のようになります。
ご覧のように、先ほどのチャートの右上にVIDYA Trend IdentifierのEAが接続されていることがわかります。これでシグナルの受信を開始することができます。以下は、テスト時に得られたこれらのシグナルの例です。
1.上昇トレンドの場合
先ほどのチャートの左上にあるように、次のような値を確認することができます。
- 上昇トレンド
- 現在の終値
- 現在のVIDYA値
2.下降トレンドの場合
先ほどのチャートには以下の値があります。
- 下降トレンド
- 現在の終値
- 現在のVIDYA値
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| VIDYA one crossover.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() { MqlRates priceArray[]; double vidyaArray[]; int Data=CopyRates(_Symbol,_Period,0,3,priceArray); ArraySetAsSeries(vidyaArray,true); int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE); CopyBuffer(vidyaDef,0,0,3,vidyaArray); double currentClose=NormalizeDouble(priceArray[2].close,6); double vidyaVal = NormalizeDouble(vidyaArray[0],6); if(currentClose>vidyaVal) { Comment("Buy signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); } if(currentClose<vidyaVal) { Comment("Sell signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
この戦略に基づいてコメントします。
1.買いシグナルの場合
if(currentClose>vidyaVal) { Comment("Buy signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); }
2.売りシグナルの場合
if(currentClose<vidyaVal) { Comment("Sell signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA Value is ",vidyaVal); }
このコードをコンパイルした後、以下のように目的のチャートに挿入します。
先のチャートでわかるように、EAがチャートの右上に接続されています。その後、この戦略に基づき、売買のシグナルを得ることになります。システムテストの例を以下に示します。
1.買いシグナルの場合
前チャートの左上でわかるように、VIDYA One Crossoverを基準にすると、以下のような値になることがわかります。
- 買いシグナル
- 現在の終値
- 現在のVIDYA値
2.売りシグナルの場合
先ほどのチャートの左上にあるように、次のような値を確認することができます。
- 売りシグナル
- 現在の終値
- 現在のVIDYA値
以下は、このVIDYA Two Crossover戦略の取引システムを作成するためのフルコードです。
//+------------------------------------------------------------------+ //| VIDYA two crossover.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() { MqlRates priceArray[]; double vidyaArray[]; double vidyaArray1[]; int Data=CopyRates(_Symbol,_Period,0,3,priceArray); ArraySetAsSeries(vidyaArray,true); ArraySetAsSeries(vidyaArray1,true); int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE); int vidyaDef1 = iVIDyA(_Symbol,_Period,20,50,0,PRICE_CLOSE); CopyBuffer(vidyaDef,0,0,3,vidyaArray); CopyBuffer(vidyaDef1,0,0,3,vidyaArray1); double currentClose=NormalizeDouble(priceArray[2].close,6); double vidyaVal = NormalizeDouble(vidyaArray[0],6); double vidyaVal1 = NormalizeDouble(vidyaArray1[0],6); if(vidyaVal>vidyaVal1) { Comment("Buy signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA (9,12) Value is ",vidyaVal,"\n", "Current VIDYA (20,50) Value is ",vidyaVal1); } if(vidyaVal<vidyaVal1) { Comment("Sell signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA (9,12) Value is ",vidyaVal,"\n", "Current VIDYA (20,50) Value is ",vidyaVal1); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
価格用、vidyaArray、vidyaArray1の3つの配列を作成します。
MqlRates priceArray[]; double vidyaArray[]; double vidyaArray1[];
作成した配列を並び替えます。
int Data=CopyRates(_Symbol,_Period,0,3,priceArray); ArraySetAsSeries(vidyaArray,true); ArraySetAsSeries(vidyaArray1,true);
vidyaDefとvidyaDef1を定義します。
int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE); int vidyaDef1 = iVIDyA(_Symbol,_Period,20,50,0,PRICE_CLOSE);
vidyaArrayとvidyaArray1の配列に入力します。
CopyBuffer(vidyaDef,0,0,3,vidyaArray); CopyBuffer(vidyaDef1,0,0,3,vidyaArray1);
currentClose、vidyaVal、vidyaVal1の値を定義します。
double currentClose=NormalizeDouble(priceArray[2].close,6); double vidyaVal = NormalizeDouble(vidyaArray[0],6); double vidyaVal1 = NormalizeDouble(vidyaArray1[0],6);
この戦略に基づいて生成されるシグナルの条件は次の通りです。
1.買いシグナルの場合
if(vidyaVal>vidyaVal1) { Comment("Buy signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA (9,12) Value is ",vidyaVal,"\n", "Current VIDYA (20,50) Value is ",vidyaVal1); }
2.売りシグナルの場合
if(vidyaVal<vidyaVal1) { Comment("Sell signal","\n", "Current Close Value is ",currentClose,"\n", "Current VIDYA (9,12) Value is ",vidyaVal,"\n", "Current VIDYA (20,50) Value is ",vidyaVal1); }
このコードをコンパイルして、目的のチャートに挿入すると、次のようになります。
先のチャートでわかるように、EAがチャートの右上に接続されています。この戦略に基づく売買シグナルを見ることができるようになります。システムテストの例を以下に示します。
買いシグナルの場合
前のチャートでわかるように、クロスオーバーの後、左上に次のような値があります。
- 買いシグナル
- 現在の終値
- (9,12) VIDYAの現在値
- (20,50) VIDYAの現在値
売りシグナルの場合
もう1つのシナリオでは、前のチャートにあるように、クロスオーバーの後、左上に次のような値が表示されます。
- 売りシグナル
- 現在の終値
- (9,12) VIDYAの現在値
- (20,50) VIDYAの現在値
結論
この記事を通じて、VIDYA(Variable Index Dynamic Average、可変インデックス動的平均)が何であるかを明確にすることができるより多くのトピックを取り上げました。すべてのトピックが終わったので、それが詳細にお分かりになったかと思います。VIDYA(Variable Index Dynamic Average、可変インデックス動的平均)とは何か、何を測定する指標か、どのように手動で計算すればその主な概念を理解できるか、そしてどのようにチャートに挿入し読み取るかを確認しました。そのすべてを、「VIDYAの定義」で学びました。その後、「VIDYA戦略」を通して、以下のような戦略を学んだので、指標の主要概念に基づいた簡単な戦略を通して、どのように使うことができるかを学びました。
- VIDYA Trend Identifier戦略:上昇トレンドと下降トレンドがある場合、トレンドタイプでシグナルを取得
- VIDYA One Crossover戦略:価格とVIDYAラインのクロスオーバーに基づき、買いまたは売りのシグナルを取得
- VIDYA Two Crossover戦略:設定値(9,12)のVIDYAと設定値(20,50)のVIDYAのクロスオーバーで売買シグナルを取得
プログラミングに限らず、あらゆる学習プロセスにおいて、理解を深め、スキルを向上させるためには、練習が非常に重要なステップとなります。初心者のうちは、設計した取引システムのコードを自分で書いてみて、プログラミングスキルを身に付けていただければと思います。この記事の主な概念は教育目的であり、戦略を最適化したり変更したりする必要があるかもしれません。また、万人に適した戦略は存在しないため、読者の取引スタイルに適していないことが分かるかもしれません。
この記事が読者の役に立ち、記事のトピックや関連するトピックについて良い洞察が得られたなら幸いです。似たような記事をもっと読んで、最も人気のあるテクニカル指標とその使い方や取引システムの設計方法について学びたい方は、この初心者向け連載の私の過去の記事を読んでみてください。RSI、MACD、ストキャスティック、移動平均、ボリンジャーバンド、エンベロープなどによる取引システムの設計についての記事があります。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11341
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索