文章 "直方图形式的统计分布, 无需指标缓冲区和数组"

 

新文章 直方图形式的统计分布, 无需指标缓冲区和数组已发布:

本文讨论当绘制市场条件的统计分布直方图时利用图形存储器的可能性, 而无需指标缓冲区和数组。描述了样本直方图的细节, 并展示了 MQL5 图形对象的 "隐藏" 功能。

在本文中, 我们将关注变化序列的垂直直方图: 分析参数的价格值将按照升序位于垂直轴上, 而频率位于水平轴上 (图例. 1)。传入的价格数据在当前柱线上分布并分组, 并且可以从左侧、右侧或两侧同时相对于其数轴显示。

图例. 1. 买卖价格分布的垂直直方图 

图例. 1. 买卖价格分布的垂直直方图

作者:Sergey Pavlov

 
装订 不碍事吗?
 

在主窗口中创建一个 柱状图形式的指标,其中包含来自订单数量堆栈的数据,但以动态方式显示....,这对市场工作大有帮助。

(例如指标 #Xaser-info

[删除]  
记住了 VSA 在指标中的这种显示方式。清晰有效
 

谢尔盖,这很有意思,我想谈谈。

首先,我不知道如何从新闻帖子中获取代码。 我最后保存了代码,然后从保存的文件中复制粘贴。我不知道 .mht 文件是什么。

总之,我粘贴了 DrawHistogram()函数,但当我尝试编译时,出现了未定义的变量,例如 color_R_active。 你能帮我定义这些变量吗?

谢谢。

查克-斯坦戈尔

 
cstangor:

谢尔盖,这很有意思,我想谈谈。

首先,我不知道如何从新闻帖子中获取代码。 我最后保存了代码,然后从保存的文件中复制粘贴。我不知道 .mht 文件是什么。

总之,我粘贴了 DrawHistogram()函数,但当我尝试编译时,出现了未定义的变量,例如 color_R_active。 你能帮我定义这些变量吗?

谢谢。

查克-斯坦戈尔

显示完整代码。

 
Sergey Pavlov:

显示完整代码。

//+------------------------------------------------------------------+
//|draw_histogram.mqh
//| 2016 年 MetaQuotes 软件公司版权所有。|
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| defines|
//+------------------------------------------------------------------+
// #define MacrosHello "你好,世界!"
// #define MacrosYear 2010
//+------------------------------------------------------------------+
//| DLL 导入|
//+------------------------------------------------------------------+
// #import "user32.dll"(导入 "user32.dll"
// int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"(导入 "我的专家.dll")。
// int ExpertRecalculate(int wParam,int lParam);
// #进口
//+------------------------------------------------------------------+
//| EX5 进口|
//+------------------------------------------------------------------+
// #import "stdlib.ex5"。
// 字符串 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);
// 如果绘制=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
//| 2016 年 MetaQuotes 软件公司版权所有。|
//|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);
// 如果绘制=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
//| 2016 年 MetaQuotes 软件公司版权所有。|
//|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);
// 如果绘制=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);
 }