ArrayGetAsSeries

检测数组标引的导向

bool  ArrayGetAsSeries(

   const void&  array[]    // 用于检测的数组

   );

参量

array[]

[in]  检测数组

返回值

返回 true,如果规定数组建立了AS_SERIES 标志,如下,访问数组以时序列无序执行,一个 时间序列 与普通数组通常在从未到头(从最新数据到最老)执行时序列元素索引不同。

注释

检验数组是否属于时序列,使用 ArrayIsSeries() 函数。价格数组通过输入参量无需强制传递到OnCalculate()函数中。必要的搜索导向可以通过使用 ArraySetAsSeries() 函数建立。

示例:

#property description "Indicator calculates absolute values of the difference between"

#property description "Open and Close or High and Low prices displaying them in a separate subwindow"

#property description "as a histogram."

//---指标设置

#property indicator_separate_window

#property indicator_buffers  1

#property indicator_plots   1

//---- 绘制

#property indicator_type1   DRAW_HISTOGRAM

#property indicator_style1  STYLE_SOLID

#property indicator_width1  3

//--- 导入参数

input bool InpAsSeries=true; // 指标缓冲区的标引导向

input bool InpPrices=true;   // 计算价格 (true - 开盘价,收盘价; false - 最高价,最低价)

//--- 指标缓冲区

double ExtBuffer[];

//+------------------------------------------------------------------+

//| 计算指标的值                                                       |

//+------------------------------------------------------------------+

void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,

                        const double &first[],const double &second[],double &buffer[])

  {

//--- 计算柱形的开始变量

   int start=prev_calculated;

//--- 如果前一个订单号已经计算了指标值,那么使用最近的柱

   if(prev_calculated>0)

      start--;

//--- 定义数组的标引导向

   bool as_series_first=ArrayGetAsSeries(first);

   bool as_series_second=ArrayGetAsSeries(second);

   bool as_series_buffer=ArrayGetAsSeries(buffer);

//--- 如果有必要,直接替代标引导向

   if(as_series_first)

      ArraySetAsSeries(first,false);

   if(as_series_second)

      ArraySetAsSeries(second,false);

   if(as_series_buffer)

      ArraySetAsSeries(buffer,false);

//--- 计算指标值

   for(int i=start;i<rates_total;i++)

      buffer[i]=MathAbs(first[i]-second[i]);

  }

//+------------------------------------------------------------------+

//| 自定义指标初始函数                                                  |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- 绑定指标缓冲区

   SetIndexBuffer(0,ExtBuffer);

//--- 在指标缓冲区设置标引元素

   ArraySetAsSeries(ExtBuffer,InpAsSeries);

//--- 检查指标计算的价格

   if(InpPrices)

     {

      //--- 开盘价和收盘价

      PlotIndexSetString(0,PLOT_LABEL,"BodySize");

      //--- 设置指标颜色

      PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrOrange);

     }

   else

     {

      //--- 最高价和最低价

      PlotIndexSetString(0,PLOT_LABEL,"ShadowSize");

      //--- 设置指标颜色

      PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrDodgerBlue);

     }

//---

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

  {

//--- 根据标识值计算指标

   if(InpPrices)

      CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);

   else

      CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);

//--- 为下次调用返回prev_calculated值

   return(rates_total);

  }

另见

接入时间序列ArraySetAsSeries