English Русский 中文 Español Deutsch Português
インジケータのバッファや配列を使わずにヒストグラムを形成する統計分布

インジケータのバッファや配列を使わずにヒストグラムを形成する統計分布

MetaTrader 5 | 1 2月 2017, 09:33
2 508 0
Sergey Pavlov
Sergey Pavlov

イントロダクション

ヒストグラムを使うと、統計データを可視化して評価することができます。

ヒストグラムおよび統計データ解析は、よく研究されています。 [1234567] コードベース例 [12345678910」。ただし、適用アルゴリズムは、インジケータ バッファまたは配列に基づいています。この記事で、複雑な計算を使用しない、相場特性の統計的な分布を構築の可能性を検討します。「グラフィカル」メモリを使用します。グラフィカルオブジェクトのプロパティを格納するセクションです。カスタム ヒストグラムをプロットするとき、グラフィカルオブジェクトが必要なので、最大限に豊富な関数を使用できます。

この記事の目的は、標準的な統計的問題に、シンプルなソリューションを提供することです。統計分布とその基本的な特性の可視化について説明します。ヒストグラムの解釈とその実用的なメリットにこだわるつもりはありません。

ヒストグラム プロットの基本

ヒストグラムとは連続的な棒グラフです。軸の 1 つは、別の変数の値を表します。各バーの高さは、値の周波数 (数) を示しています。このような図は通常う水平方向に表示されます。すなわち、変数の値は横軸にあります。研究データを表すヒストグラムを使用すると、見やすい統計データになります。

この記事では垂直方向のヒストグラムに注力します。つまり、 価格分析のパラメータの値が昇順、横軸 (図1) 上に配置する周波数を垂直軸上に配置します。価格データは、グループ化し、表示される軸に左、右または両側から同時にできます。

図1。ビットとアスクの価格の垂直ヒストグラム 

図1。ビットとアスクの価格の垂直ヒストグラム

特定のタスクを考えてみましょう。

  • ビットとアスクをプロット 
  • アスクデータを右側に、ビッドを左に配置します。
  • 新しいティックが来た時に、価格頻度を計算します。つまり、ヒストグラムの間隔は現在のシンボルポイントサイズと等しくなります。

複雑な条件を作りましょう。ただし、インジケータ バッファ、配列や構造体は使えません。

この問題を解決するにはどうすればよいでしょう? 

まず、ヒストグラムの各列の累積頻度を保存する場所を設定します。図1で、不特定多数のヒストグラム バーの可能性があることがわかります。最初に思いつくことは、価格グラフの選択した時間間隔で可能な価格帯 (バーの数) が事前に知られていないので、動的配列を使用することです。しかし、条件によって配列は使用できません。

第2に、検索と並べ替えタスクを解決すべきでしょう。どこにどうやって、ヒストグラムのデータを検索するメソッド再計算および再描画するかです。

結局のところ、mql5開発者が必要で、すでに関数を作成しています。グラフィカルオブジェクトの関数グループの「非表示」(不鮮明) 関数に基づいています。各オブジェクトには、プロパティ変数、オブジェクトと共に作成され、様々な複数のパラメータを格納するために使用します。プロパティは、関数をそのままに保ちながら指定された目的に使用できます。「グラフィカル」メモリプロパティと呼びましょう。つまり、変数を保存し、受信する必要がある場合、グラフィカルオブジェクトを作成する特定のプロパティに変数の値を割り当てます。

したがって、グラフィカルオブジェクトのプロパティは、ターミナルのグローバル変数より効率的な一種の関数です。グローバル変数は、最後のアクセスから 4 週間ターミナル クライアントに存在し、後に自動的に削除されます。グラフィックメモリは、グラフィカルオブジェクトを削除されるまで十分存在します。 

グラフィックメモリ内のグラフィカルオブジェクト プロパティは利用できます。

グラフィカルオブジェクトを作成するときに、一意の名前を割り当てる必要があります。この名前は文字列の部分文字列で構成される書式設定の基本データ型間です。( 整数、ブール型、浮動小数点数、色、日付と時刻。)したがって、 OBJPROP_NAMEは、主にデータを読み取るための変数を格納できます。

使用できる別のプロパティは、 OBJPROP_TEXTオブジェクトの説明です。また、前のプロパティと比較すると、はるかに大きな可能性を持つ文字列です。変数の読み書き両方のプロパティ フィールドに同伴します。

すべてのグラフィカルオブジェクトには独自の座標があります。 OBJPROP_PRICEOBJPROP_TIME。グラフィックメモリに使用できます。

それでは目的に戻りましょう。周波数がOBJPROP_TEXT に格納されるプロパティ、OBJPROP_NAMEで、オブジェクトを作成し、周波数のコードを以下に示します:

void DrawHistogram(bool draw,     //左または右にヒストグラムを描く
                   string h_name, //オブジェクト名のユニークなプレフィックス
                   double price,  //価格 (解析パラメータ)
                   datetime time, //現在のバーにヒストグラムをバインド
                   int span,      //分析パラメータ桁容量
                   int swin=0)    //ヒストグラム ウィンドウ
  {
   double y=NormalizeDouble(price,span);
   string pfx=DoubleToString(y,span);
//draw = true の場合、右にヒストグラムを描画
   if(draw)
     {
      string name="+ "+h_name+pfx;                   //オブジェクト名: プレフィックス + 価格
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);    //オブジェクトを作成する
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_R_active); //オブジェクトの色を設定する
      ObjSet;                                                //マクロを短縮コード
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {//結果の価格が初めてサンプルをエントリーしたかどうか
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");          //価格 freuqency は 1
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize); //時間座標の定義
        }
      else
        {//その結果がない初めてのサンプルかどうか
         string str=ObjectGetString(0,name,OBJPROP_TEXT);    //プロパティ値を取得する
         string strint=StringSubstr(str,1);                  //部分文字列を強調表示
         long n=StringToInteger(strint);                     //さらに計算の周波数を得る
         n++;                                                //値を 1 増加させて
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n); //プロパティに新しい値を書き込む
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize*n);//時間座標の定義
        }
     }
//draw = falseの場合、ヒストグラムを左側に書く
   if(!draw)
     {
      string name="- "+h_name+pfx;
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_L_active);
      ObjSet;
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize);
        }
      else
        {
         string str=ObjectGetString(0,name,OBJPROP_TEXT);
         string strint=StringSubstr(str,1);
         long n=StringToInteger(strint);
         n++;
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n);
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize*n);
        }
     }
   ChartRedraw();
  }

ビットとアスクは2つの類似した部分で構成されています。したがって、コメント、最初のブロックのみに存在します。

とにかくOBJPROP_PRICEプロパティで使用可能な場合は、オブジェクト名で価格を 2 倍以上にする目的は何でしょう。

少し掘り下げましょう。新しい価格が到着すると、適切な列を定義し、周波数値も増えます。そのネイティブ プロパティから価格座標を用いて、すべてのグラフィカルオブジェクトを通過するプロパティ値を、リクエストおよび受信の価格と比較するでしょう。このあと、適切な列に新しい値を書き込むことになります。しかし、実際double型の比較-は骨の折れる仕事です。エレガントな解決法は、新しい価格の値が到着した後、必要な送り先に直接新しい周波数を書くことです。どうすればよいでしょう。既存のオブジェクトの1つの名前で、新しいグラフィカルオブジェクトを作成し、新しいオブジェクトは作成されず、プロパティ フィールドが 0 に設定されていません。言い換えれば、 doubleになるだろうという事実を無視してオブジェクトを作成します。コピーは存在しないので、余分なチェックの必要はなく、クローンが作成されます。ターミナルおよびグラフィカルオブジェクト関数がその役割をします。価格が初めてものかどうかを定義しなければなりません。これを行うには、 DrawHistogram()関数のOBJPROP_TEXTオブジェクト プロパティにアスタリスク (*) のプレフィックスを使用します。アスタリスクがないということは、初めての価格であるということを意味します。確かに、新しいオブジェクトを作成すると、フィールドは空です。指定されたプレフィックスを持つ周波数の値は、後続の呼び出しの間にそこに格納されます。

次に、ヒストグラムを右にシフトしましょう。新しいバーが表示されたら、グラフは現在のバーに表示するヒストグラムが必要で、左にシフトします。言い換えれば、反対方向にシフトする必要があります。これにより達成することができます。

//---新しいバーに図を移動します。
   if(time[0]>prevTimeBar) //新しい到着バーを定義
     {
      prevTimeBar=time[0];
      //すべてのグラフィカルオブジェクトをクリア。
      for(int obj=ObjectsTotal(0,-1,-1)-1;obj>=0;obj--)
        {
         string obj_name=ObjectName(0,obj,-1,-1);               //見つかったオブジェクトの名前を取得
         if(obj_name[0]==R)                                     //ヒストグラム要素プレフィックス検索
           {                                                    //ヒストグラムの要素が見つかった場合
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,           //新しい座標値を設定
                             0,time[0]);                        //「0」アンカー ポイント
            string str=ObjectGetString(0,obj_name,OBJPROP_TEXT);//オブジェクトのプロパティから変数を読み取り
            string strint=StringSubstr(str,1);                  //受信した変数の部分文字列の区別
            long n=StringToInteger(strint);                     //長い変数に文字列変換
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,           //新しい座標値を計算
                             1,time[0]+hsize*n);                //「1」アンカー ポイント
            ObjectSetInteger(0,obj_name,OBJPROP_COLOR,
                             color_R_passive);                  //シフト ヒストグラムの要素の色を変更する
           }
         if(obj_name[0]==L)
           {
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,0,time[0]);
            string str=ObjectGetString(0,obj_name,OBJPROP_TEXT);
            string strint=StringSubstr(str,1);
            long n=StringToInteger(strint);
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,1,time[0]-hsize*n);
            ObjectSetInteger(0,obj_name,OBJPROP_COLOR,color_L_passive);
           }
        }
      ChartRedraw();
     }

これで完了です。BidとAskのヒストグラムは、単一の配列やインジケータ バッファは使用していませんが、グラフにプロットされます。完全なコードは、以下に添付されています。


このビデオには、既製のグラフィックメモリの使用と同様の問題のソリューションが収録されています。コード自体は、コードベースで見つけることができます。(ロシア語) 「ヒストグラムのBidとAsk」インジケータ。

メイン ウィンドウのヒストグラムをプロット

グラフィックメモリを使用する関数のプログラミングを検討し、標準的なインジケータのヒストグラムをプロットみましょう。プロットの原則の一つと考えが似ています。ただし、現在のバーのインジケータ値はBidの代わりにAskを使用します。

     1. iMAインジケータ。異なる平均期間を持つ 2 つのインジケータを使用して、ヒストグラムを作成してみましょう。以下コードです。

input int               period_MA1=20;       //MA1 の平均期間
input int               period_MA2=14;       //MA2 の平均期間
//---インジケータ バッファ
double      MA1[];
double      MA2[];
//---インジケータのハンドル
int         iMA1_handle;
int         iMA2_handle;
//+------------------------------------------------------------------+
//カスタム インジケータ初期化関数 |
//+------------------------------------------------------------------+
intOnInit()
  {
   ObjectsDeleteAll(0,-1,-1);
   ChartRedraw();
   iMA1_handle=iMA(_Symbol,_Period,period_MA1,0,MODE_SMA,PRICE_CLOSE);
   iMA2_handle=iMA(_Symbol,_Period,period_MA2,0,MODE_SMA,PRICE_CLOSE);
   ArraySetAsSeries(MA1,true);
   ArraySetAsSeries(MA2,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//カスタム インジケータ反復関数 |
//+------------------------------------------------------------------+
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[],
                constint &spread[])
  {
   ArraySetAsSeries(time,true);
   
   CopyBuffer(iMA1_handle,0,0,1,MA1);
   CopyBuffer(iMA2_handle,0,0,1,MA2);

   DrawHistogram(true,"iMA("+(string)period_MA1+")=",MA1[0],time[0],_Digits);
   DrawHistogram(false,"iMA("+(string)period_MA2+")=",MA2[0],time[0],_Digits);

//---新しいバーに図を移動します。
   if(time[0]>prevTimeBar) //新しい到着バーを定義
     {
      prevTimeBar=time[0];
      //すべてのグラフィカルオブジェクトをクリア。
      for(int obj=ObjectsTotal(0,-1,-1)-1;obj>=0;obj--)
        {
         string obj_name=ObjectName(0,obj,-1,-1);               //見つかったオブジェクトの名前を取得
         if(obj_name[0]==R)                                     //ヒストグラム要素プレフィックス検索
           {                                                    //ヒストグラムの要素が見つかった場合
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,           //新しい座標値を設定
                             0,time[0]);                        //「0」アンカー ポイント
            string str=ObjectGetString(0,obj_name,OBJPROP_TEXT);//オブジェクトのプロパティから変数を読み取り
            string strint=StringSubstr(str,1);                  //受信した変数の部分文字列の区別
            long n=StringToInteger(strint);                     //長い変数に文字列変換
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,           //新しい座標値を計算
                             1,time[0]+hsize*n);                //「1」アンカー ポイント
            ObjectSetInteger(0,obj_name,OBJPROP_COLOR,
                             color_R_passive);                  //シフト ヒストグラムの要素の色を変更する
           }
         if(obj_name[0]==L)
           {
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,0,time[0]);
            string str=ObjectGetString(0,obj_name,OBJPROP_TEXT);
            string strint=StringSubstr(str,1);
            long n=StringToInteger(strint);
            ObjectSetInteger(0,obj_name,OBJPROP_TIME,1,time[0]-hsize*n);
            ObjectSetInteger(0,obj_name,OBJPROP_COLOR,color_L_passive);
           }
        }
      ChartRedraw();
     }
   return(rates_total);
  }

図2。2 つの iMA インジケータのヒストグラム

図2。2 つの iMA インジケータのヒストグラム 

     2. iBandsインジケータ。インジケータの上部 (UPPER_BAND)、(LOWER_BAND) と下部のヒストグラムをプロットしましょう。縮約版のコードです。

input int   period_Bands=14;           //Bands の平均期間
//---インジケータ バッファ
double      UPPER[];
double      LOWER[];
//---インジケータのハンドル
int         iBands_handle;
//+------------------------------------------------------------------+
//カスタム インジケータ初期化関数 |
//+------------------------------------------------------------------+
intOnInit()
  {
   ObjectsDeleteAll(0,-1,-1);
   ChartRedraw();
   iBands_handle=iBands(_Symbol,_Period,period_Bands,0,5.00,PRICE_CLOSE);
   ArraySetAsSeries(UPPER,true);
   ArraySetAsSeries(LOWER,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//カスタム インジケータ反復関数 |
//+------------------------------------------------------------------+
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[],
                constint &spread[])
  {
//---
   ArraySetAsSeries(time,true);
   
   CopyBuffer(iBands_handle,1,0,1,UPPER);
   CopyBuffer(iBands_handle,2,0,1,LOWER);

   DrawHistogram(true,"iBands(UPPER)=",UPPER[0],time[0],_Digits);
   DrawHistogram(false,"iBands(LOWER)=",LOWER[0],time[0],_Digits);

//---新しいバーに図を移動します。
   if(time[0]>prevTimeBar)
     {
     ...
     }
   return(rates_total);
  }

図3。Bands インジケータのボリンジャー バンドのヒストグラム

図3。Bands インジケータのボリンジャー バンドのヒストグラム 

すべての 3 つのインジケータバッファ (0 - BASE_LINE、1 - UPPER_BAND、2 - LOWER_BAND) を使用する場合、 非常に興味深いヒストグラムを得ることができます。現在のバーでは、本線のヒストグラムの右側に上下のバンドのヒストグラムを配置します。結果は、下の画像のとおりです。

図4。3 つのインジケータバッファを使用したボリンジャー バンドのヒストグラム

図4。3 つのインジケータバッファを使用したボリンジャー バンドのヒストグラム  

このヒストグラムのコードを以下に示します。インジケータの上部と下部のラインの 2 つのヒストグラムが実際に表示されることに注意してください。視覚的に単一の図表として認識されます。

input int   period_Bands=20;       //Bands の平均期間
//---インジケータ バッファ
double      BASE[];
double      UPPER[];
double      LOWER[];
//---インジケータのハンドル
int         iBands_handle;
//+------------------------------------------------------------------+
//カスタム インジケータ初期化関数 |
//+------------------------------------------------------------------+
intOnInit()
  {
   ObjectsDeleteAll(0,-1,-1);
   ChartRedraw();
   iBands_handle=iBands(_Symbol,_Period,period_Bands,0,10.00,PRICE_CLOSE);
   ArraySetAsSeries(BASE,true);
   ArraySetAsSeries(UPPER,true);
   ArraySetAsSeries(LOWER,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//カスタム インジケータ反復関数 |
//+------------------------------------------------------------------+
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[],
                constint &spread[])
  {
//---
   ArraySetAsSeries(time,true);
   
   CopyBuffer(iBands_handle,0,0,1,BASE);
   CopyBuffer(iBands_handle,1,0,1,UPPER);
   CopyBuffer(iBands_handle,2,0,1,LOWER);

   DrawHistogram(true,"iBands(UPPER)=",UPPER[0],time[0],_Digits);
   DrawHistogram(true,"iBands(LOWER)=",LOWER[0],time[0],_Digits);
   DrawHistogram(false,"iBands(LOWER)=",BASE[0],time[0],_Digits);

//---新しいバーに図を移動します。
   if(time[0]>prevTimeBar)
     {
     ...
     }
   return(rates_total);
  }

これまでのところ、分析値 (バリアント) の範囲が現在のシンボルのポイント (_Point) サイズと同等なバリエーション シリーズを行いました。つまり、価格のすべての値は、別のヒストグラムの列として描かれていました。

適切に強調表示され、シームレスにシリーズが並び替えられたターミナルの組み込み関数を使用しました (ランク)。1行もそのために書かれていません。

単一の変数とグラフィカルオブジェクトの力を使用して、複数のバリアント値を持つ分布範囲を変更してみましょう。DrawHistogram()関数は上記の関数にまたがるインプット — パラメータの 10の能力を分析しました。10進数の容量を変化させることにより、ヒストグラム周波数を計算する間隔を変更することができます。グラフィカルオブジェクト名に含まれているので、作成するおよびオブジェクトのプロパティを調整するときに自動的に実行されます。グラフィックメモリを使用して、プログラミングなしでシンプルに解決を並べ替えると、タスクをグループ化が、どのようになるか参照してください。

図5。増加列間隔のBidとAskのヒストグラム

図5。増加列間隔のBidとAskのヒストグラム 

したがって、 シンプルにメインのウィンドウのヒストグラムをプロットできます。他のチャートウィンドウで類似の図をプロットする様子を見てみましょう。

追加ウィンドウのヒストグラム

統計分布を作成する追加ウィンドウは、メインウィンドウと同様です。違いは、分析対象の変数の値が負になることです。その上、任意の桁容量があるかもしれない。メイン ウィンドウの価格のスケール_Digits変数を使用して得ることができる定義済みの桁能力があります。他のウィンドウでは、正と負の両方があります。また、小数点以下の数は無制限です。ヒストグラムを作成するためのDrawHistogram()関数のエントリーパラメータを設定するとき、考慮する必要があります。また、追加ウィンドウのインデックスの設定を確認します。メイン ウィンドウは、既定では、関数で使用されます。

追加のウィンドウ のヒストグラムの例

情報を消化する最良の方法は、サンプルを使用することです。別のウィンドウでヒストグラムの例を考えてみましょう。

     1. iChaikinインジケータ。

図6。チャイキン オシレーター ヒストグラム

図6。チャイキン オシレーター ヒストグラム

このインジケータの縮約版のコードは次のとおりです。

input int   period_fast=3;       //Chaikin の平均短期期間
input int   period_slow=10;      //Chaikin の長期期間
//---インジケータ バッファ
double      CHO[];
//---インジケータのハンドル
int         iChaikin_handle;
//+------------------------------------------------------------------+
//カスタム インジケータ初期化関数 |
//+------------------------------------------------------------------+
intOnInit()
  {
   ObjectsDeleteAll(0,-1,-1);
   ChartRedraw();
   iChaikin_handle=iChaikin(_Symbol,_Period,period_fast,period_slow,MODE_SMA,VOLUME_TICK);
   ArraySetAsSeries(CHO,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//カスタム インジケータ反復関数 |
//+------------------------------------------------------------------+
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[],
                constint &spread[])
  {
//---
   ArraySetAsSeries(time,true);
   
   CopyBuffer(iChaikin_handle,0,0,2,CHO);

   DrawHistogram(true,"iChaikin=",CHO[0],time[0],0,1);
   
//---新しいバーに図を移動します。
   if(time[0]>prevTimeBar)
     {
     ...
     }
   return(rates_total);
  }

     2. iCCIインジケータ。

図7。商品チャンネル指数ヒストグラム

図7。商品チャンネル指数ヒストグラム

要約コード:

input int   period_CCI=14;             //CCI の平均期間
//---インジケータ バッファ
double      CCI[];
//---インジケータのハンドル
int         iCCI_handle;
//+------------------------------------------------------------------+
//カスタム インジケータ初期化関数 |
//+------------------------------------------------------------------+
intOnInit()
  {
   ObjectsDeleteAll(0,-1,-1);
   ChartRedraw();
   iCCI_handle=iCCI(_Symbol,_Period,period_CCI,PRICE_CLOSE);
   ArraySetAsSeries(CCI,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//カスタム インジケータ反復関数 |
//+------------------------------------------------------------------+
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[],
                constint &spread[])
  {
//---
   ArraySetAsSeries(time,true);
   
   CopyBuffer(iCCI_handle,0,0,2,CCI);

   DrawHistogram(true,"iCCI=",CCI[0],time[0],0,1);
   
//---新しいバーに図を移動します。
   if(time[0]>prevTimeBar)
     {
     ...
     }
   return(rates_total);
  }

     3. インジケータ: iEnvelopesiATRiMACD。3 つのインジケータのヒストグラムの組み合わせ。各インジケータは、別のウィンドウに表示されます。

図8。3 つのインジケータのヒストグラム: iEnvelopes、iATR、iMACD

図8。3 つのインジケータのヒストグラム: iEnvelopes、iATR、iMACD 

図8 のヒストグラムのセットの要約されたコードです。

input int   period_Envelopes=14;       //Envelopes の平均期間
input int   period_ATR=14;             //ATR の平均期間
input int   period_fast=12;            //MACD の短期期間
input int   period_slow=26;            //iMACDの長期期間
//---インジケータ バッファ
double      UPPER[];
double      LOWER[];
double      ATR[];
double      MAIN[];
double      SIGNAL[];
//---インジケータのハンドル
int         iEnvelopes_handle;
int         iATR_handle;
int         iMACD_handle;
//+------------------------------------------------------------------+
//カスタム インジケータ初期化関数 |
//+------------------------------------------------------------------+
intOnInit()
  {
   ObjectsDeleteAll(0,-1,-1);
   ChartRedraw();
   iEnvelopes_handle=iEnvelopes(_Symbol,_Period,period_Envelopes,0,MODE_SMA,PRICE_CLOSE,0.1);
   iATR_handle=iATR(_Symbol,_Period,period_ATR);
   iMACD_handle=iMACD(_Symbol,_Period,period_fast,period_slow,9,PRICE_CLOSE);
   ArraySetAsSeries(UPPER,true);
   ArraySetAsSeries(LOWER,true);
   ArraySetAsSeries(ATR,true);
   ArraySetAsSeries(MAIN,true);
   ArraySetAsSeries(SIGNAL,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//カスタム インジケータ反復関数 |
//+------------------------------------------------------------------+
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[],
                constint &spread[])
  {
//---
   ArraySetAsSeries(time,true);
   
   CopyBuffer(iEnvelopes_handle,0,0,1,UPPER);
   CopyBuffer(iEnvelopes_handle,1,0,1,LOWER);
   CopyBuffer(iATR_handle,0,0,1,ATR);
   CopyBuffer(iMACD_handle,0,0,1,MAIN);
   CopyBuffer(iMACD_handle,1,0,1,SIGNAL);

   DrawHistogram(true,"iEnvelopes.UPPER=",UPPER[0],time[0],_Digits);
   DrawHistogram(false,"iEnvelopes.LOWER=",LOWER[0],time[0],_Digits);
   DrawHistogram(true,"iATR=",ATR[0],time[0],_Digits+1,1);
   DrawHistogram(true,"iMACD.SIGNAL=",SIGNAL[0],time[0],_Digits+1,2);
   DrawHistogram(false,"iMACD.MAIN=",MAIN[0],time[0],_Digits+1,2);

//---新しいバーに図を移動します。
   if(time[0]>prevTimeBar)
     {
     ...
     }
   return(rates_total);
  }

様々なヒストグラム プロットを考えた後、結論付けできます。

  • МТ5 トレーディング ターミナル機能;
  • Mql5 をグラフィカルオブジェクトの機能;
  • グラフィックメモリ (グラフィカルオブジェクトのあまり知られていない関数)。
  • シンプルなDrawHistogram()関数

複数のインジケータの累積ヒストグラムを視覚化することができるものを標準とします。ただし、相場パラメータの詳細な分析に十分ではありません。

統計分布の数値パラメータ

この記事の最初の部分で、初心者プログラマに適切なメソッドを用い、ヒストグラムに対処しました。提供例は、統計分布とその可視化に関連する問題に投影されます。ただし、詳細なヒストグラム分析を行うには、オブジェクト指向プログラミングのような汎用性と高度なプログラミングが必要です。読者の主な関心は、統計的分布パラメータだとしましょう。

まず、数値パラメータ変化系です。

  • 算術平均 (average frequency);
  • 加重算術平均;
  • ヴァリアンス;
  • 標準偏差。

第2に、 視覚化する必要があります。もちろん、すべての手続き型を使用して実装できますが、 オブジェクト指向のタスクを解決するためにこの記事でプログラミングを適用する予定です。

CHistogram クラス

このクラスは、グラフのヒストグラムおよび主な統計分布パラメータを表示することができます。基本的なメソッドを考えてみましょう。

メソッド: CHistogramクラスのコンストラクタ。

クラスのインスタンスを初期化します。 

void CHistogram(
   string name,                     //ユニークな名のプレフィックス
   int    hsize,                    //図のスケール
   int    width,                    //ヒストグラムの列線幅
   color  active,                   //アクティブ ライン色
   color  passive,                  //パッシブラインの色
   bool   Left_Right=true,          //false = 左 または 右 = true
   bool   relative_frequency=false, //相対または絶対ヒストグラム
   int    sub_win=0                 //ヒストグラム ウィンドウ インデックス
   );

パラメタ:

 

    [in]ヒストグラムのすべての列の一意の名前のプレフィックス。 

 hsize

    [in]ヒストグラムのスケール。

 width

    [in]ヒストグラムの列線の幅。

 active

    [in]現在のバーに更新されるヒストグラムの列の色

 passive

    [in]現在のバーで更新されませんヒストグラムの列の色

 Left_Right=true

    [in]ヒストグラムの方向現在の足の左側にヒストグラムがある場合false、右の場合true

 relative_frequency=false

    [in]周波数。false — 絶対周波数値、 true -相対周波数値。

 sub_win=0

    [in]ヒストグラム ウィンドウ インデックス。0 — メイン グラフ ウィンドウ。 

戻り値:

 戻り値がない。成功すると、指定したパラメータを持つクラスのインスタンスが作成されます。

 

メソッド: DrawHistogramの表示。

ヒストグラムの列が表示されます。新しい列を作成し、既存のものを編集し、グラフィックメモリの周波数の値を保存します。現在のバーのヒストグラムを表示します。

void DrawHistogram(
   double price,  //バリアント型の値
   datetime time  //現在の時間バー
   );

パラメタ:

 価格

    [in]分析相場パラメータ バリアント値。

 時間

    [in]現在のバーの時間ヒストグラムの軸バー  

戻り値:

 戻り値がない。成功した場合、新しいヒストグラム バーが作成されるか、既存の1つが作成されます。新しいバーが表示されたら、現在のバーに軸があるので、ヒストグラムが移動します。 

 

メソッド: HistogramCharacteristicsヒストグラム パラメータを計算する。 

sVseries 型の変数で一連のパラメータが計算されます。

sVseries HistogramCharacteristics();

パラメタ:

 エントリーパラメータはありません。

戻り値:

 正常終了した場合は、sVseries 型変数の値が返されます。

 

ヒストグラム パラメータ (sVseries) の現在の値を受信するための構造体。

分布パラメータの最後の値を格納する構造体。この構造は、必要な変動時系列データを受信するために設計されています。 

struct sVseries
  {
   long     N;    //オブザベーションの合計数
   double   Na;   //周波数の平均値
   double   Vmax; //最大のバリアント値
   double   Vmin; //最小のバリアント値
   double   A;    //シリーズ振幅
   double   Mean; //加重算術平均
   double   D;    //分散
   double   SD;   //標準偏差
  };

sVseries-型の変数では、 HistogramCharacteristics()関数の 1 回の呼び出しのヒストグラムとして表示バリエーション シリーズのすべての主要なパラメータを受信できます。

 

メソッド: DrawMean視覚化します。 

グラフの変化シリーズの加重算術平均の値を表示します。 

void DrawMean(
   double coord,     //加重算術平均値
   datetime time,    //現在の時間バー
   bool marker=false,//マーカーの表示/非表示
   bool save=false   //ヒストリーに値を保存
   );

パラメタ:

 coord

    [in]加重算術平均値

 時間

    [in]現在のバーの時間加重算術平均値は、このバーに表示されます。

 marker=false

    [in]グラフのマーカーの表示/非表示。falseでマーカーを非表示、trueでマーカーを表示。

 save=false

    [in] ヒストリーの中の加重算術平均値を保存します。falsetrue値を非表示に、グラフに値を表示。

戻り値:

成功した場合、グラフは加重算術平均値に対応する水平の線を表示します。 

 

メソッド: DrawSD標準偏差の可視化。

平均周波数と上向きにプロットされた標準偏差が一致すると、下方加重算術平均値は、四角形として表示されます。

void DrawSD(
   sVseries &coord,        //sVseries 型の変数
   datetime time,          //現在の時間バー
   double deviation=1.0,   //偏差
   color clr=clrYellow     //表示色
   );

パラメタ:

 coord

    [in] sVseries 型変数の値。

 時間

    [in]現在のバーの時間

 deviation=1.0

    [in]標準偏差の増加率。

 clr=clrYellow

    [in]標準偏差を視覚化する四角形の色

Return value

 成功した場合、加重算術平均値から標準偏差を視覚化する四角形がグラフに表示されます。

  

CHistogram クラスを使用してヒストグラムをプロット

ATRMACDインジケータ (図9) と同様に、ビットとアスクの統計分布のヒストグラムをプロットしてみましょう。前の例とは異なり、このクラスは、相対図をプロットできます。ヒストグラムから離れた加重算術平均と標準偏差のグラフィカルな表現も作成してみましょう。平均値は、インジケータバッファを使用して保存します。下のスクリーンショットは、平均の周波数より良い可視性の数回を増加した、2つの偏差と等しい高さに対応する幅と四角形として表示されます。 

 図9。ヒストグラムのBid Askと同様な、iATR および iMACD のインジケータ

図9。ヒストグラムのBid Askと同様な、iATR および iMACD のインジケータ


この例のコードは、以下に添付されています。プログラムで使用されるインジケータ バッファは、関数およびクラスの相互作用を強調表示します。

結論

  • インジケータ バッファとヒストグラムの形でバリエーション シリーズの統計的な分布は、「グラフィック」のメモリを使用して実装できます。
  • グラフィカルオブジェクトに関連するタスクを扱うとき、保存メモリとしてグラフィカルオブジェクトのプロパティを適用するが妥当です。その上、広範なターミナルと mql5言語関数、並べ替え、グループ化、検索、サンプリング、要素にアクセスできます。
  • 基本的な「グラフィカル」メモリ アプリケーション メソッドについて考えてみました。実際は、グラフィカルオブジェクトのプロパティで小さな配列や構造体を格納することが可能です。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/2714

取引通貨バスケットでの利用可能なパターン 取引通貨バスケットでの利用可能なパターン
前の記事に則って、トレーダーが認識可能なパターンについて分析を試みます。また、各パターンの利点、欠点を考慮し、それに関する推奨事項を示します。ウィリアムズのオシレータに基づいたインジケーターを分析ツールとして使用します。
MT4のストラテジーテスターでバイナリーオプションを行う方法 MT4のストラテジーテスターでバイナリーオプションを行う方法
バイナリーオプションストラテジーを構築し、MT4のストラテジーテスターで検証する方法をご紹介します。
グラフィカルインタフェースX: Timeコントロール、チェックボックスコントロールのリストとテーブルのソート(ビルド6) グラフィカルインタフェースX: Timeコントロール、チェックボックスコントロールのリストとテーブルのソート(ビルド6)
グラフィカルインタフェースを作成するためのライブラリの開発が続きます。今回は、チェックボックスコントロールのリストとTimeが対象となります。さらに、CTableクラスではデータを昇順または降順に並べ替えることができるようになりました。
GUIによる汎用的なオシレーター GUIによる汎用的なオシレーター
この記事では、独自のグラフィカルインターフェイスを使用して、よくあるオシレーターに基づく汎用的なインジケータの作成プロセスについて説明します。GUIは、ユーザーが迅速かつ容易に、グラフ ・ ウィンドウから (開くことがなくそのプロパティ)、各オシレーターの設定を直接変更するとでき、特定のタスクに最適なオプションを選択することができます。