需要MT4开发者和程序员的帮助 - 页 7

 

一堆垃圾......。

我还认为,循环使用EA是一种错误的做法。在启动周期结束后才改变参数是完全合理的。题主不禁明白,问题出在他的无尽循环中,因为他不是一个业余爱好者。然而,他在第一篇文章中没有写到关于专家顾问的无限循环的内容。我个人没有在我的EA中实施这样的系统,但是,从我的帖子来看,我了解到这种情况以前没有发生过--循环的EA中的参数窗口根本没有被打开。这意味着TC的声明"这导致现有的EA与MT4的新版本根本不兼容"是不正确的--在MT4的旧版本中,这种EA也不允许改变参数,因为在周期结束前不可能打开窗口。

EventSetMillisecondTimer确实解决了问题。但这个功能出现多久了?以前不是只有EventSetTimer吗?由于最小调用间隔为1秒,这样的事件在编写真实交易系统时完全没有用处,因为每秒钟每个符号可能有几十个刻度。

计时器的帮助 中仍然没有提到这个功能。我只是无意中发现,在进入EventSet时有个提示。

 
然而,在我看来,在变量的初始化方面,新的MQL 4/5中有一个问题和一个不一致的地方:当去初始化和初始化时,不删除和重新创建全局变量 中的动态对象。也就是说,如果EA的参数在全局变量中动态创建的对象的构造器中被读取,并且EA继续使用这些参数,当参数被改变时,EA将继续工作,就像参数没有改变一样。在我看来,这是不符合逻辑的,全局变量应该在EA被反初始化后被反初始化,然后在EA被初始化前被重新初始化。目前,这个问题的解决方法是将此类变量的初始化和删除放在OnInit和OnDeinit中。
 
AntFX:
然而,在我看来,新的MQL 4/5有一个问题和一个不一致之处:当取消初始化和初始化时,没有删除和重新创建全局变量 中的动态对象。
这是一个很好的观点...但显然开发者决定只有程序的 "出生 "和 "死亡 "才能影响全局变量的初始值......所以在去初始化块中,我们必须将全局变量的值重置为零或将它们设置为初始值 ....
 
AntFX:
然而,在我看来,在新的MQL 4/5中有一个问题和一个不一致的地方:去初始化和初始化不会删除和重新创建全局变量 中的动态对象。也就是说,如果EA的参数在全局变量中动态创建的对象的构造器中被读取,并且EA继续使用这些参数,当参数被改变时,EA将继续工作,就像参数没有改变一样。在我看来,这是不符合逻辑的,全局变量应该在EA被反初始化后被反初始化,然后在EA被初始化前被重新初始化。目前,这个问题的解决方法是将此类变量的初始化和删除放在OnInit和OnDeinit中。

是的,这是一个真正的耙子,特别是考虑到文档(这里这里 都没有)没有强调现在的加载不是与初始化事件1对1的联系。这里有一些像这样的话。

全局变量在程序加载到客户终端内存后立即被初始化一次。

显然不足以向开发者指出,后续的参数变化将被去初始化和初始化,但不是相应的卸载和加载。

 
marketeer:

是的,这是一个真正的耙子,特别是考虑到文档(这里这里 都没有)没有强调现在的加载不是与初始化事件1对1的联系。这里有一些像这样的话。

全局变量在程序加载到客户终端内存后立即被初始化一次。

显然不足以引起开发者的注意,随后的参数变化将取消初始化和初始化,但不执行相应的卸载和加载。

不需要加载/卸载和重新初始化变量。程序员必须处理好变量的初始化问题。

 
Contender:

不需要加载/卸载和重新初始化变量。程序员必须照顾到变量的初始化。

这就是我的意思:不清楚何时进行这种初始化。带有全局变量 的代码

int x = 0;

这也是初始化。但在文档中没有明确写明,从MC的角度来看,这只是没有初始化

 
严格来说,现在MT有两种不同的初始化:一种是在程序加载时进行的,另一种是在调用OnInit时改变 "环境 "时进行的。这一点已经很糟糕了,因为这必须要被挖掘出来。
 
marketeer:
严格来说,现在MT有两种不同的初始化:一种是在程序启动时进行,另一种是在调用OnInit时改变 "环境 "时进行。糟糕的是,这必须要出土。

程序启动时进行冷启动。内存被分配给变量并以初始值进行初始化。

当运行时--热启动。在这里,程序员必须照顾到变量的初始化,这很好。

 
Contender:

程序启动时进行冷启动。内存被分配给变量并以初始值进行初始化。

当运行时--热启动。在这种情况下,程序员必须照顾到变量的初始化,这很好。

好还是坏,这是个哲学问题......但事实上,在文档中关于它的信息是0.0,这并不好。
 
denkir:
它是好是坏是一个哲学问题...但事实上,在文档中关于它的信息是0.0,这并不好。

而且,如果我没记错的话,以前是没有这个东西的,也就是说,说得不好听一点,这是为了 "方便 "程序员而专门增加的一个 "功能",但它违反了现有代码的不变性(为以前的初始化规则编写)。因此,在可能的情况下保留旧代码与新版本软件的兼容性这一不变的原则没有被遵守。

没有人反对新功能和优化。但为什么不以一种不破坏旧代码的方式来做呢?特别是,对于这种新的初始化,我们可以分配额外的预处理命令,类似于#property strict。例如,#属性lazyinit,如果它是由程序员在代码中指定的(即显式的,这意味着他知道mql中的新初始化),那么我们就会为优化后的优化感到高兴。而如果没有指定,那么我们很高兴之前的代码工作一致,不需要挖掘和寻找可以保留全局变量 的地方,现在不仅要声明,还要在OnInit中单独初始化。对于每个这样的变量,将有2行代码,而不是1行。