MQL4数组处理函数详解:基础用法与实战示例

在MQL4编程中,数组处理函数是高效管理数据的核心工具。本文将系统介绍相关函数的基本用法与注意事项,帮助您快速掌握。

数组的最大维数为四维。每一维的索引编号从0至数组大小减1。例如,在包含50个元素的一维数组中,第一个元素可通过array[0]调用,最后一个元素通过array[49]调用。

ArrayBsearch() – 数组搜索

ArrayCopy() – 数组复制

ArrayCopyRates() – 复制柱体(K线)数据到二维数组

ArrayCopySeries() – 复制柱体(K线)数据到一维数组

ArrayDimension() – 返回数组维数

ArrayGetAsSeries() – 判断序列数组

ArrayInitialize() – 数组初始化

ArrayIsSeries() – 判断数组是否序列化

ArrayMaximum() – 返回数组中最大值的位置

ArrayMinimum() – 返回数组中最小值的位置

ArrayRange() – 获取数组元素个数

ArrayResize() – 重设数组大小

ArraySetAsSeries() – 设置为序列化数组

ArraySize() – 获取数组大小

ArraySort() – 数组排序

ArrayBsearch() – 数组搜索

int ArrayBsearch(double array[], double value, void count, void start, void direction)如果在数组中找到指定的值,函数返回第一次找到的元素下标;若未找到,则返回最接近搜索值的元素下标。

此函数不能用于字符串型数组或序列数组(不包括柱子开盘时间的序列数组)。

注:二进制查找只能在已排序的数组中进行。使用 ArraySort() 函数可以排序数值数组。

参数:

array[] - 需要搜索的数值数组。value - 要搜索的值。count - 要搜索的元素数量,默认搜索所有元素。start - 搜索的开始位置,默认从第一个元素开始。direction - 搜索方向,可以使用以下值: MODE_ASCEND 顺序搜索, MODE_DESCEND 倒序搜索。示例:

datetime daytimes[]; int shift=10,dayshift; // Time[]中所有数值降序排列 ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1); if(Time[shift]=daytimes[0]) dayshift=0; else { dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND); if(Period()ArrayCopy() – 数组复制

int ArrayCopy(void dest[], object source[], void start_dest, void start_source, void count)将一个数组的数据复制到另一个数组。数组类型必须相同,只有double、int、datetime、color和bool类型的数组之间可以相互复制。

函数返回被复制元素的个数。

参数:

dest[] - 目标数组。 source[] - 源数组。start_dest - 目标数组接收数据的起始下标,默认为0。 start_source - 源数组读取数据的起始下标,默认为0。 count - 要复制的元素个数;默认值为 WHOLE_ARRAY 常数。 示例:

double array1[][6]; double array2[10][6]; // 用数据填充array2数组 ArrayCopyRates(array1); ArrayCopy(array2,array1,0,0,60); // 现在array2有了来自于历史的前10柱数据(第一个柱子索引为[Bar-1]) ArrayCopy(array2,array1,0,Bars*6-60,60); // 现在array2有了来自于历史的后10柱数据(最后一柱索引为[0])ArrayCopyRates() – 复制柱体(K线)数据到二维数组

int ArrayCopyRates(void dest_array[], void symbol, void timeframe)将图表上的柱体(K线)数据复制到二维数组,并返回已复制的柱数。如果返回-1,表示复制失败。数组第二维包含6个项目,分别为:

0 – 开盘时间

1 – 开盘价

2 – 最低价

3 – 最高价

4 – 收盘价

5 – 成交量

如果尝试从另一个图表获取数据(货币对名称或图表时段与当前不同),而相应的图表未打开,可能需要从服务器下载数据。这种情况下,错误信息ERR-HISTORY-WILL-UPDATED (4066 – 历史数据正在更新)会被放入last_error变量,并且可能需要再次下载数据(参见范例ArrayCopySeries())。

注:此数组通常用于向DLL函数传递数据。函数并未真正为数据数组分配内存,也未执行实际复制;当访问此类数组时,访问会被重定向。

参数:

dest_array[] - 二维目标数组(double类型数组)。 symbol - 货币对名称。 timeframe - 时间周期,可为列出的任意时间周期。示例:

double array1[][6]; ArrayCopyRates(array1,"EURUSD", PERIOD_H1); Print("当前柱 ",TimeToStr(array1[0][0]),"开盘价格", array1[0][1]);ArrayCopySeries() – 复制柱体(K线)数据到一维数组

int ArrayCopySeries(void array[], int series_index, void symbol, void timeframe)将一组柱体(K线)数据复制到一维数组,并返回复制的元素个数。

同样地,该函数不会真正分配内存或执行复制;当存取此类数组时,访问会被重定向。但在自定义指标中,指标数组是例外,此时会执行真正的复制。

如果从不同货币对或图表时段复制数据,可能会缺少数据。此时,错误信息ERR-HISTORY-WILL-UPDATED (4066 – 历史数据正在更新)会被放入last_error变量,建议稍后重试。

注:如果series_index为MODE_TIME,那么传递给函数的数组数据类型必须是日期时间型。

参数:

array[] - 一维目标数组。 series_index - 序列数组标示符,必须为序列化数组常量列表中的标示符。 symbol - 货币对名称。 timeframe - 时间周期,可为列出的任意时间周期。示例:

datetime daytimes[];int shift=10,dayshift,error;//---- 此 Time[] 数组降序排列ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);error=GetLastError();if(error==4066) { //---- 尝试多次读取 for(int i=0;i<2; i++) { Sleep(5000); ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1); //---- 检查每日柱体时间 datetime last_day=daytimes[0]; if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) && Day()==TimeDay(last_day)) break; } }if(Time[shift]=daytimes[0]) dayshift=0;else { dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND); if(Period()