下载MetaTrader 5
MQL5参考自定义指标SetIndexBuffer 

SetIndexBuffer

该函数在全局 水平使用一维动态 双精度 数组捆绑指定指标缓冲区。

bool  SetIndexBuffer(
   int                    index,         // 缓冲指数
   double                 buffer[],      // 数组
   ENUM_INDEXBUFFER_TYPE  data_type      // 要存储的东西
   );

参量

index

[in]指标缓冲区的数字,编号从0开始,该数字在#property indicator_buffers中减少申报价格。

buffer[]

[in]  在自定义指标程序中表明一组数组。

data_type

[in] 数据存储类型在指标数组里。默认是 INDICATOR_DATA (计算指标的值),也可以使用 INDICATOR_COLOR_INDEX 值;在这种情况下缓冲区为先前指标缓冲区存储颜色指数。可以在#property indicator_colorN 水平上指定64种颜色INDICATOR_CALCULATIONS 值表示缓冲器在指标媒介计算中使用,而不是用来绘画的。

返回值

如果成功,返回 true, 否则 - false

注释

在捆绑后,动态数组buffer[]将在共同数组中编入索引,尽管 时间序列 索引已经在界限数组中预先安装,如果想要转变指标数组元素的接入命令,在使用SetIndexBuffer()函数后捆绑数组使用 ArraySetAsSeries()函数。注释表明通过SetIndexBuffer()。 函数不能改变建立指标缓冲区中的动态数组的大小,对于指标缓冲器来说,所有大小转变的操作都可以通过程序的子系统来执行。

示例:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer1.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- 图 MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- 输入参量
input bool               AsSeries=true;
input int                period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//--- 指标缓冲
double                   MABuffer[];
int                      ma_handle;
//+------------------------------------------------------------------+
//| 自定义指标初始化函数                                                |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 指标缓冲绘图
   if(AsSeries) ArraySetAsSeries(MABuffer,true);
   Print("Indicator buffer is timeseries = ",ArrayGetAsSeries(MABuffer));
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Indicator buffer after SetIndexBuffer() is timeseries = ",
         ArrayGetAsSeries(MABuffer));
   
//--- 更待指标缓冲访问单元命令
   ArraySetAsSeries(MABuffer,AsSeries);
   
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   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[])
  {
//--- 复制缓冲区MABuffer中的移动平均值
   int copied=CopyBuffer(ma_handle,0,0,rates_total,MABuffer);
 
   Print("MABuffer[0] = ",MABuffer[0]);// 取决于AsSeries值
                                      // 将收到旧值
                                      // 或者为当前未完成的字节
 
//--- 为下一次调用返回prev_calculated值
   return(rates_total);
  }
//+------------------------------------------------------------------+

另见

自定义指标属性 访问时间序列和指标

 

 


更新: 2015.12.03