时间序列和指标访问
访问时间序列和指标数据
该组函数使用时序列和指标,时序列与通常的倒序的数据数组不同——时序列的元素从数组末尾到开头进行索引(大多从当前数据到最早数据),为了复制时序列值和指标数据,仅使用 动态数组 即可完成,因为复制函数为收到的值分配数组的必要大小。
这项规则有一个重要的例外情况:如果时序列和指标的值需要经常复制吗,例如,每次在EA交易中调用OnTick() 或者在指标中调用 OnCalculate() ,最好使用静态分配的数组 ,因为动态数组的内存分配操作需要额外时间,在测试和最佳化中会起到作用。
当使用函数访问时序列和指标的值时,要考虑索引方向,在 数组和时间序列中索引方向章节中有所描述。
指标和时序列数据的访问应用不考虑要求数据是否准备完好(也就是所谓的 异步访问),这对于自定义指标的计算来说非常重要,因此,如果没有数据,函数 Copy…() 类型会立即返回错误值。然而,当形成EA交易和脚本的访问时,接收数据的尝试会短暂停歇,只是为时序列要求的指标计算值的下载提供必要的时间。
组织访问数据 章节在MT5客户端中描述接收、存储和需求价格数据的细节。

历史上在数组中接收价格数据从末尾开始,物理上,新的数据通常从数组末尾开始编写,但数组索引通常是0,时序列数组中的0索引表示当前字节中的数据,也就是,在时间表中未完成的时间间隔。
时间表中单一价格字节可以形成,在 标准时间表 中预先定义21个。
| 函数 | 功能 |
|---|---|
| SeriesInfoInteger | 返回历史资料信息 |
| Bars | 返回规定交易品种和周期的历史字节数量 |
| BarsCalculated | 错误情况下(还没有计算数据)返回指标缓冲区计算的数据量或者-1 |
| IndicatorCreate | 返回通过MqlParam参量类型数据创建的指定技术指标处理器 |
| IndicatorParameters | 基于指定的句柄,返回指标输入参数的数量,以及参数的值和类型 |
| IndicatorRelease | 如果没有其他,移除指标处理器并释放指标计算模块 |
| CopyBuffer | 从指定指标获得特定缓冲区数据到数组中。 |
| CopyRates | 将指定交易品种 比率结构的历史数据和周期放在数组中 |
| CopySeries | 从MqlRates结构获取指定交易品种周期和指定数量的同步时间序列。数据被收入到指定的数组集中。元素从现在到过去倒数,这意味着起始位置等于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来说,结果是不同的——一旦索引增加,从过去移动到当前。
另见
数组动态 ,, ArrayGetAsSeries , ArraySetAsSeries , 数据系列