下载MetaTrader 5
MQL5参考时间序列和指标访问 

访问时间序列和指标数据

该组函数使用时序列和指标,时序列与通常的倒序的数据数组不同――时序列的元素从数组末尾到开头进行索引(大多从当前数据到最早数据),为了复制时序列值和指标数据,仅使用 动态数组 即可完成,因为复制函数为收到的值分配数组的必要大小。

这项规则有一个重要的例外情况:如果时序列和指标的值需要经常复制吗,例如,每次在EA交易中调用 OnTick() 或者在指标中调用 OnCalculate() ,最好使用静态分配的数组 ,因为动态数组的内存分配操作需要额外时间,在测试和最佳化中会起到作用。

当使用函数访问时序列和指标的值时,要考虑索引方向,在 数组和时间序列中索引方向章节中有所描述。

 

指标和时序列数据的访问应用不考虑要求数据是否准备完好(也就是所谓的 异步访问),这对于自定义指标的计算来说非常重要,因此,如果没有数据,函数 Copy...() 类型会立即返回错误值。然而,当形成EA交易和脚本的访问时,接收数据的尝试会短暂停歇,只是为时序列要求的指标计算值的下载提供必要的时间。

组织访问数据 章节在MT5客户端中描述接收、存储和需求价格数据的细节。

Direction of indexing in a timeseries and in a commonl array

历史上在数组中接收价格数据从末尾开始,物理上,新的数据通常从数组末尾开始编写,但数组索引通常是0,时序列数组中的0索引表示当前字节中的数据,也就是,在时间表中未完成的时间间隔。

时间表中单一价格字节可以形成,在 标准时间表 中预先定义21个。

函数

功能

SeriesInfoInteger

返回历史资料信息

Bars

返回规定交易品种和周期的历史字节数量

BarsCalculated

错误情况下(还没有计算数据)返回指标缓冲区计算的数据量或者-1

IndicatorCreate

返回通过MqlParam参量类型数据创建的指定技术指标处理器

IndicatorParameters

基于指定的句柄,返回指标输入参数的数量,以及参数的值和类型

IndicatorRelease

如果没有其他,移除指标处理器并释放指标计算模块

CopyBuffer

从指定指标获得特定缓冲区数据到数组中。

CopyRates

将指定交易品种 比率结构的历史数据和周期放在数组中

CopyTime

将指定交易品种 开盘时间柱的历史数据和周期放在数组中

CopyOpen

将指定交易品种 开盘价格柱的历史数据和周期放在数组中

CopyHigh

将指定交易品种最大价格柱的历史数据和周期放在数组中

CopyLow

将指定交易品种最小价格柱的历史数据和周期放在数组中

CopyClose

将指定交易品种收盘价格柱的历史数据和周期放在数组中

CopyTickVolume

指定交易品种订单交易量历史数据和周期放在数组中

CopyRealVolume

指定交易品种交易量历史数据和周期放在数组中

CopySpread

指定交易品种点差历史数据和周期放在数组中

CopyTicks

获得程序端为当前工作期积累的报价并写入数组

CopyTicksRange

该函数可以在指定日期范围内以MqlTick格式接收报价到ticks_array

尽管通过 ArraySetAsSeries() 函数可能像在时序列一样建立 数组 接入元素,数组元素存储的可能是同一个――只有索引方向不同,为证明这个事实,提供如下示例:

   datetime TimeAsSeries[];
//--- 如时间序列访问一样设置数组访问
   ArraySetAsSeries(TimeAsSeries,true);
   ResetLastError();
   int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
   if(copied<=0)
     {
      Print("The copy operation of the open time values for last 10 bars has failed");
      return;
     }
   Print("TimeCurrent =",TimeCurrent());
   Print("ArraySize(Time) =",ArraySize(TimeAsSeries));
   int size=ArraySize(TimeAsSeries);
   for(int i=0;i<size;i++)
     {
      Print("TimeAsSeries["+i+"] =",TimeAsSeries[i]);
     }
 
   datetime ArrayNotSeries[];
   ArraySetAsSeries(ArrayNotSeries,false);
   ResetLastError();
   copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
   if(copied<=0)
     {
      Print("The copy operation of the open time values for last 10 bars has failed");
      return;
     }   
   size=ArraySize(ArrayNotSeries);
   for(int i=size-1;i>=0;i--)
     {
      Print("ArrayNotSeries["+i+"] =",ArrayNotSeries[i]);
     }

结果我们可以如下输出:

TimeCurrent = 2009.06.11 14:16:23
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00
 
ArrayNotSeries[9] = 2009.06.11 14:00:00
ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

从结果中可以看到,TimeAsSeries数组增加的索引,索引减少的时间值,也就是说,从当前移到过去,对于普通数组ArrayNotSeries来说,结果是不同的――一旦索引增加,从过去移动到当前。

另见

数组动态 ,, ArrayGetAsSeriesArraySetAsSeries数据系列