如何解决mt4数据越界问题?array out of rang in …?

数组越界是什么意思 - 如何解决mt4数据越界问题?array out of rang in …?

首先:动态数组存值时,需要动态分配空间,你没分配空间所以越界。

解决方案可以参考下面的例句,先对数组进行分配空间:

int 数组位数=1000;

double 某数组名称[];
ArrayResize(某数组名称,数组位数);

ArrayInitialize(某数组名称,数组位数);

array out of range in ‘XXX.mq4′(xxx,xx) 出现这个报错还有可能是下面的情况:

一、插入自定义指标时,指标在 OnInit() 成功之前,MT4 先触发了 OnChartEvent() 函数,导致了在图表事件函数中调用数组出现超区错误。

所以如果指标中包含一些针对图表事件触发的计算,那么 OnChartEvent() 函数中应当增加对指标缓冲区及相关数组大小或初始化状态的判断。

二、当 OnChartEvent() 函数中调用了多个指标缓冲区,或者多个全局数组,如出现 (High[i] – Low[i]) / 2 这样的语句,需要对要调用的所有数组大小进行判断。比如前面的语句,即使 ArraySize(High) == Bars,依然可能会在 Low[i] 处报错。

我猜想可能 MT4 存在多线程或者异步处理的 Bug,导致了此类报错。

三、在 Meta Editor 编译指标源码后,图表自动刷新时,不是每次都会报这个错,也就是在编译完成后图表自动重新加载指标时,OnInit() 有可能先于 OnChartEvent() 完成调用(因为只是指标重载而不是在图表中插入指标)。导致这个问题不容易被发现。

为了避免数组越界错误,可以采取以下几种方法:

仔细检查循环条件:在使用循环访问数组时,确保循环条件正确。例如,在上述示例中,将循环条件从 i <= 5 更改为 i < 5,即可避免数组越界错误。
void OnStart() { double myArray[5]; for (int i = 0; i < 5; i++) { myArray[i] = i * 2; } }
使用 ArraySize() 函数:在 MQL4 中,可以使用 ArraySize() 函数获取数组的大小。这在处理动态数组时尤为重要。例如:
void OnStart() { double myArray[]; ArrayResize(myArray, 5); for (int i = 0; i < ArraySize(myArray); i++) { myArray[i] = i * 2; } }
在这个示例中,我们使用 ArrayResize() 函数动态设置数组大小,然后使用 ArraySize() 函数获取数组大小,避免了数组越界错误。
边界检查:在访问数组元素之前,进行边界检查。如果尝试访问的元素索引超出数组大小范围,可以输出错误信息或采取其他适当的措施。例如:
void OnStart() { double myArray[]; ArrayResize(myArray, 5); for (int i = 0; i <= 5; i++) { if (i >= ArraySize(myArray)) { Print(“Array index out of range: “, i); continue; } myArray[i] = i * 2; } }
在这个示例中,我们添加了一个条件判断,确保访问数组元素时不会发生越界错误。当尝试访问超出范围的元素时,输出错误信息并跳过当前循环。
预防数组越界错误的最佳实践
尽量避免硬编码数组大小:在可能的情况下,避免在代码中直接指定数组大小。使用 ArraySize() 函数或其他动态计算方法来确定数组大小。
充分测试代码:在实际部署自定义指标、脚本或自动交易系统之前,确保充分测试代码,以便发现并修复潜在的数组越界问题。
使用 MQL4 的内置错误处理机制:MQL4 支持 __try 和 __catch 语句,可以用于捕获并处理异常情况,包括数组越界错误。例如:void OnStart() { double myArray[]; ArrayResize(myArray, 5); for (int i = 0; i <= 5; i++) { __try { myArray[i] = i * 2; } __catch { Print(“Array index out of range: “, i); } } }在这个示例中,我们使用 __try 和 __catch 语句捕获数组越界错误,并输出错误信息。

14年经验 ,承接外汇ea指标编程,代写,破解,可以直接在废墟上交易,有需要的朋友可以联系我。

去论坛查看楼主原帖:https://www.feixu.xyz/thread/1384

© 版权声明
THE END
喜欢就支持一下吧
点赞2 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容