MQL5 简介(第 6 部分):MQL5 中的数组函数新手指南 (二)·综合运用
(3/3)· 从第 5 部分铺垫到第 6 部分收尾,8 个数组函数里剩下的一半怎么用才不踩坑
◍ 用 ArraySwap 整批调换两个动态数组
在 MT5 的 MQL5 环境里,若想一次性把两个动态数组的全部元素对调,直接调 ArraySwap() 比手写循环快得多。它接收两个数组引用,执行后两者在内存中的数据块整体互换,原数组长度与类型需一致,否则调用会失败。 下面这段示例先把两个 int 动态数组各扩到 5 个元素,分别填 1/3/5/7/9 与 11/13/15/17/19,打印初始值后再交换。控制台输出会显示:交换前 array1 首项是 1、array2 首项是 11;交换后 array1 首项变成 11、array2 首项变成 1,证明整批替换生效。 别在静态数组上硬套 ArraySwap 只认动态数组(用 ArrayResize 分配过)。若你传了固定大小数组,编译可能过但运行期直接报 5004 数组错误,调试时别漏看这个返回码。
class="type">void OnStart() { class=class="str">"cmt">// Declare dynamic arrays class="type">int dynamic_array1[]; class="type">int dynamic_array2[]; class=class="str">"cmt">// Resize dynamic arrays to have class="num">5 elements each ArrayResize(dynamic_array1, class="num">5); ArrayResize(dynamic_array2, class="num">5); class=class="str">"cmt">// Assign values to dynamic arrays dynamic_array1[class="num">0] = class="num">1; dynamic_array1[class="num">1] = class="num">3; dynamic_array1[class="num">2] = class="num">5; dynamic_array1[class="num">3] = class="num">7; dynamic_array1[class="num">4] = class="num">9; dynamic_array2[class="num">0] = class="num">11; dynamic_array2[class="num">1] = class="num">13; dynamic_array2[class="num">2] = class="num">15; dynamic_array2[class="num">3] = class="num">17; dynamic_array2[class="num">4] = class="num">19; class=class="str">"cmt">// Print initial dynamic arrays Print("Initial dynamic_array1: "); ArrayPrint(dynamic_array1, class="num">0, " ", class="num">0, WHOLE_ARRAY); Print("Initial dynamic_array2: "); ArrayPrint(dynamic_array2, class="num">0, " ", class="num">0, WHOLE_ARRAY); class=class="str">"cmt">// Swap the contents of dynamic_array1 and dynamic_array2 ArraySwap(dynamic_array1, dynamic_array2); class=class="str">"cmt">// Print dynamic arrays after swapping Print("After swapping - dynamic_array1: "); ArrayPrint(dynamic_array1, class="num">0, " ", class="num">0, WHOLE_ARRAY); Print("After swapping - dynamic_array2: "); ArrayPrint(dynamic_array2, class="num">0, " ", class="num">0, WHOLE_ARRAY); }
「用 ArraySwap 原地交换两个动态数组」
在 MT5 的 MQL5 里,动态数组之间不需要手动循环赋值就能互换内容,ArraySwap 直接把两个数组的内部指针做了交换,开销远低于逐元素拷贝。 下面这段演示了交换前后的打印差异:先打印交换前的 dynamic_array2,再调用 ArraySwap 把 dynamic_array1 和 dynamic_array2 的内容对调,随后分别打印两个数组,你会看到两者输出完全互换。 开 MT5 新建脚本把代码贴进去跑一遍,观察 Experts 日志里两次 ArrayPrint 的输出行——若数组长度不同,ArraySwap 也会按各自尺寸安全交换,不会越界报错。外汇与贵金属行情数据常需这类原地置换处理,但杠杆品种波动剧烈,任何数组逻辑错误都可能放大实盘风险,验证时先用模拟环境。
ArrayPrint(dynamic_array2, class="num">0, " ", class="num">0, WHOLE_ARRAY); class=class="str">"cmt">// Swap the contents of dynamic_array1 and dynamic_array2 ArraySwap(dynamic_array1, dynamic_array2); class=class="str">"cmt">// Print dynamic arrays after swapping Print("After swapping - dynamic_array1: "); ArrayPrint(dynamic_array1, class="num">0, " ", class="num">0, WHOLE_ARRAY); Print("After swapping - dynamic_array2: "); ArrayPrint(dynamic_array2, class="num">0, " ", class="num">0, WHOLE_ARRAY);
数组翻转的就地操作
在 MT5 的 MQL5 里,ArrayReverse() 能直接把数组元素顺序倒过来,最后一个变第一个,不需要你手写循环交换。它支持从指定索引开始、只翻一段长度,处理 int、double、string 等类型数组都通用,代码比手动倒序更短也更不容易写错。 函数签名是 ArrayReverse(array[], start, count)。array 是待翻转数组;start 是起始下标;count 是要翻的元素个数,传 WHOLE_ARRAY 就翻到尾。注意这是就地修改,原数组被直接改写,没有返回值告诉你“成功与否”,出错会靠 GetLastError 暴露。 下面这段演示最直观:先建一个 10 元素数组 {1,3,5,7,9,11,13,15,17,19},从下标 4(值 9)开始翻到末尾。跑完之后前四个不动,后面六个倒成 19,17,15,13,11,9,打印出来就是「1 3 5 7 19 17 15 13 11 9」。外汇和贵金属 EA 里拿它翻时间序列做回看窗口重排时,务必先确认下标边界,这类品种杠杆高、滑点跳变频繁,数组越界会让脚本直接崩。
ArrayReverse(array[], start, count); class="type">void OnStart() { class=class="str">"cmt">// Declare and initialize a class="num">10-element array class="type">int array[class="num">10] = {class="num">1, class="num">3, class="num">5, class="num">7, class="num">9, class="num">11, class="num">13, class="num">15, class="num">17, class="num">19}; class=class="str">"cmt">// Print the original array Print("Original Array: "); ArrayPrint(array, class="num">0, " ", class="num">0, WHOLE_ARRAY); class=class="str">"cmt">// Reverse the array starting from index class="num">4 ArrayReverse(array, class="num">4, WHOLE_ARRAY); class=class="str">"cmt">// Print the array after reversal Print("Array after reversal from index class="num">4: "); ArrayPrint(array, class="num">0, " ", class="num">0, WHOLE_ARRAY); }
◍ 用 ArraySort 把数值数组排成升序
在 MQL5 里做指标或 EA 时,经常要在一堆价格或指标缓冲里找出极值。ArraySort() 只做一件事:把一维数组原地改成从小到大排列,头一个元素最小、最后一个最大,没有返回值,直接动原数组。 它不挑数据类型,double、int、datetime 都能排,但默认只按第一列升序。如果你的数组是二维结构,还可以传第二参数指定按哪列排,不过单维数值数组用最常见。 下面这段代码声明了 5 个 double:9.5、2.1、7.8、1.3、5.6,先打印原序,再 ArraySort,再打印。跑完之后终端里第二次 ArrayPrint 的输出会是 1.3 2.1 5.6 7.8 9.5,最小最大一眼可见。外汇和贵金属行情跳动快,这类排序结果只反映当下快照,实战里要结合高风险环境判断,别当确定性信号。
class="type">void OnStart() { class=class="str">"cmt">// Declare an array of numbers class="type">class="kw">double array[class="num">5] = {class="num">9.5, class="num">2.1, class="num">7.8, class="num">1.3, class="num">5.6}; class=class="str">"cmt">// Print the array before sorting Print("Array before sorting: "); ArrayPrint(array, class="num">1, " ", class="num">0, WHOLE_ARRAY); class=class="str">"cmt">// Use ArraySort to arrange the array in ascending order ArraySort(array); class=class="str">"cmt">// Print the array after sorting Print("Array after sorting: "); ArrayPrint(array, class="num">1, " ", class="num">0, WHOLE_ARRAY); }
「动手前先跑通这套数组函数」
本篇把 MQL5 里八个数组成员管理函数过了一遍:ArrayPrint、ArrayInsert、ArraySize、ArrayRange、ArrayRemove、ArraySwap、ArrayReverse、ArraySort。做历史数据回测或写 EA 时,这几个函数是日常操作底座,尤其 ArrayRemove 在动态裁剪样本窗口时很常用。 有读者在原文讨论区指出,ArrayRemove 示例里静态数组 count 传 2 却被写成删了 3 个元素,作者回复会核查。这提醒我们:抄文档代码进 MT5 前,先自己用 ArraySize 打印前后长度验证一遍,别直接信示例数字。 外汇和贵金属自动化波动大、滑点高,数组逻辑写错可能让 EA 在实盘误删行情样本。下一篇作者计划用视频把第 5、6 部分函数再走一遍,你可以先开 MT5 把本篇函数逐个敲一遍,等视频出了对照看哪步理解偏了。