記事"インジケータのバッファや配列を使わずにヒストグラムを形成する統計分布"についてのディスカッション

 

新しい記事 インジケータのバッファや配列を使わずにヒストグラムを形成する統計分布 はパブリッシュされました:

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

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

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

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

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

作者: Sergey Pavlov

 
装丁が 邪魔にならないか?
 

市場で作業する際の大きな助けになるのが、メインウィンドウに注文数のスタックデータをヒストグラム形式で表示するインジケーターを作成する ことです。

(例として、#Xaser-infoというインジケーターがあります。

 
VSAの指標でこの表示 方法を記憶。明確で効果的
 

セルゲイ、これはとても興味深い話だ。

まず、ニュース記事からコードを取得する方法がわかりません。 結局、コードを保存し、保存したファイルからコピーペーストしました。.mhtファイルが何なのかよくわからない。

とにかく、DrawHistogram()関数を 貼り付けたのですが、コンパイルしようとすると未定義の変数がありました。 例えば、color_R_activeなどです。 これらの定義を教えてください。

ありがとうございました。

チャック・スタンガー

 
cstangor:

セルゲイ、これはとても興味深い話だ。

まず、ニュース記事からコードを取得する方法がわかりません。 結局、コードを保存し、保存したファイルからコピーペーストしました。.mhtファイルが何なのかよくわからない。

とにかく、DrawHistogram()関数を 貼り付けたのですが、コンパイルしようとすると未定義の変数がありました。 例えば、color_R_activeなどです。 これらの定義を教えてください。

ありがとうございました。

チャック・スタンガー

完全なコードを表示してください。

 
Sergey Pavlov:

完全なコードを表示する。

//+------------------------------------------------------------------+
//|draw_histogram.mqh||draw_histogram.
//| Copyright 2016, MetaQuotes Software Corp.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| 定義|
//+------------------------------------------------------------------+
// #define MacrosHello "Hello, world!"
#define マクロスイヤー2010
//+------------------------------------------------------------------+
| DLLインポート|
//+------------------------------------------------------------------+
// #import "user32.dll"
// int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
// int ExpertRecalculate(int wParam,int lParam);
// インポート
//+------------------------------------------------------------------+
| EX5インポート|
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
// string ErrorDescription(int error_code);
// インポート
//+------------------------------------------------------------------+

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");          // 価格のフリークエンシーは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();
}
 
//+------------------------------------------------------------------+
//|draw_histogram.mqh||draw_histogram.
//| Copyright 2016, MetaQuotes Software Corp.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//--- Макросы
#define   R        43    // значения префикса (+) для гистограм справа
#define   L        45    // значения префикса (-) для гистограм слева
#define   WIDTH    2     // толщина линий
#define   ObjSet1  ObjectSetInteger(0,name,OBJPROP_WIDTH,WIDTH)
#define   ObjSet2  ObjectSetDouble(0,name,OBJPROP_PRICE,0,y)
#define   ObjSet3  ObjectSetInteger(0,name,OBJPROP_TIME,0,time)
#define   ObjSet4  ObjectSetDouble(0,name,OBJPROP_PRICE,1,y)
#define   ObjSet5  ObjectSetInteger(0,name,OBJPROP_BACK,true)
#define   ObjSet   ObjSet1;ObjSet2;ObjSet3;ObjSet4;ObjSet5
//---
int      hsize=10;                     // масштаб гистограммы
color    color_R_active=clrRed;        // цвет активных линий справа
color    color_R_passive=clrLightCoral;// цвет пассивных линий справа
color    color_L_active=clrBlue;       // цвет активных линий слева
color    color_L_passive=clrSkyBlue;   // цвет пассивных линий слева

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");          // 価格のフリークエンシーは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();
}
 
Sergey Pavlov:
//+------------------------------------------------------------------+
//|draw_histogram.mqh||draw_histogram.
//| Copyright 2016, MetaQuotes Software Corp.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//--- Макросы
#define   R        43    // значения префикса (+) для гистограм справа
#define   L        45    // значения префикса (-) для гистограм слева
#define   WIDTH    2     // толщина линий
#define   ObjSet1  ObjectSetInteger(0,name,OBJPROP_WIDTH,WIDTH)
#define   ObjSet2  ObjectSetDouble(0,name,OBJPROP_PRICE,0,y)
#define   ObjSet3  ObjectSetInteger(0,name,OBJPROP_TIME,0,time)
#define   ObjSet4  ObjectSetDouble(0,name,OBJPROP_PRICE,1,y)
#define   ObjSet5  ObjectSetInteger(0,name,OBJPROP_BACK,true)
#define   ObjSet   ObjSet1;ObjSet2;ObjSet3;ObjSet4;ObjSet5
//---
int      hsize=10;                     // масштаб гистограммы
color    color_R_active=clrRed;        // цвет активных линий справа
color    color_R_passive=clrLightCoral;// цвет пассивных линий справа
color    color_L_active=clrBlue;       // цвет активных линий слева
color    color_L_passive=clrSkyBlue;   // цвет пассивных линий слева

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");          // 価格のフリークエンシーは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();
}
ありがとう!
 

セルゲイさん、

買値と売値の代わりにティック買いとティック売りの出来高をプロットして、インジケータのような価格での出来高を持とうとしています。

ありがとうございました!


私がプロットしたいデータの例、それは別ウィンドウで売買ティックボリュームの 水平ヒストグラムをプロットし、私はメインチャートウィンドウで垂直ヒストグラムをプロットしたい:

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//
#property indicator_label1  "SELL Tick"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrTomato
#property indicator_style1  STYLE_SOLID
//
#property indicator_label2  "BUY Tick"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrSpringGreen
#property indicator_style2  STYLE_SOLID
#property indicator_width2  5

//--- インジケータ・バッファ
double         ExtBuyBuffer[];
double         ExtSellBuffer[];

int OnInit()
  {
//--- インジケータ・バッファのマッピング
   SetIndexBuffer(0,ExtBuyBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSellBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---
   return(INIT_SUCCEEDED);
  }



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[])
  {

static int ticks=0;
//---
   if(ticks==0)
     {
      ArrayInitialize(ExtSellBuffer,0);
      ArrayInitialize(ExtBuyBuffer,0);
     }
//---
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick) && last_tick.flags == 56)
     {
         ExtBuyBuffer[ticks]+=NormalizeDouble(last_tick.volume,2); 
         int shift=rates_total-1-ticks;
         ticks++;
         ExtBuyBuffer[rates_total-1]=last_tick.volume;
         PlotIndexSetInteger(0,PLOT_SHIFT,shift);
     }
   if(SymbolInfoTick(Symbol(),last_tick) && last_tick.flags == 88)
     {
         ExtSellBuffer[ticks]+=NormalizeDouble(last_tick.volume,2); 
         int shift=rates_total-1-ticks;
         ticks++;
         ExtSellBuffer[rates_total-1]=last_tick.volume;
         PlotIndexSetInteger(1,PLOT_SHIFT,shift);
     }

//
//--- 次の呼び出しのためにprev_calculatedの値を返す

   return(rates_total);
 }