跳至内容
时间序列和指标访问

时间序列和指标访问

访问时间序列和指标数据

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

这项规则有一个重要的例外情况:如果时序列和指标的值需要经常复制吗,例如,每次在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将指定交易品种 比率结构的历史数据和周期放在数组中
CopySeriesMqlRates结构获取指定交易品种周期和指定数量的同步时间序列。数据被收入到指定的数组集中。元素从现在到过去倒数,这意味着起始位置等于0表示当前柱形图。
CopyTime将指定交易品种 开盘时间柱的历史数据和周期放在数组中
CopyOpen将指定交易品种 开盘价格柱的历史数据和周期放在数组中
CopyHigh将指定交易品种最大价格柱的历史数据和周期放在数组中
CopyLow将指定交易品种最小价格柱的历史数据和周期放在数组中
CopyClose将指定交易品种收盘价格柱的历史数据和周期放在数组中
CopyTickVolume指定交易品种订单交易量历史数据和周期放在数组中
CopyRealVolume指定交易品种交易量历史数据和周期放在数组中
CopySpread指定交易品种点差历史数据和周期放在数组中
CopyTicks获得程序端为当前工作期积累的报价并写入数组
CopyTicksRange该函数可以在指定日期范围内以MqlTick格式接收报价到ticks_array
iBars返回可用于历史记录的相应交易品种和周期的柱形图的数量
iBarShift根据时间搜索柱形图。这个函数返回与指定时间对应的柱形图指数
iClose返回对应的图表上柱形图的收盘价(通过’shift’参数表示)
iHigh返回对应的图表上柱形图的最高价(通过’shift’参数表示)
iHighest返回在对应图表上找到的最高值的指数(相对于当前柱形图的转移)
iLow返回对应的图表上柱形图的最低价(通过’shift’参数表示)
iLowest返回在对应图表上找到的最小值的指数(相对于当前柱形图的转移)
iOpen返回对应的图表上柱形图的开盘价(通过’shift’参数表示)
iTime返回对应的图表上柱形图的开盘时间(通过’shift’参数表示)
iTickVolume返回对应的图表上柱形图的报价量(通过’shift’参数表示)
iRealVolume返回对应的图表上柱形图的真实交易量(通过’shift’参数表示)
iVolume返回对应的图表上柱形图的报价量(通过’shift’参数表示)
iSpread返回对应的图表上柱形图的点差值(通过’shift’参数表示)

尽管通过 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数据系列