取引通貨バスケットでの利用可能なパターン

3 2月 2017, 08:57
Andrei Novichkov
0
822

イントロダクション

以前の記事では、トレード通貨バスケットに関する原則、アプローチ、用語などを扱いました。もちろん、この複雑なメソッドでは十分ではありません。エントリとイグジット条件としてシグナルを理解することが、重要です。つまり、収益性を高めるには、現在知られているパターンの理解が必要です。この記事の目的は、通貨バスケットを使用するときに形成されるパターンの詳細な解説をすることです。バスケットと以前の記事と同様の技術的なツールの説明と同様に、用語を使います。また通貨バスケットの状態を分析する、ウィリアムズの %R (WPR) インジケータを適用します。

このインジケーターを特徴付けてみましょう。WPR 値は-100 から0%まで変化します。この範囲は、下記の理由で適当ではありません。すべてのパターンを正確に表すには、-100 から 100%の範囲が適当です。この変更には、インジケータ コードにシンプルに考慮できます。インジケーターにおける既存の売られ過ぎ・買われ過ぎのレベルのいずれかに関連すること以外にも、積極的に使用します。


ダイナミックエントリー関数。パターン #1、2

動的エントリとは、インジケーターに現在のロウソクを待たずにエントリシグナルとして使用し、特定の値に達したとき相場に参入することを意味します。まず、通貨バスケットの強化/弱体のパターンを考えてみましょう。相場の観点から、ある特定の通貨を売買する投資家にとって、強制的に上下に1つまたは複数のイベント発生を意味します。たとえば、ECB チーフ ・ マリオ ・ ドラギの会見あります。これは、他の通貨に対してユーロを弱めます。このような場合、WPR の上部または下部の境界線に近づきます。ロウソク足の動的変化を待つことなく、特定の値に達した後、トレーダーは相場に入っても良いでしょう。

  • パターンその 1

このパターンは、多数の標準的なテクニカルインジケーターで頻繁に見ることがあります。 

インジケーターが境界線に触れると、反転し、買われ過ぎラインまたは売られ過ぎラインを突破します。バスケット内のすべての通貨で、この次のトレンドのエントリシグナルとなります。

そのようなエントリは、動的に実行する必要があります。したがって、トレードパターン 1 を使わない方が賢明です。

  • パターンその 2

2番目のパターンは前の修正版です。

インジケーターが境界線に触れ、現在のトレンドから逆行することです。バスケット内のすべての通貨のカウンター トレンド エントリシグナルです。

単一のインジケーターの測定値によると、近い価格の反転を期待するのが正しいでしょう。ただし、WPR はトレンドでは動作しないオシレータであることを覚えておいてください。現在の状況で、再び近づいて境界線におけるインジケーターがハングアップします。一方で、現在のトレンドでは、トレーダーは損失し続けています。もちろん、最終的にボーダーからロールバックして終了しますが、それにはしばらく時間がかかることがあります。ドローダウンは我慢、引き続き、金融の結果は壊滅的な可能性があります誰も保証することができます。

ただし、一部のトレーダーは、インジケーターが 90% または-90 度より小さいパターンを使用します。この理由は、パターン2がトレンドの始まりをとらえることができる顕著な点を持っていることです。明らかに、追加のエントリシグナルが必要です。プライスアクションを使用して、捜すことができます。

その上、新たなニュースによって形成される場合、このパターンを使わないことをお勧めします。パターンには、ヒントがあります。既に形成されたトレンドより信頼性が高いです。

例として、2015年1月半ばでブラック スワン イベント中に CHFの 価格履歴を見てみます。ヒストリーと、CSV ファイル (MS Excel) が付いています。ファイル名は、モニターの開始日付と時刻に対応します。このファイルには、4 つのデータ列があります。

モニター時間 H1 インジケーターの測定値 H4 インジケーターの測定値 D1 インジケーターの測定値
... ... ... ...
12:51:32 99.16 99.17 99.17
12:51:34 98.85 98.87 98.88
... ... ... ...

そこより低い時間枠のデータ変更が、より高い時間枠のものを比較し、インジケーターの測定値に再び近づいていることがわかります。だれでもこのような瞬間に相場をエントリーする人は、クイックストップによる損失が確かにあります。

もちろん、動的エントリは利益をもたらす例を見つけることが可能です。ただし、失敗の確率が大きく、パターン 2は危険すぎます。したがって、これも推薦しません。


足の終値でエントリ。パターンその3

現在の時間枠の足が終値を迎え、買われ過ぎのレベルが下にいったとき、もしくは売られ過ぎのレベルが上に行ったとき、トレーダーは各通貨ペアのエントリーシグナルを受信します。

この相場のエントリーメソッドは、広く知られています。ただし、組み合わせたインジケーターは売られ過ぎ・買われ過ぎのエントリが想定される場合、有効な通貨ペアのバスケットを扱うとき、前回の記事で指定された親のプロパティを継承します。レベルの範囲の境界線付近でインジケーターが逆転するので、エントリはトレンドに従います。#3パターンの主な条件は、現在のロウソクが閉じられた後、トレンドの識別です。

エントリー自体は、標準的な方法で実行されます。トレーダーは相場に従って、リミットオーダーを使います。ただし、2番目のケースでは、エントリはすべての通貨ペアで発生される可能性があります。バスケット全体の買い/売りは、全体的な損失につながる可能性があります。次の例を使用してこの状況を示してみましょう。

すべてのバスケットの通貨ペアが最終的に収益性があるかもしれないことを念頭に置いて相場に参入します。いくつかのペアはトントンになるかもしれませんが、いくつかは損になるかもしれません。EURJPYのグラフが悪いニュースの問題でしばらく弱気だと仮定します。よって、ユーロバスケットの複合 WPR 線は下向きになり、ボーダーに接近を開始します。この瞬間、統計情報がより有利になり、投資家の信頼を回復します。EURJPYの動きがフラットになり、強気の動きが避けられない状況です。複合のWPRと売られ過ぎのラインがクロスします。トレーダーは、シグナルに従い、ユーロ バスケットを買います。いくつかの理由で、EURJPY グラフ フラットが残っても、再び弱気の動きに向かってトレンドになります。

なぜでしょう?これは、ユーロについての良いニュースが円に関する良いニュースに後続するためです。したがって、投資家は円を買う方向になります。したがって、このペアに関するトレーダーの期待は間違っていることがわかります。バスケットにはそもそも他の統計情報なしのペアがあります。それらは利益を出します。しかし、トレーダーがリミットオーダーをEURバスケットの買いに使う場合、この状況は有利ではなくなるかもしれません。さらに、1つのペア (EURJPY) が、全体の損失を生じさせます。

実際の例を考えてみましょう。同じペア EURJPY を使用して、 H1 の testWPR.mq5 テスト インジケーターを起動します。

//+------------------------------------------------------------------+
//|                                                      testWPR.mq5 |
//|                                        MetaQuotes Software Corp. |
//|                                               http://fxstill.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100

#property indicator_buffers 1
#property indicator_plots   1

input int     WPR=14;                    //WRPの期間
input color   clr= clrBlue;

#defineLG 7
string pair[]={"EURUSD","EURJPY","EURCHF","EURGBP","EURNZD","EURCAD","EURAUD"};
int h[LG];

double ind[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
intOnInit()
  {
//---インジケーター バッファー マッピング
   for(int i=0; i<LG; i++)
     {
      h[i]=iWPR(pair[i],0,WPR);
     }
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);

   IndicatorSetString(INDICATOR_SHORTNAME,"testWPR");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,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,"_tstWPR_");

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetValue(int shift)
  {
   double dBuf[1];
   double res=0.0;
   for(int i=0; i<LG; i++)
     {
      CopyBuffer(h[i],0,shift,1,dBuf);
      res+=dBuf[0];
     }//end for (int i = 0; i < iCount; i++)      
   res=res/LG;
   return (NormalizeDouble((res + 50) * 2, _Digits) );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int 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-WPR;
      for(int i=1; i<rt; i++)
        {
         ind[i]= GetValue(i);
        }
     }
   else
     {
     }
//---次の呼び出しの prev_calculated の戻り値
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
  {
   for(int i=0; i<LG; i++)
     {
      if(h[i]!=INVALID_HANDLE) IndicatorRelease(h[i]);
     }
   string text;
   switch(reason)
     {
      case REASON_PROGRAM:
         text="Indicator terminated its operation by calling the ExpertRemove() function";break;
      case REASON_INITFAILED:
         text="This value means that OnInit() handler "+__FILE__+" has returned a nonzero value";break;
      case REASON_CLOSE:
         text="Terminal has been closed"; break;
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
   PrintFormat("%s",text);
  }
//+------------------------------------------------------------------+

結合WPR の範囲は-100 から 100% なので、買われ過ぎの水準は60%になります。(もとは-20%です)したがって、売られ過ぎのレベルは、-80% ではなく-60%になります。。インジケーター チャートにレベルをマークします。

買われ過ぎ/売られ過ぎのレベルがクロスする点を分析する必要があります。この記事の執筆時に、H1 に 3 時間ロウソク足 17.10.2016 のポジションを決済しています。 


その時点で相場に入ると仮定します。決済ポイントを事前に定義してください。インジケーターのアプローチまたはトレードの結果に関係なく、ゼロレベルに触れるときは、ポジションを終了します。この瞬間、同じ日の午前7時になるでしょう。垂直線で両方のポイントをマークしてみましょう。ユーロバスケット内における他の通貨ペアのスクリーンショットは、すでにマークされ、アーカイブにあります。EURNZDはマイナスの結果となり、EURGBPはプラスマイナスゼロ、他の5つはプラスの結果となりました。

ただし、売られ過ぎ、買われ過ぎのレベルが正しいかどうかの疑問があります。前回の記事でストキャスティクスインジケーターのグラフを比較しながら、複合されたストキャスティクスはいくぶんスムーズなこと明らかになりました。標準および結合された WPR を比較するとき、同じことを見てとれます (以下のスクリーン ショット参照)。

結合WPR (太い青線) と (薄い青色の線) の標準 WPR のグラフがあります。

元のものと比較して結合インジケーターの買われ過ぎ/売られ過ぎのレベルの値は変わらないでしょうか。この疑問に答えるため、論拠を見つけるための調査を実施する必要があります。現在の記事の範囲で (主にビジュアル) 大まかな推定を行います。主観的な判断を避けるため、ここでこの主題の個人的な見解を与えるには不適切です。

このパターン (および他) についてもう一つ問があります。決済条件は何でしょう。この質問に関して2つの答えを提供することができます。

  1. 価格操作のルールに従って独立して別の通貨ペアの相場を決済します。既に使い慣れたツールやトレーリング ストップを使用します。しかし、完全に決済していない可能性があるので、最後に得られる利益を上回る損失を引き起こします。もちろん、トレーダーはこれを防ぐ責任があります。
  2. インジケーターの測定値によると、一度にすべてのペアから相場を終了します。たとえば、トレーダーが買われ過ぎのレベルの後にバスケットを買いエントリーし (-60%) 、インジケーターがゼロになったらを売ります (または-10%)。この場合、すべての利益を受けていますが、バスケットが完全に決済しています。

#3のパターン解析の結果を総括してみましょう。

  1. このトレードパターンは適用できます。ロウソク足終了後に定義され、レベルによって識別されます。レベルのクロスをエントリシグナルとします。
  2. このパターンには、厳密に定義されたエントリと決済のルールはありません。しかし、相場のエントリシグナルを定義する、売られ過ぎ、買われ過ぎのレベルは疑いの余地があります。
  3. このパターンは、大きなドローダウンの可能性があります。
  4. 2 番目の通貨の存在は考慮しません。最も重要な欠点は、この長い時間の損失と同様、ドローダウンです。
  5. また、暗黙的にもう一つの欠点があります。以前言及した通り、バスケットの通貨を取り扱うとき、結果がマイナス、ゼロ、プラスになることがあります。バスケットのペアのステータスは、バスケット内でほとんどのペアに肯定的な結果に到達する確率を増やす最も有望な方向を示すので、トレーダーは利益を得ることができます。この段階で、トレード結果に悪影響を与えるスワップ、手数料、その他様々な影響を受けます。

パターンの効率を向上させるドローダウンを軽減し、収益性を高めることができるでしょうか。次のパターンに移ってみましょう。

ある通貨が弱体し、もう一つの通貨が強くなっている瞬間にエントリーします。パターン #4

前のパターンとは異なり、2 つの通貨の価格の形成を考慮します。

たとえば、EURJPY の下 3 つのケースに変位する可能性があります。

  • 最初の通貨が強くなり、ユーロすべての欠点と利点を既に説明したパターンその 3 に関連します。
  • 2番目の通貨が弱くなる — 円。これはまた #3 のパターンに関連しています。
  • ユーロ (eur) を強化し、円が同時に弱体化します。このイベントは、好ましい方向に変位する確率を高めます。複数の通過が同時に強くなったり弱くなったりする確率が増加します。

#4パターンは、3 番目のポイントで説明している状況を定義する相場エントリシグナルを提供します。次のとおりです。

各ペアは 2 つの別のバスケットに属する可能性のある 2 つの通貨から成っています。たとえば、2 つの複合インジケーターに基づいて、EURJPY を分析する可能性があります。したがって、2 つの通貨の強化/弱体化を管理することが可能です。#4 はさらに、同様に、#3 パターンを識別することが可能です。

基本通貨の複合インジケーターの測定値と通貨の差のグラフを分析することによって識別されます。両方の通貨ペアを形成がほぼ等しい場合、相場はフラットです。インベスターズ ・ トラスト ニュースの通貨は、ほとんど中立とシャープな動きがありません。したがって、複合インジケーターは、各通貨と同様の値と間の差は小さくなります。この時点で相場に参入しないのが合理的なようです。

しかし、状況は変更します。ユーロが弱体化しながら。円が強くなります。1回限りの動きよりもむしろトレンドである意味、一定時間続いています。トレーダーは、複合インジケーターの測定値を変更します。ユーロ (eur) の測定値は範囲境界線に近づいている負の領域に徐々に移動しています。円は、反対の動きを見せています。EURJPY のグラフは、売りに傾いています。トレーダーは、ユーロの複合インジケーターと円の違いのグラフを調べます。その最小値-200 を目指して移動しています。

反対の場合、最大値は 200% です。なぜ -100から 100%にするようにしたかは、この記事の冒頭で言及しています。複合インジケーターと 1 つのウィンドウで、差のグラフを配置できます。2つの複合インジケーターの差を 100% に分割する必要があります。

したがって、トレーダーは複合インジケーターの測定値の差が特定の値に達したときに、エントリシグナルを受け取ります。具体的には、差のグラフの境界に近づき、買われ過ぎラインを分割するまで待機します。ロウソク足の終了のタイミングで発生すると想定します。つまり、この戦略は、#3 のパターンの 1 つに似ています。

  • ペア内で各通貨の状態を定義する 2 つの複合インジケーターは、潜在的な収益性の向上、トレードを決定します。
  • 相場参入は、(すべて) のバスケット内の 1 つのペアで実行されます。したがって、ドローダウンを減らすために管理します。

実際にパターン #4 を使用して見てみましょう。これを行うには、 円のバスケットのもう一つのインジケーターを作成してください。testWPR と同じメソッドを開発します。前回の記事から得られる、円バスケット通貨ペアのリストです。コードはtestWPR に似ていますが、ここで表示しても意味はありません。インジケーターのコンパイル済みコードは、この記事に添付されています。インジケーターの色を赤に変更し、EURJPYでtestWPRを既に同じウィンドウに配置する必要があります。結果は以下のとおりです。 

ポイントは、縦のラインによって記録されます。このように価格チャートとインジケーター (最強の通貨と最弱の通貨の距離) の差の相関関係を見ることができます。

しかし、このような差を追跡することは困難です。もう一つテスト インジケーター testDistance.mq5 を書いてみましょう。

//+------------------------------------------------------------------+
//|                                                 testDistance.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100

#property indicator_buffers 1
#property indicator_plots   1

input int WPR = 14;//WPRの期間
input color   clr= clrGreen;

double ind[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int h,h1;
int OnInit()
  {
//---インジケーター バッファー マッピング
      h = iCustom(NULL,0,"testWPR",WPR);
      if (h == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }
      h1 = iCustom(NULL,0,"testWPRjpy",WPR);
      if (h1 == INVALID_HANDLE) {
         Print("Error while creating testWPRjpy");
         return (INIT_FAILED);
      }  
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);        
  
   IndicatorSetString(INDICATOR_SHORTNAME,"testWPRdistance");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,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,"_tstWPRdistance_");    
//---
   return(INIT_SUCCEEDED);
  }
  
double GetValue(int shift)
  {
   double dBuf[1], dBuf1[1];
   double res=0.0;
   CopyBuffer(h,0,shift,1,dBuf);
   CopyBuffer(h1,0,shift,1,dBuf1);
   return (NormalizeDouble((dBuf[0] - dBuf1[0])/2, _Digits) );
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int 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-WPR;
      for(int i=1; i<rt; i++)
        {
         ind[i]= GetValue(i);
        }
     }
   else
     {
     }
//---次の呼び出しの prev_calculated の戻り値
   return(rates_total);
  }
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   IndicatorRelease(h1);

  }
//+------------------------------------------------------------------+

EURJPY で別のウィンドウに配置して以前にマークされた領域を調べます。


ユーロ (eur) の 2 つの複合WPR と円の差は、緑の線として表示されます。強い通貨と弱い通貨の差は興味深いでしょう。ここで買われ過ぎ/売られ過ぎの領域についてだけでなく、領域をクロスしているロウソクに #4 パターンの識別についても言及することができます。この場合、トレーダー が(11:00) で 10 月 21 日に相場に参入していた場合、(11 月 1 日) のトレンドの開始をとらえることができます。 

したがって、実装段階で #4 パターンは一般的なオーダーではなく、パターン #3 の場合のようなオーダーのバスケットに似ています。したがって、ドローダウンの大幅な削減が期待できます。収益性の高いトレードの上昇も期待できるパターン #4 利益確率が高くなります。注意してトレーリング ストップを適用し、通常の方法を使うことができるので、その他のツールを使用してください。

#4 パターンは、パターンその 3 とともにフィルターとしても適用できます。#4 パターンに基づいてフィルターがいくつかを整理することができ、相場参入を #3 のパターンに従ってバスケットのすべてのペアに対して実行できます。したがって、総収益をアプローチすることが可能です。しかし、これは単に理論上の話です。実際のトレードでパターンの組み合わせをテストしていません。

#4 パターンが嘘のシグナルを出すときの状況を考えてみましょう。境界線と逆転に向けた複合インジケーターの動きが発生したとき、かなり明確な状況です。バスケットは複数のペアを含み、複合インジケーターが平均値を示し、それらを理解する必要があります。ローカルイベントは、トレーダーが相場に参入するのに悪影響を及ぼします。#3パターンを記述するとき、すでにを言及しています。#4 パターンの確率が非常に低いのもまた事実です。

#4 パターンにデータをまとめてみましょう。

Advantages:

  1. 収益性が増加します。
  2. 低いドローダウン。
  3. 利益が短時間で実現しそうです。おそらく、別の利点が、補完ではありません。 
  4. トレーダーがオーダーのバスケットに対処する必要はありません。代わりに 1 つのオーダーをトレードしてください。したがって、トレードの追跡は簡単です。 

Drawbacks:

  1. #4 パターンを識別するための条件は一般的ではありません。
  2. 1つのオーダーによる有益なので。合計の利益は小さいです。 

#4パターンの欠点の影響を減らしてみましょう。このために、1つの通貨が弱く深刻なときにトレードの数を増やす方法があるかどうかを定義します。おそらく、買われ過ぎ/売られ過ぎのレベルの進歩に加えて、相場をエントリーする別の方法があります。

移動平均を使ったエントリーパターンその 5

移動平均は、相場分析に重宝される方法です。多くのインジケーターや計算で使用します。買われ過ぎ/売られ過ぎのレベルがWPR で動作すると仮定します。2つの結合WPR の差の場合も同じです。したがって、同様にインジケーターのグラフに移動平均を追加します。

3番目と4番目のパターングラフに追加できます。移動平均の考えを記述するポイントは特に必要ないと思います。その利点と欠点 (その遅れの性質を含む) もよく知られています。#5 パターンを見つけるために、移動平均のグラフを分析することができます。

インジケーターのグラフは、移動平均を超えたときエントリシグナルを受信します。このイベントは、現在のロウソク足が閉じられたときに起きます。

そのようなクロスはかなり頻繁にあり、したがってトレード数が増加します。4番目のパターン検出グラフにあるMAを分析しましょう。3パターンの検出の1つのMAのアプリケーションを分析しても良いです。

MAの適用を別パターンとしても良いでしょうか?#4パターンの追加のフィルターだけではないでしょうか?いいえ、別のパターンです。ときどき、買われ過ぎ/売られ過ぎのレベルは、MAとほぼ同時に壊れています。この場合、4と5のパターンは互いに補間します。他のケースで、#4パターンは独立したパターンです。

とにかく、ルールを紹介しましょう。

  • #5パターンが#4パターンの前にある場合、トレードされません。
  • 他のケースでは、#4 #5 パターンの前後は関係ありません。

2番目のルールはより徹底的に調べる必要があります。#5パターンでの状況を分析するために、新しいインジケーター (この記事の最後) を作成する必要があります。

//+------------------------------------------------------------------+
//|                                                 testDistance.mq5 |
//|                                   2016 MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100

#property indicator_buffers 2
#property indicator_plots   2

input int WPR       = 14; //WPR期間
input int maperiod  = 10; //MA期間
input color   clr   = clrGreen;
input color   clrMA = clrMagenta;


double ind[],ma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int h,h1;
int OnInit()
  {
//---インジケーター バッファー マッピング
      h = iCustom(NULL,0,"testWPR",WPR);
      if (h == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }
      h1 = iCustom(NULL,0,"testWPRjpy",WPR);
      if (h1 == INVALID_HANDLE) {
         Print("Error while creating testWPRjpy");
         return (INIT_FAILED);
      }  
   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);        
  
   IndicatorSetString(INDICATOR_SHORTNAME,"testWPRdistance");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,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,"_tstWPRdistance_");    
  
   ArraySetAsSeries(ma,true);  
   SetIndexBuffer(1,ma);
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE           );
   PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_SOLID            );
   PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 1            );
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrMA            );
   PlotIndexSetString (1, PLOT_LABEL, "Middle_Basket_line_MA" );    
//---
   return(INIT_SUCCEEDED);
  }
  
double GetValue(int shift)
  {
   double dBuf[1], dBuf1[1];
   double res=0.0;
   CopyBuffer(h,0,shift,1,dBuf);
   CopyBuffer(h1,0,shift,1,dBuf1);
   return (NormalizeDouble((dBuf[0] - dBuf1[0])/2, _Digits) );
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int 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-WPR;//-maperiod;
  
      for(int i=1; i<rt; i++)
        {
         ind[i]= GetValue(i);
        }
      rt -= maperiod;  
      for (int i = 1; i< rt; i++)
        {
         ma[i] = GetMA(ind, i, maperiod, _Digits);
        }
     }
   else
     {
     }
//---次の呼び出しの prev_calculated の戻り値
   return(rates_total);
  }
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   IndicatorRelease(h1);
   string text;
   switch(reason)
     {
      case REASON_PROGRAM:
         text="Indicator terminated its operation by calling the ExpertRemove() function";break;
      case REASON_INITFAILED:
         text="This value means that OnInit() handler "+__FILE__+" has returned a nonzero value";break;
      case REASON_CLOSE:
         text="Terminal has been closed"; break;
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
   PrintFormat("%s",text);
  }
//+------------------------------------------------------------------+

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));
}

同じシンボルのインジケーターを配置してみましょう。結果は下記の通りです。


ここでは、移動平均は、深紅色の細い線として示されます。#5パターンを含むものとして識別できるセグメントは、縦線で示されます。青い線は買いシグナル、赤い線は売りシグナルです。MAを越えるポイントがマークされていない差を見ることができます。この以前に導入されたルールを説明しましょう。

インジケーター全体の範囲を分割し、#5パターンの最終的なルールを設定する必要があります。

  • MA/インジケーターグラフが、売られ過ぎ・買われ過ぎの領域の時点で発生した場合は、シグナルは無視されます。これらのポイントは、ゾーン #0 (ゼロのゾーン) です。スクリーン ショットを参照)
  • すでに述べたように、同時に互いを補強する #4 と 5 のパターンが発生します。#4と#5 のパターンを識別し、相場に参入する場合、#4パターンを使用して、決済するまで続くパターン#5を無視してください。
  • 長い時間かけて、弱い通貨が強くなり、強い通貨が弱くなる可能性があります。いずれの場合も、インジケーターグラフは買われ過ぎ/売られ過ぎのレベルから離れて移動を始めます。このグラフは、それぞれの通貨の強さと一致しません。したがって、現在のトレンドが転換する可能性がありますが、サイクルが繰り返されます。これが決済シグナルです。両方の通貨の力がほぼ等しくなったとき、逆転の確率が高いので危険です。これを#3ゼロのゾーンと呼びましょう。-10%と10%の間が好ましいですが、自分でその境界を定義することができます。#5のすべてのパターンは以前開かれたトレードが (少なくとも部分的に) 決済される間、無視されるか、損益分岐点に移動します。
  • #5 パターンを使用する場合、2つのゾーンがトレードに適しています。
    • ゾーン1を買い。最後のスクリーンショット上の青い垂直線として表示されます。#5パターンに近ければ近いほど、利益をもたらす確率が高まります。
    • ゾーン 2 を売り。最適なトレードは、最後のスクリーン ショットの赤い垂直線として表示されます。パターン2に近ければ近いほど、収益性が高くなります。

    重要な原則: 買いパターンが #5 ゾーン内に形成されますが無視します。売りパターンが#5 ゾーン 内に形成されますが、これも同様に無視します。

#5パターンは、#4 と同じ問題があります。

  • トレーダーが相場に参入するために、使用する際に起こるかもしれません。言い換えれば、 リスクを最小限に抑えるためのすべての方法と危険性が残ります。

一般事項

すべてのパターンに共通する点があります。 買われ過ぎ/売られ過ぎのレベルの突破は現在のタイム フレームのロウソク足が閉じられた後に発生したと見なされます。買われ過ぎのレベルを修正することにします。レベルは複合WPR ウィンドウの 60% です。グラフでは、61.5% に上昇しますが、ロウソクの終値で59% に落ちます。このブレイクを考慮すべきでしょうか。テクニカル的には、条件を満たしています。しかし、このパターンにはトレード価値があるでしょうか?

頻繁に発生する別の状況: 大きなロウソク足が形成され、ロウソク足の終わりのタイミングでインジケーターの値はゼロのレベルまたは範囲の反対側の縁の近くになる場合があります。やはり、テクニカル的に合っていますが、価値があるトレードパターンとは言えないでしょうか。

唯一はっきり目に見えるパターンをトレードすべきだと思います。サポート/レジスタンスを出力するときに適用されるルールに似ています: ラインは、明確かつ明白である必要があります。前のケースといえば、買われ過ぎのレベルは、45-55% から 70% のレベルにまで減少した場合、発生していると考慮されます。その上、ゼロゾーンへの移動する可能性があります。

インジケーターのグラフをクロスするMA の場合も同じです。このようなもまれに、「美しい」と言えるかもしれません。他の方向にMAが移動する場合、このパターンをスキップすることを検討してください。

つまり、不確実なパターンをリスクの高いものとして考え、スキップする必要があります。とにかく、これは著者の個人的な意見です。したがって、公理ではありません。


結論

オシレータに基づく複合インジケーターを組み合わせ、WPRの例を使用してました。通貨ペアのバスケットをトレードに適用することができる他のツールがあるかもしれませんが、これは買われ過ぎ/売られ過ぎのレベルを明確に提供してくれます。

MetaQuotes Software Corp.によりロシア語から翻訳された
元の記事: https://www.mql5.com/ru/articles/2816

添付されたファイル |
monitor.zip (855.82 KB)
pattern3.zip (137.12 KB)
testWPR.zip (15.36 KB)
testWPRjpy.ex5 (14.86 KB)
testDistance.zip (13.37 KB)
testDistanceMA.zip (16.56 KB)
インジケータのバッファや配列を使わずにヒストグラムを形成する統計分布 インジケータのバッファや配列を使わずにヒストグラムを形成する統計分布

この記事では、グラフィックメモリの助けを借りて、相場の統計的分布ヒストグラムをプロットする可能性について説明します。サンプルのヒストグラムと mql5のグラフィカルオブジェクトの「非表示」関数があります。

GUIによる汎用的なオシレーター GUIによる汎用的なオシレーター

この記事では、独自のグラフィカルインターフェイスを使用して、よくあるオシレーターに基づく汎用的なインジケータの作成プロセスについて説明します。GUIは、ユーザーが迅速かつ容易に、グラフ ・ ウィンドウから (開くことがなくそのプロパティ)、各オシレーターの設定を直接変更するとでき、特定のタスクに最適なオプションを選択することができます。

グラフィカルインタフェースX: Timeコントロール、チェックボックスコントロールのリストとテーブルのソート(ビルド6) グラフィカルインタフェースX: Timeコントロール、チェックボックスコントロールのリストとテーブルのソート(ビルド6)

グラフィカルインタフェースを作成するためのライブラリの開発が続きます。今回は、チェックボックスコントロールのリストとTimeが対象となります。さらに、CTableクラスではデータを昇順または降順に並べ替えることができるようになりました。

モスクワ為替先物のスプレッド戦略の開発例 モスクワ為替先物のスプレッド戦略の開発例

MT5 プラットフォームでは、同時に複数の金融商品のトレードロボットをテストすることができます。組み込みのストラテジーテスターは、自動的にヒストリーデータをブローカーのサーバーからダウンロードします。そのため、開発者は特別手動で何かをする必要はありません。シンプルかつ確実に異なるシンボルのミリ秒単位のティックによるトレード環境を再現することが可能です。この記事では、2つのモスクワ為替先物においてスプレッドストラテジーをテストと開発を行います。