初学者的问题 MQL5 MT5 MetaTrader 5 - 页 503

 
Vladimir Fionov:
对于货币对来说,如果你设置了一个限制,一切都能正常工作,但对于时间框架来说,却不能工作,即使你把它放在H1指标上也不能工作。

https://docs.mql4.com/ru/chart_operations/periodwindow

https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes

返回值当前图形的周期(以分钟为单位)

if(Period() != 60)  return(-1); // для H1

试试吧,也许会有效果。

if(Period() != PERIOD_H1)  return(-1);

或者去掉倒装的逗号。

Period - Документация на MQL4
  • docs.mql4.com
Period - Документация на MQL4
 
Vladimir Zubov:

https://docs.mql4.com/ru/chart_operations/periodwindow

https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes

返回值当前图形的周期(以分钟为单位)

试试吧,看看是否有效。

非常感谢你,它成功了!!!。
 
另一个问题,当在开始添加一个#属性严格时,指标给出了一个错误的数组,在 "指标名称"(100,41)中超出了范围,如何处理这个问题?

 
Vladimir Fionov:
另一个问题,当在开始添加#属性严格的指标时,在'指标名称'(100,41)中给出错误的数组超出范围,如何处理?

你需要解决阵列 超出范围的问题。在你的代码中定位问题:第100行,第42位的字符。
 
Vladimir Fionov:

它有什么问题?

  1. 正确粘贴论坛中的代码
  2. 你应该修复超过"ema[]"数组限制的错误。你可能在计算"极限"变量时有误。
 
Karputov Vladimir:
  1. 在论坛中正确插入代码
  2. 你应该修复超过"ema[]"数组限制的错误。你可能在计算"极限"变量时有误。
对不起,我不知道代码的插入,但关于代码本身,为什么当你插入#property strict时,会发生这种情况,而没有它,一切都能正常工作。
 
Vladimir Fionov:
对不起,我不知道插入代码的事,至于代码本身,为什么当你插入#property strict时就会发生,而不插入则一切正常?

你看过MetaEditor的帮助吗?

与函数、变量的范围和释放本地数组中的内存的工作也发生了变化。由于变化相当大,所以决定引入一个新的属性#property strict,以便最大限度地与编写MQL4程序的旧方法兼容。当使用MQL4向导创建一个新的MQL4程序时,这个属性总是被添加到模板中。

以此类推。

编译器之间的差异表。

旧的MQL4编译器

新的MQL4编译器

新的MQL4编译器具有#严格的属性

入口点init()、start()、deinit()可以有任何参数和任何返回类型

保留init()、start()、deinit()的兼容性。

和新的OnInit(),OnStart(),OnCalculate(),OnTick(),OnTimer(),OnChartEvent(),OnTester(),OnDeinit()必须完全匹配它们的签名

相同

init()函数的返回结果不会被执行子系统以任何方式分析。

init()和OnInit()函数的返回结果不会被执行子系统以任何方式分析。

当从OnInit()返回一个非零值时,专家或指标停止,程序被卸载。

变量名称几乎可以是任何(保留字除外),包括特殊字符和句号

变量名称不能有特殊字符和句号。

保留字 的列表被扩大了,所以像短、长、const等常见的字不能被命名。

相同

变量的范围是从声明(甚至在嵌套块中)到函数的结束。

相同

变量的可见范围--从声明到声明该变量的块的结束。

所有变量(包括全局变量和局部变量)都隐式初始化为零。

同样的

只对全局变量进行初始化。从局部变量来看,只有字符串是隐式初始化的

本地数组在离开函数时不被释放

本地数组在离开函数时被释放。

本地数组在退出时被释放 {}。

阵列超出范围 "错误不会导致关键错误*

一样。除了结构的数组和类,这个错误是关键的

"阵列超出范围 "是一个关键错误,会导致程序停止

没有结构和类别

结构,有阶级。出现额外的数据类型。

相同

字符串 - 单字节。

datetime - 32位整数

预定义变量Volume的类型为double

字符串 - unicode。

datetime - 64位整数

体积 是一个长类型的预定义变量。

相同

ArrayCopyRates()产生虚拟复制到数组 double[][6]。

ArrayCopyRates() 产生一个虚拟复制到MqlRates[]数组。为了兼容,向数组double[][6]的复制仍然存在,但这种复制不是虚拟的而是真实的。

还有。

即使函数有一个类型,也不得返回值。为此,编译器自动在函数的末尾插入return(0)。

一样。

任何类型的函数必须总是返回一个值

同时打开的文件数量 - 32

同时打开的文件数量 - 64

相同

文件总是以共享模式打开 **

共享模式必须用FILE_SHARE_READ和/或FILE_SHARE_WRITE明确声明。

相同

输入窗口中的脚本显示了外部 变量的名称

在 show_inputs 模式下,脚本的外部 变量和输入变量 的名称会显示在输入参数窗口。

对于 show_inputs 模式的脚本,在输入窗口中会显示字符串注释,而不是外部变量输入变量 名称

* 你应该特别注意 "数组超出范围 "的错误--许多旧的自定义指标在新的编译器中以严格模式在图表上运行时会产生这个错误。最好是找到原因并消除它。

** 在新的MQL4和MQL5中,FILE_SHARE_READ和FILE_SHARE_WRITE标志负责文件共享模式,它们在旧的MQL4中并不存在

Препроцессор - Документация на MQL4
  • docs.mql4.com
Препроцессор - Документация на MQL4
 
Vladimir Fionov:
告诉我怎么了?
  int idx;
  int counted = IndicatorCounted();
  if (counted < 0) return (-1);
  if (counted > 0) counted--;
  int limit = Bars - counted;
  if(counted == 0) limit-=1;
尝试添加这样一行。
 
Vladimir Fionov:

对不起,如果我打扰了你,但现在出现了这个错误

第39位。

同样的错误,阵列超出了范围?
 
Vladimir Zubov:
同样的错误,阵列超出了范围?