数组,缓冲器和时序列中索引方向

所有数组和指标缓冲区的默认索引是从左至右的,第一元素的索引等于0,因此,数组或指标缓冲区的第一元素默认从最左边的0开始,而最后一个元素在最右边。

指标缓冲区是双精度类型 动态数组 ,由客户端进行管理,因此相当于指标的字节数量。一个普通的双精度类型动态数组可以使用 SetIndexBuffer() 函数分派到指标缓冲区。指标缓冲区不要求使用 ArrayResize() 函数来建立大小-它会被终端的执行系统来执行。

时序列是颠倒搜索的数组,例如,时序列的第一个元素在最右边,最后一个元素在最左边。时序列是用来存储历史价格数据并包括时间信息,我们可以看见时序列最右边是最新数据,而最左边是最旧的数据。

因此时序列以0索引,包括最近引用的交易品种的信息。如果时序列包括每日时间列表的数据,当前尚未完成的日期会显示在0位置,而1索引位置会显示昨天的数据。

改变索引方向

函数 ArraySetAsSeries() 允许改变方位动态数组元素的方法,数据的自动命令在电脑内存中并未改变。该函数简单改变了安置数组元素的方法,因此当使用ArrayCopy(),函数复制一组数组到另一组中时,接收数组的命令会依据源数组的索引方向执行。

索引方向不能为分散的静态数组改变,即使数组以参量传递函数,想要改变内置的索引方向也是不可以的。

对于指标缓冲区来说,像普通数组一样,索引方向向后设置(像时序列),例如,关于指标缓冲区的零位置代表类似指标缓冲区的的最后值,也相当于指标最新字节的值。因此,指标的实际字节位置并未改变。

指标接收价格数据

每个自定义指标 都必要地建立 OnCalculate() 函数,价格数据需要传递指标缓冲区的计算值,搜索方向可以在传递数组中使用 ArrayGetAsSeries() 函数找到。

传递到函数的数组反应价格数据,例如,当检测数组时,这些数组都有时序列标志和函数ArrayIsSeries()返回真值,然后,在许多情况下,索引方向应该只能通过 ArrayGetAsSeries()函数检测。

为了不依赖默认值,ArraySetAsSeries() 应该为数组无条件调用,并建立必要方向。

接收价格数据和指标值

在EA交易,指标和脚本中的所有默认检索方向都是从左至右。如果必要的话,在MQL5程序中,可以要求时序列价值是任意交易品种和时序列,指标的计算值是任意交易品种和时序列。

使用Copy...() 函数完成这些操作:

 

所有这些函数都以相同方式工作,考虑到CopyBuffer()在示例中包含的原理,暗示在需求数据的索引方向是时序列,0索引位置存储当前未完成字节的数据。为了房屋这些数据,需要复制必要的数据成交量容器数组,例如,数组 buffer

copyBuffer

当复制时,我们需要在源数组中指定起始位置,从数据复制的容器数组开始。在成功的条件下,指定元素数量从源数组中复制容器数组(假设从指标缓冲区中)。不考虑设置在容器数组中的索引值,复制执行总是显示在上述计算中。

如果预计价格数据将被大量迭代循环处理,那么您使用IsStopped()函数检查迫使程序终止这个事实更明智:

int copied=CopyBuffer(ma_handle,// 指标处理
                      0,        // 指标缓冲区标引
                      0,        // 复制的开始位置
                      number,   // 复制值的数量 
                      Buffer    // 接收值的数组
                      );
if(copied<0) return;
int k=0;
while(k<copied && !IsStopped())
  {
   //--- 获得k标引的值
   double value=Buffer[k];
   // ... 
   // 使用值
   k++;
  }

示例:

input int per=10; // 指数周期
int ma_handle;    // 指标处理
//+------------------------------------------------------------------+
//| 专家初始化函数                                                     |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ma_handle=iMA(_Symbol,0,per,0,MODE_EMA,PRICE_CLOSE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 专家订单号函数                                                     |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double ema[10];
   int copied=CopyBuffer(ma_handle,// 指标处理
                         0,        // 指标缓冲区指数
                         0,        // 复制的初始位置
                         10,       // 用于复制的值数
                         ema       // 接收数组的值
                         );
   if(copied<0) return;
// .... 深层代码
  }

另见

组织数据存储