CopyBuffer

在需要数量中,获得确定指标指定缓冲区的数据。

copyBuffer

从一开始执行位置计算复制数据元素(指标缓冲区标引buffer_num)到当前传递位置。例如,起始位置是0代表当前字节(当前字节指标值)。

当复制位置数量的数据时,推荐使用动态数组和buffer[]容器缓冲区,因为函数试图分配复制数据的接收数组的大小。如果指标缓冲区(通过使用SetIndexBufer() 函数将数组再分配给存储指标值)以buffer[]容量数组来使用,就允许局部复制。示例可以在标准客户端包自定义指标Awesome_Oscillator.mql5中找到。

如果需要局部复指标值到另一数组(没有指标缓冲区),应该使用媒介数组,这样可以复制预期数量。如果从中间接收数组,可以管理复制所需元素值的管理之后加到要求的位置。

如果知道所需复制数据的数量,为了阻止过多分配内存,最好操作静态分配缓冲区

无论目标数组- as_series=true or as_series=false的属性是什么。数据都需要复制,因为最旧的元素放置在数组的记忆内存存储位置,有3种变体可以实现函数调用。

第一位置调用和所需元素数量

int  CopyBuffer(
   int       indicator_handle,     // 指标处理
   int       buffer_num,           // 指标缓冲区数
   int       start_pos,            // 启动位置
   int       count,                // 复制总额
   double    buffer[]              // 复制的目标数组
   );

开始日期调用和所需元素的数量

int  CopyBuffer(
   int       indicator_handle,     // 指标处理
   int       buffer_num,           // 指标缓冲区数
   datetime  start_time,           // 启动日期和时间
   int       count,                // 复制总额
   double    buffer[]              // 复制的目标数组
   );

开始调用和要求时间间隔的最后日期

int  CopyBuffer(
   int       indicator_handle,     // 指标处理
   int       buffer_num,           // 指标缓冲区数
   datetime  start_time,           // 启动日期和时间
   datetime  stop_time,            // 结束日期和时间
   double    buffer[]              // 复制的目标数组
   );

参量

indicator_handle

[in]  指标处理,通过类似指标函数返回。

buffer_num

[in]  指标缓冲区数量。

start_pos

[in]  第一复制元素位置。

count

[in]  复制结算数据。

start_time

[in]  字节时间,与第一元素相一致。

stop_time

[in]  字节时间,与最后元素相一致。

buffer[]

[out] 双精度 类型数组。

返回值

返回计算的复制数据或者错误时是-1。

注释

当向指标要求数据,如果要求的时序列没有建立或者需要从服务器上下载,函数很快会返回-1,但是下载/建立的过程将会开始。

当EA交易或脚本要求数据时,来自服务器的下载 会开始,如果终端本地没有这些数据,要求建立的时序列就会开始,如果数据可以从本地历史建立但尚未准备好。函数在超时期满时,会返回一定数量的准备好的数据,但是历史下载会继续,在下一个类似要求函数中会返回更多数据。

示例:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer3.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()
  {
//--- 指标缓冲区绘图
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Parameter AsSeries = ",AsSeries);
   Print("Indicator buffer after SetIndexBuffer() is a timeseries = ",
         ArrayGetAsSeries(MABuffer));
//--- 设置短小的指标名称
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- 设置 AsSeries(依据输入参量)
   ArraySetAsSeries(MABuffer,AsSeries);
   Print("Indicator buffer after ArraySetAsSeries(MABuffer,true); is a timeseries = ",
         ArrayGetAsSeries(MABuffer));
//---
   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[])
  {
//--- 检测是否计算了所有数据
   if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- 不复制所有数据
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      //--- 常常复制最后的值
      to_copy++;
     }
//--- 复制
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- 为下次调用返回prev_calculated值
   return(rates_total);
  }
//+------------------------------------------------------------------+

以上示例表明在相同交易品种周期中,指标缓冲区填满另一指标缓冲区的值。

请见对象绑定方法部分请求数据历史记录的详细示例。该部分可用的脚本显示了如何获得最近1000柱上指标iFractals的值和如何显示过去10的上下分形图。类似的技术可以用于所有丢失数据的指标并通常使用以下类型绘制:

 

另见

自定义指标属性SetIndexBuffer