//+------------------------------------------------------------------+
 //|                                               DRAW_HISTOGRAM.mq5 |
 //|                        Copyright 2011, MetaQuotes Software Corp. |
 //|                                             https://www.mql5.com |
 //+------------------------------------------------------------------+
 #property copyright "Copyright 2000-2024, MetaQuotes Ltd."
 #property link      "https://www.mql5.com"
 #property version   "1.00"
  
 #property description "An indicator to demonstrate DRAW_HISTOGRAM"
 #property description "It draws a sinusoid as a histogram in a separate window"
 #property description "The color and width of columns are changed randomly"
 #property description "after every N ticks"
 #property description "The bars parameter sets the number of bars in the cycle of the sinusoid"
  
 #property indicator_separate_window
 #property indicator_buffers 1
 #property indicator_plots   1
 //--- 标图直方图
 #property indicator_label1  "Histogram"
 #property indicator_type1   DRAW_HISTOGRAM
 #property indicator_color1  clrBlue
 #property indicator_style1  STYLE_SOLID
 #property indicator_width1  1
 //--- 输入参数
 input int      bars=30;          // 柱形的正弦曲线周期
 input int      N=5;              // 改变直方图的订单号数量
 //--- 指标缓冲区
 double         HistogramBuffer[];
 //--- 获得2Pi角弧度的因素,当乘以柱的参数时
 double    multiplier;
 //--- 存储颜色的数组
 color colors[]={clrRed,clrBlue,clrGreen};
 //--- 存储线型样式的数组
 ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
 //+------------------------------------------------------------------+
 //| 自定义指标初始化函数                                                |
 //+------------------------------------------------------------------+
 int OnInit()
   {
 //--- 指标缓冲区映射
    SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
 //--- 计算乘数
    if(bars>1)multiplier=2.*M_PI/bars;
    else
      {
       PrintFormat("Set the value of bars=%d greater than 1",bars);
       //--- 提前终止指标
       return(INIT_PARAMETERS_INCORRECT);
      }
 //---
    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;
 //--- 计算订单号改变样式,颜色和线型宽度
    ticks++;
 //--- 如果订单号的临界值被积累
    if(ticks>=N)
      {
       //--- 改变线型属性
       ChangeLineAppearance();
       //--- 重置0计数器
       ticks=0;
      }
  
 //--- 计算指标值
    int start=0;
 //--- 如果之前OnCalculate开始期间已经计算 
    if(prev_calculated>0) start=prev_calculated-1; // 设置倒数第二柱为计算起点
 //--- 填写指标缓冲区的值
    for(int i=start;i<rates_total;i++)
      {
       HistogramBuffer[i]=sin(i*multiplier);
      }
 //--- 返回prev_calculated值以便下次调用函数
    return(rates_total);
   }
 //+------------------------------------------------------------------+
 //| 改变指标的线型外观                                                 |
 //+------------------------------------------------------------------+
 void ChangeLineAppearance()
   {
 //--- 形成线型属性信息的字符串
    string comm="";
 //--- 改变线型颜色的模块
    int number=MathRand(); // 获得随机数
 //--- 除数等于colors[]数组的大小
    int size=ArraySize(colors);
 //--- 获得选择新颜色作为整数除法余数的标引
    int color_index=number%size;
 //--- 设置颜色为PLOT_LINE_COLOR属性
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
 //--- 写下线型颜色
    comm=comm+"\r\n"+(string)colors[color_index];
  
 //--- 改变线型宽度的模块
    number=MathRand();
 //--- 获得整数除法余数的宽度
    int width=number%5;   // 宽度设置从 0 到 4
 //--- 设置宽度
    PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
 //--- 写下线型宽度
    comm=comm+"\r\nWidth="+IntegerToString(width);
  
 //--- 改变线型样式的模块
    number=MathRand();
 //--- 除数等于样式数组的大小
    size=ArraySize(styles);
 //--- 获得选择新样式作为整数除法余数的标引
    int style_index=number%size;
 //--- 设置线型样式
    PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
 //--- 写下线型样式
    comm="\r\n"+EnumToString(styles[style_index])+""+comm;
 //--- 使用注释在图表上显示信息
    Comment(comm);
   } 
 |