通貨バスケットをトレードするときに利用可能なパターン。 パート III

Andrei Novichkov | 22 8月, 2017


イントロダクション

このトピックの3番目で、おそらく最後の記事です。 これまでにメインとセカンダリのパターンだけでなく、そのアプリケーションの戦術を分析しました。 目標のリストは、波動解析や VSA などの複雑であいまいなテクニカルの説明が含まれていませんが、提供された題材はすでに取引通貨ペアバスケットに十分です。 この記事では、複合オシレーターとトレンドフォローインジケーターを適用する際に発生するパターンを検討するためにクロージャーを使ってみます。 ここでは、複合トレンドフォローインジケーターについてお話します。

ソースデータとしてのバスケット通貨インデックス

前の記事のいずれかへのコメントで、有望なアイデアにつまずきました。バスケットの各通貨ペアの指標値を受信し平均値を定義する代わりに、複合インジケーターのデータに方程式を適用する必要があります。 これを明確にしましょう。 たとえば、バスケットの各通貨ペアの WPR 標準テクニカルインジケーターの値を受け取り、結合された WPR データを計算します。 得られた値を用いて、算術平均を算出しました(一般に、幾何平均も同様に適用できます)。 これより、単一通貨の "通貨ペアバスケット" の動作を示す複合 WPR が発生しました。

ここで、同じデータを得るための代替メソッドを提案する。 以前、バスケットの通貨インデックスとその計算メソッドについては既に説明しています。 覚えているかもしれませんが、バスケットの通貨の "クリア価格"は、すべてのバスケットのペアの価格の幾何学的な意味です。 そこで、標準 WPR 計算式をバスケット通貨インデックスチャートに適用することによって、結合された WPR 値を取得します。 したがって、RSI またはSTOCHの値を取得するためには、計算式を使用する必要があります。 このアイディアは実に面白い。 試しに調べてみましょう。 この仮定が正しければ、前の記事で記述されていたメソッドを使用した後、受け取った物と同じように結合されたインジケーターの価値を得ます。

まず最初に、コードが添付された wpr .zip ファイルで利用できる2つのインジケーターが必要です。

  • testWPR は、以前の記事にあります。 USD バスケットには通貨ペアのセットを使用します: EURUSD、GBPUSD、ドル、NZDUSD、USDCAD、USDCHF、USDJPY。 比較の参考として使用します。
  • WPR テクニカルインジケーターコード。 コードベースにあります。 新しいインジケーターでは、メソッドを説明するために、そのフラグメントを使用します。 

結果として次のテストインジケーターになります。

//+------------------------------------------------------------------+
//|                                                testIndex+WPR.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots   1


input color   clrWPR = clrGreen;
input int wprperiod  = 14; 

double ind[],ma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int()
  {
//---インジケーターバッファマッピング
     
  IndicatorSetDouble(INDICATOR_MINIMUM,-100);
  IndicatorSetDouble(INDICATOR_MAXIMUM, 0);   
      
   ArraySetAsSeries(ma,true);   
   SetIndexBuffer(0,ma);
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE           ); 
   PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID            ); 
   PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 1            ); 
   PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrWPR            ); 
   PlotIndexSetString (0, PLOT_LABEL, "_tstdistance_MA" );       
   
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(1,ind , INDICATOR_CALCULATIONS);       
//---
   return(INIT_SUCCEEDED);
  }
  
string pair[]={"EURUSD","GBPUSD","AUDUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};
bool bDirect[]={false,false,false,false,true,true,true};
int iCount=7;

//calc. index  
double GetIndex(int shift) 
  {
   double res=1.0,t;
   double dBuf[1];
   for(int i=0; i<iCount; i++) 
     {
      t=CopyClose(pair[i],PERIOD_CURRENT,shift,1,dBuf);
      if(!bDirect[i]) dBuf[0]=1/dBuf[0];
      res*=dBuf[0];
     }//end for (int i = 0; i < iCount; i++)
   return (NormalizeDouble(MathPow (res, 1/(double)iCount), _Digits) );  
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
double HH,LL;

intOnCalculate(const int rates_total、
                constint prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
  
   if(prev_calculated==0 || rates_total>prev_calculated+1) 
     {
      int rt=rates_total;
      for(int i=1; i<rt; i++) 
        {
         ind[i]= GetIndex(i);
        }
      rt -= wprperiod;  
      for (int i = 1; i< rt; i++) 
        {
         ma[i] = GetMA(ind, i, wprperiod, _Digits);
        }        
     }
   else 
     {
         ind[0] = GetIndex(0);
         ma[0]  = GetMA(ind, 0, wprperiod, _Digits);
     }
   return(rates_total);
  }

//calc. WPR
double GetMA(const double& arr[], int index , int period, int digit) {
   double m = 0;
   HH = arr[ArrayMaximum(arr, index, period)];
   LL = arr[ArrayMinimum(arr, index, period)];   
   m = -100 * (HH - arr[index]) / (HH - LL);
   return (NormalizeDouble((m + 50) * 2, _Digits));
}


testWPRusdインジケーターと共に EURUSD ペアに適用してみましょう。 結果は次のとおりです。


最初のサブウィンドウは、テストインジケーターの曲線を表示し、2つ目は参照インジケーターの曲線を示します。 結果は期待外れなものになりました。 とにかく、得られた結果を分析しなければなりません。 テストインジケーターがタスクに適していないことが明らかになります。 常に可能な最大値に達します。 同時に、特別な相場にならず、価格が穏やかに移動します。 結果として、インジケーターの測定値の勾配は不当に高くなります。 その上、テストおよび参照のインジケーターの極度な価値ポジションは互いに非常によく一致する。 なぜ、極端な点で良い結果を得るのでしょうか。 答えは簡単です。 理由は WPR のインジケーターの計算の同等化にあります:

R% = - ((H – C)/(H – L)) x 100;

ただし

  • C: 終値;
  • L: 特定の期間の安値;
  • H: 特定の期間の高値

しかし、、高値と安値の値がありません。 テストインジケーターは、バスケットの通貨インデックス値を使用してその値を計算しますが、インデックスは終値で計算されます。 この技術的な理由で、きわめて頻繁にテストインジケーターの極値値を受け取ります。 したがって、、メソッド自体が間違っているか、非常に不正確であると言うことはできません。 逆に、極端な値のポジションの一致は反対を意味します。 予想外の障害をなくすことはできるでしょうか?

組み合わせバスケット通貨インデックスインジケーターをロウソク足としてプロットします。

もちろん可能です。 このことを達成するために、、ソースデータを取得する必要があります (すなわち、バスケット通貨インデックス) 曲線としてではなく、日本のロウソク足の終値をベースにします。 この場合、すべての必要な配列を取得し、WPR と他の計算の両方を実行することができます。 実際には、通貨バスケットインデックスのチャートは、従来の価格表に似ていますが、1つの通貨のペアではなく、チャートです。 慎重にバスケットを形成するすべての通貨に相対的なバスケットの通貨の価格チャートであると仮定します。

技術的には、このようなチャートをシンプルに取得することができます。 従来の「USD インデックス」は、1つの終値ラインではなく、ロウソクとして表示されることがよくあります。 どのようにすれば開発者が同じような結果を得ることができるでしょうか。 既に利用可能なテストインジケーターは、現在のタイムフレームのロウソクの終値の値を使用して計算します。 現在の期間のロウソク足の始値を使用して正確に同じ計算をインジケーターを補う場合、開発者は必要なロウソクの本体を定義する2つの値を取得します。 しかし、デメリットもあります。 同じメソッドを使用してバスケットの通貨インデックスのローソクの高値と安値を定義することは不可能です。 シンプルにバスケットの通貨ペアの平均または幾何平均を計算する場合、結果はバスケットの通貨のロウソク足の安値高値の正確な値を出しません. 理由は明白です。バスケット内の個々の通貨の組の安値高値が必ずしも同時に起こらないかもしれないからです。 もちろん可能な場合もありますが、決して保証されるものではありません。 開発者は、自己責任でこの手法を適用することができます。 ロウソクをプロットするために必要なすべての値を取得しますが、エラーがどれくらいになるかは、事前に推定することはできません。 保証された真の値を得るために、少なくとも分単位で計算する必要があります。 このような計算は、大きくターミナルをロードするので、別のアプリケーションに置くことをお勧めします。

とにかく、そのようなことはするつもりはありません。 後で理由を説明します。 一方で、始値と終値を使用する他の組み合わせのインジケーターだけでなく、安値高値配列に適していないと結論する必要があります。 その他のインジケーターの種類については、このメソッドは依然として興味深いものがあります。 以下に説明します。

通貨バスケットインデックスに基づくツール

以前の記事では、バスケット通貨インデックスのようなアプリケーションの例を分析しています。 バスケット通貨のインデックスチャートに移動平均を適用することを意図しています。 移動平均は、信頼性の高いツールです。 このアプリケーションは、バスケット通貨インデックスチャートと移動平均のクロスのパターンを提供します。 これは先ほど説明しました。 バスケットの通貨インデックスをソースデータとして使用する場合に使用できる他の計測方法を見てみましょう。 もちろん、記事の制限によりすべてのツールをカバーすることはできませんが、見通しを概説することはできます。

バスケットの通貨のインデックスチャートは、価格チャートであることを忘れないでください。 主なトレーダーツール (サポートとレジスタンスレベル、チャネルと Fibo レベル) で動作することができるかどうかを判断してみましょう。 また、インジケータチャートにそのようなツールを適用する能力を示す記事もあります。 それらも応用してみましょう。 これを行うには、USD とEURバスケット通貨インデックス (index.zip) のインジケーターを配置し、標準的な取り決めを実行します。


両方のチャートに標準のグラフィカルなツールを配置します。 このオプションは、唯一ではありませんが、非常に現実的です:

  • EURでの Fibo、上昇チャンネル、水平レベル
  • USDでくさびと水平レベルを形成する2つのライン

長方形と縦線を使用して点をマークし、EURUSD 価格が近くでどのように動作するかを見てみましょう。

  1. 上のチャネルのボーダーからのロールバックおよび EUR のFibo のレベル。 ドルに変わったことは起きません-わずかに減少するだけです。 メインチャート上の売りエリアに向かって動きを期待することができ、実際にそうなります。
  2. 別のロールバックユーロチャネルの上部の境界線。 売りエリアに向けてさらなる動きを期待することができますが、米ドルのインデックスがくさびの上部境界付近に移動するので、この場合は発生しません。 実際には、わずかな買いトレンドとレンジの動きがあります。
  3. しかし、ポイント2が続くので、EURインデックスチャネルは、USD によって下方のくさびのボーダーからロールバックするポイント5と結合して下方に壊れています。 主要な図表の売りの方向にかなり論理的な移動がある。
  4. 水平方向の EUR レベルからロールバックすると、ポイント7の USD インデックスウェッジブレイクアウトと一致します。 初めは、ユーロロールバックは、強烈であり、価格は売り方向に入るが、その後ウェッジブレイクアウト "上回る" 動きが買いに変更されます。 

予備的結論を導くことができます。 ここで複雑な通貨ペアの唯一のエピソードを考えているので、調査結果は、究極の真理として認識されるべきではありません。 信頼できるようにするために、異なった時間枠および通貨の組の長期観察を行なうべきです。 しかし、結果はやや心強いものです。 通貨ペアインデックスの結合インジケーターチャートに共通のグラフィカルな構造を適用することができます。 そのような構造の間に得られるパターンはよく知られているルールに続きます。

  • シグナルは他のシグナルで確認する必要があります。
  • 価格によって得られたパターンを扱うことは標準的な適用と比較して慣習的です。
  • 最終的な結論。 このようにして得られたパターンは2次的性質があります。 エントリポイントを検索するときに、おそらくストップロスを使用することができます。 つまり、パターンは役に立ちますが、2次的な役割を果たします。

別の視点から全体を分析してみましょう。 覚えているかもしれませんが、バスケットの通貨インデックスは、通貨バスケットに対するすべての通貨ペアの状態を示します。 したがって、EUR インデックスチャートポイントは EURUSD だけでなく、ユーロバスケットを形成する他の通貨ペアにも関連しています。 1つだけ結論があります。 おそらく、得られたパターンの "2次的性質" の原因は、通貨ペアのバスケットを使用して (ここでは米ドルです) 2 番目の通貨の影響を取り除こうとするトレーダーに起因します。 シンプルにバスケット内の他の通貨ペアを分析することによって仮定を確認することができます。 たとえば、ポイント2の2015.09.18 00:00 を見ましょう。 この時点で、価格がチャネルの上部の境界線からロールバックした後、一般的な売りトレンドを想定します。 興味のポイントは EURの図表で見つけられ、EUR のバスケットに含まれているすべての通貨の組を取り、その当時価格に何が起こったか見てください。:


結果はとても面白くて励みになります! 時間マーカーは、青色の垂直線で強調表示されています。 我々の予測は、ほとんどのペアで正当化されます。 トレーダーは、現在の (むしろ弱い) パターンを使用して相場に参入していた場合、利益を受けていると思います。 ペアでのストップロスも同様に可能です。 EURAUD と EURGBP だけでなく、(より低い程度で) EURUSD もそうです。 他のペアでは、トレーダーは利益を受けていると思います。 通貨ペアバスケットでのタスクの主な原則は、ここで正しいことが判明しています。トレーダーは一度にバスケットを形成するすべてのペアで入るバスケットの通貨のエントリシグナルを受信します。 ペアの損失で、利益を決済します。 すでにシリーズの前の記事で詳細にこの原則を説明しています。 結論はすべて確率的な性質であることを心に留めておいてください。

単一のポイントの分析が必ずしもあらゆる仮定の基礎として役立つことができないので、最終的な結論には至りません。 しかし、得られた結果は、実験の配置を含む綿密な調査を実行するためにトレーダーを鼓舞することができます。

この記事の冒頭に戻って、ロウソク足チャートとバスケットの通貨インデックスの組み合わせインジケーターを開発しない理由を概説することができます。

  • 1つの通貨ペアは、パターンを調べる補助の性質があります。
  • バスケットのすべての通貨ペアではありません。 ただし、履歴の分析が必要です。


シンプルトレンドインジケーター

結論を確認するため、次の原則に従って簡単な組み合わせのインジケーターを開発してみましょう:

  • 2つの移動平均 (「高速」と「低速」) の差は、ソース・データ・配列に対して計算され、(ここでは EUR バスケットの通貨インデックスの配列です) 示されます。 ご覧の通り、操作は MACD のインジケーターの類似しています。 インジケーターがダイバージェンスを検出することができることを期待しましょう。

インジケータコード (testIndexMACD.zip に含まれています):

//+------------------------------------------------------------------+
//                                               testIndexMACD mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots   1


input color   clr = clrBlue;
input int InpFastEMA = 12;   //速い EMA の期間
input int InpSlowEMA = 26;   //遅い EMA の期間

double ind[],ma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
//nt h, h1;
int()
  {
//---インジケーターバッファマッピング
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);        
   
   IndicatorSetString(INDICATOR_SHORTNAME,"testIndexMACD");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM/*DRAW_LINE*/);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr);
   PlotIndexSetString(0,PLOT_LABEL,"_tstMACD_");    


   ArraySetAsSeries(ma,true);
   SetIndexBuffer(1,ma , INDICATOR_CALCULATIONS);   

//---
   return(INIT_SUCCEEDED);
  }
  
string pair[]={"EURUSD","EURJPY","EURCHF","EURGBP","EURNZD","EURCAD","EURAUD"};
bool bDirect[]={true,true,true,true,true,true,true};
int iCount=7;
  
double GetValue(int shift) 
  {
   double res=1.0,d;
   double dBuf[1];
   for(int i=0; i<iCount; i++) 
     {
      d=CopyClose(pair[i],PERIOD_CURRENT,shift,1,dBuf);
      if(!bDirect[i]) dBuf[0]=1/dBuf[0];
      res*=dBuf[0];
     }//end for (int i = 0; i < iCount; i++)
   return (NormalizeDouble(MathPow (res, 1/(double)iCount), _Digits) );  
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
double t;
intOnCalculate(const int rates_total、
                constint prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated==0 || rates_total>prev_calculated+1) 
     {
      int rt=rates_total;
      for(int i=1; i<rt; i++) 
        {
         ma[i]= GetValue(i);
        }
      rt=rates_total - InpSlowEMA;  
      for(int i=1; i<rt; i++) 
        {
         ind[i] = GetMA(ma, i, InpFastEMA, _Digits) - GetMA(ma, i, InpSlowEMA, _Digits);
        }        
     }
   else 
     {
         ma[0]= GetValue(0);
         ind[0] = GetMA(ma, 0, InpFastEMA, _Digits) - GetMA(ma, 0, InpSlowEMA, _Digits);
     }
//---次の呼出しの prev_calculated の戻り値
   return(rates_total);
  }

//+------------------------------------------------------------------+

double GetMA(const double& arr[], int index , int period, int digit) {
   double m = 0;
   for (int j = 0; j < period; j++)  m += arr[index + j];
   m /= period;
   return (NormalizeDouble(m,digit));
}

チャートにインジケーターを配置すると、結合EUR インデックスを使用するときに、次のように表示されます。


1つのセグメントの分岐を検出します。 価格チャートのレジスタンスは下降トレンドを示していますが、インジケーターの変化ダイナミクスは、トレンドの弱体化や終わりに近づいて警告されます。 さらにトレンドの反転を見ることができます。 他の通貨ペアの価格の動作で結論を確認します:

この特定の状況は、この記事で考えられるパターンが個々のペアに注意して適用されるべきであるという以前の結論を確認します。 同時に、通貨ペアの全体のバスケットにを適用するときに、より多くのパターンを使用することができます。

結論

通貨ペアバスケットトレード時に発生するパターンの分析が完了しました。 すべての記述されたパターンの適用に関する一般的なトレードルールを要約してみましょう。

  • 売られ過ぎ/買わのレベルが結合インジケーターのチャートによってクロスするときに発生するパターンの精度は、ベース通貨と引用通貨の組み合わせオシレーターインジケータ (WPR、ストッホ) の測定値の差で定義します。 ロウソクが閉じた後に相場をエントリーすることができます。売られ過ぎ/買われ過ぎラインのブレイクアウトと新しいトレンドを確認します。 エントリは1つの通貨ペアで実行され、インジケーターが実行されます。 インジケーターがゼロ付近の領域またはインジケーター反対側の境界線に達すると、決済できます。

    後者の場合、ゼロ付近のゾーンに近づくと、オープンオーダーを損益に移動する必要があります。 買いシグナルのダマシに注意してください。 それについてはここで考察しています。 ストップロスは、インジケータに従って配置することもできます。 買わ/売られ過ぎの線が壊れた後、インジケーターがゼロに向かって動かない場合にトリガーされます。 逆に、再び買われ過ぎ/売られ過ぎラインを越え、範囲の境界線の後に移動を開始します。
  • バスケットの通貨状態を表示する複合オシレーターインジケータ (WPR、ストッホ) にも同じパターンが存在します。 下記は EUR の結合された WPR の図表です:

    エントリと決済のルールは同じままですが、エントリは1つではなくすべてのバスケット通貨で実行されます。 ストップロスが可能な点に注意してください。 ここでは、例示の目的でのみ提供されています。 トレーダーは必ずしもそこに損失を修正するものではありません。 ここで、前のパラグラフで使用しているインジケータは、添付の wpr2.zip アーカイブにあります。
  • MAチャートの交点は、上記の2つのものに加えて補助パターンとして関数化することができます. 買われ過ぎ/売られ過ぎラインのブレークスルーの近くに発生した場合、両方のパターンを強化します。
  • 複合トレンドインジケーターを適用する際に形成されるパターンも補助の性質があります。 検出の後で相場に入ることを推薦する理由はまだないが、付加的なシグナルとして最初の2つのパターンと使用することができます。

この段階では、数字と有意義な統計情報で正確なトレードを与えることは不可能です。 ヒストリーの調査不足は記述パターンの重大な欠点でもあります。 今後の記事でその問題に対処します。

この記事で使用されるプログラム:

 # Name
Type
 Description
1 wpr.zip Archive
参照 testWPRusd インジケーター (コードおよび実行可能モジュール) と WPR テクニカルインジケーターコード-wpr.mp5 が含まれています。
2
testIndex+WPR.mq5 Indicator バスケットの通貨インデックス値に WPR 計算式を適用した後に得られた WPR 値をプロットするテスト複合インジケーター。
3
 index.zip    Archive  2つの組み合わせ USD と EUR バスケットの通貨インデックスインジケーター
 4  testIndexMACD.zip   Archive  MACD に基づく簡単なトレンドのインジケーター
5
 wpr2.zip  Archive  相場参入と決済を示すインジケーター