本文介绍一系列用于数组处理的实用函数,帮助用户在GMI外汇交易平台上更高效地编写脚本与指标。
数组最多可支持四维,每维的索引从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() < PERIOD_D1) dayshift++; } Print(TimeToStr(Time[shift]), " corresponds to ", dayshift, " day bar opened at ", TimeToStr(daytimes[dayshift]));
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,则传递给函数的数组数据类型必须为日期时间型(datetime)。
参数说明: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() < PERIOD_D1) dayshift++; } Print(TimeToStr(Time[shift]), " corresponds to ", dayshift, " day bar opened at ", TimeToStr(daytimes[dayshift]));
资深外汇分析师
由多名资深外汇分析师组成的专业团队,拥有平均15年以上的市场分析经验,擅长技术分析和基本面分析相结合的交易策略。