从MT4转移到MT5的问题。或者,更确切地说,在MT5中无法执行某些算法而不出现错误。 - 页 4

 
Eugeni Neumoin:

OnCalculate()没有问题。整个GUI通过OnChartEvent()工作。在GUI中,有400多个按钮。一些按钮不以任何方式与时间序列互动。函数OnCalculate()和OnTrade()可以等待到下一个tick。这在心理上是不容易察觉的。而用OnChartEvent()则更为复杂。这里涉及到人类心理学。 程序用户按下GUI按钮。而heshe并没有得到他/她想要的回应。他/她的反应是什么?其中一个反应是,他/她第二次按下了同一个按钮。我把它做成这样,在许多按钮上再按一下,就会关闭该按钮所连接的功能。我期待着你的建议,以其他方式使按钮的动作失效。但是有同样的程序用于MT4。它在那里正常工作。结果会发现,MT4有一种与图形界面互动的算法,而MT5有一种不同的算法。同一程序的这种行为只会引起拒绝。

我在翻译成MT5时做了类似的事情--我启用了OnChartEvent()的退出功能。我不想撒谎,这就是为什么GUI刚刚死亡的原因。

而在我的案例中,OnTimer()中对时间序列的引用发生在5分钟之后。2分钟后我就会动手。我将检查会发生什么。

Artem,你的建议以前一直很有用。

不,肯定不会有改变图形工作逻辑的建议--跨平台的代码应该以同样的方式工作。

  1. 对时间序列的应用应该至少每两分钟进行一次--只有在这种情况下,才能保证它总是最新的。即,在多...指标,这部分代码必须是默认的。
  2. 在MQL5中,与MQL4不同,必须使用CartRedraw()来更新图表,以便在对所有可以一次性更新的图形对象进行所有必要的操作后显示图表的变化--你不需要在每次改变一个元素后更新图表。我不知道我是否已经说清楚了。例如,如果用户点击了一个按钮,并且需要额外绘制一些东西,例如一个由几个元素组成的表格对象,那么所有的元素都应该被绘制出来,只有这样,图表才会被更新一次。不在单个对象的每个绘制元素后更新。
    很可能当用户点击了按钮但没有看到任何东西时,事实上一切都在那里,只是图表还没有更新(只有在打勾的时候才会自我更新)。
 
Artyom Trishkin:

不,肯定不会有改变图形逻辑的建议--跨平台的代码应该以同样的方式工作。

我唯一可以建议改进的是,在任何情况下,当所需的时间序列尚未可用时,仍然无法在其数据上建立一个图形。在这种情况下,我们需要等待数据变得可用的时刻,并在等待时让按钮不活动--例如让它们类似于Windows界面:如果按钮上没有行动,那么按钮就是灰色的。这种逻辑可以同时存在于两个平台上,因此在代码上没有任何区别。

 

我有ChartRedraw()在退出大块时被触发,如OnChartEvent()和其他。所以这个功能没有什么问题。

关于工具提示。它们就像指示器一样,当你点击一个数字或符号时,一切都会发挥作用。

如果你点击数字和符号,必须触发OnChartEvent() -CHARTEVENT_OBJECT_CLICK 其中一个元素。 如果没有出现工具提示,则不会被触发。我想知道为什么会发生这种情况。 CHARTEVENT_OBJECT_CLICK 不起作用

而且我将密切关注对时间序列的访问。

 
Eugeni Neumoin:

我有ChartRedraw()在退出大块时被触发,如OnChartEvent()和其他。所以这个功能没有什么问题。

关于工具提示。它们就像指示器一样,当你点击一个数字或符号时,一切都会发挥作用。

如果你点击数字和符号,必须触发OnChartEvent() -CHARTEVENT_OBJECT_CLICK 其中一个元素。 如果没有出现工具提示,则不会被触发。我想知道为什么会发生这种情况。 CHARTEVENT_OBJECT_CLICK 不起作用

而且我将密切关注对时间序列的访问。

在图形事件处理程序的最开始,记录sparam参数--然后任何动作都会被记录下来。 然后开始限制输出--如果有一个对象点击事件(id==CHARTEVENT_OBJECT_CLICK),那么输出sparam到日志。而这就是你要去找的原因。

 
Artyom Trishkin:

在图形事件处理程序的最开始,记录sparam参数--然后任何动作都会被记录下来。然后开始限制输出--如果有一个对象点击事件(id==CHARTEVENT_OBJECT_CLICK),那么输出sparam到日志。而这就是你要去找的原因。

这正是我调试一切的方法。而在代码中,OnChartEvent() 中用于调试的部分总是以注释的形式出现。 但是,谢谢。我将以这种方式进行。我将寻找原因。
 

为了避免数字和符号绑定的问题,你需要用OBJPROP_ZORDER提高数字和符号的优先级。

在MT4中,没有它也可以工作。然而,为了以防万一,我提高了MT4的优先级。此外,波浪符号的优先级高于数字的优先级。

我已经把它整理好了。

我试图在2分钟后改变所有的时间序列--我正在选择不同的变体,以便最顺利地完成这项任务。

这个过程已经开始...

 
Eugeni Neumoin:

为了避免数字和符号绑定的问题,你需要用OBJPROP_ZORDER提高数字和符号的优先级。

在MT4中,没有它也可以工作。然而,为了以防万一,我在MT4中提高了优先级。此外,波浪符号的优先级高于数字的优先级。

我已经把它整理好了。

我试图在2分钟后改变所有的时间序列--我正在选择不同的变体,以便最顺利地完成这项任务。

这个过程已经开始...

平滑性与此无关 :)
只需要每两分钟至少访问一次所有工作的tf。我通常每90秒访问一次。你可以分配不同交易员的访问时间,这样就不会一下子把他们拉到一起。但每个人至少应该每两分钟访问一次。
 
Artyom Trishkin:
平滑性在这里不是一个选项 :)
你只需要每两分钟至少访问一次所有的工作cf。我通常每隔90秒就打电话。你可以分散不同流量的访问时间,这样你就不必一次拉动所有的流量。但每个人至少应该每两分钟访问一次。

有刹车。

但我们必须忍受我们所拥有的一切。

不可能拥抱无边无际的事物)。

 
Artyom Trishkin:
平滑性在这里不是一个选项 :)
你只需要每两分钟至少访问一次所有的工作cf。我通常每隔90秒就打电话。你可以把不同流量的访问时间分散开来,这样你就不必一次性拉动所有的流量。但每个人至少应该每两分钟访问一次。

这是不可能分开的。如果至少有一个交易没有更新,指标可能会使一些图形结构不正确。

另一方面,我在OnCalculate和OnChartEvent之前检查了时间序列的可用性。正如建议的那样。

更新时间序列和检查时间序列的可用性导致严重滞后。

仍然得到时间序列的访问中断。正如我在最初的一个帖子中创建分支时所说。这证实了我们必须以编程方式更新时间序列。

这是第一个。

第二。为什么每个开发者都要为组织访问时间序列而烦恼?

为什么没有一些额外的 "机制 "来消除这种麻烦?

如果有人需要这种麻烦,没有人禁止使用现在的东西。而对于那些认为普遍的替代性访问时间序列的人来说,这种访问最好是由开发者进行。

有几个人要求我把一个程序从MT4翻译到MT5。我已经做到了。我对这个翻译不满意。但只要我下载了这个程序,我就没有任何抱怨。可能他们对此感到满意。虽然我很怀疑这一点。

我想从我的角度补充一点。我已经停止了对优化访问时间序列的实验。这是对时间的无益利用。有更多有趣的事情可以做。让那些有兴趣的人用MT5工作。MT5中唯一能被啃掉的是报价历史。用于教授NS。

 
Eugeni Neumoin:

另一方面,在OnCalculate和OnChartEvent函数之前做了时间序列可用性检查。正如建议的那样。

更新时间序列和检查时间序列的可用性会导致严重减速。

有人建议用计时器每隔一分半钟做一次。不是在每个刻度 之前,当然也不是在图表事件中。

在MT5中获取时间序列真的不是很理想。但是,如果你需要解决一个问题,而不是找一个借口,这是有可能的。