错误、漏洞、问题 - 页 2776

 
Ilyas:

这不是一个错误,它是一个同步命令在图表中的成本。

为什么你需要对图表下达命令,以便从图表中提取特征?在内存中不是只有一个所有图表的特征表吗,你可以简单地从其中获取纳秒而不是毫秒的数据(甚至是微秒!)
,很明显ChartSetInteger、ChartSetDouble、ChartSetString函数是异步的。
但为什么ChartGetInteger、ChartGetDouble、ChartGetString函数 在执行速度上表现为异步,而它们是同步的?

如果这样的表在内存中不存在,而这些函数每次都需要放慢图表的速度来生成要求的参数,那么我就不明白了。
拥有这样一张表并保持更新并不昂贵。现实上,在内存中只有几千字节,当图表的特征发生变化时,只需一小部分微秒的时间来更新表格。
伊利亚斯,请告诉我,我错过了什么?

 
Nikolai Semko:

但是,为什么ChartGetInteger、ChartGetDouble、ChartGetString函数在执行速度上表现为异步,而它们是同步的?

你对异步和同步这两个术语有某种不正确的理解。
当他们说一个函数是异步的,这意味着它将不在当前的执行线程中执行,而是在其他线程中执行--并行的。

该函数是异步的--它意味着该函数不等待在指定图表中成功排队的命令的执行,而是立即返回控制。
该属性只有在图表队列中处理完命令后才会改变。必须调用
ChartRedraw函数以立即执行图表队列中的命令

从主线程调用异步的ChartSetInteger函数是快速的,因为实际执行是在另一个线程中进行的。


另一方面,调用ChartGetInteger的同步函数将需要线程的同步,这可能需要额外的时间。
当并行线程不断地更新图表结构的数据时(例如,当用户移动图表窗口或滚动浏览历史记录时),这种延迟尤其明显。
最有可能的是,为了简单和可靠,其图表数据结构使用了一个单一的同步对象。
你可以尝试使用 "数据分段 "来提高执行速度,但另一方面,现在你可能会遇到死锁,或更新不足的数据,或在其他更关键的领域出现减速。
一般来说,最好不要碰已经顺利运行的东西。

 
Sergey Dzyublik :

你对异步和同步这两个术语有一些误解。
当你说一个函数是异步的,这意味着它将不在当前的执行线程中执行,而是在其他线程中执行。

从主线程调用ChartSetInteger这样的异步函数是很快的,因为实际执行发生在不同的线程中。


另一方面,调用ChartGetInteger的同步函数将需要线程的同步,这可能需要额外的时间。
当并行线程不断地更新图表结构的数据时(例如,当用户移动图表窗口或滚动浏览历史记录时),这种延迟尤其明显。
最有可能的是,为了简单和可靠,其图表数据结构使用了一个单一的同步对象。
你可以尝试使用 "数据分段 "来提高执行速度,但另一方面,现在你可能会遇到死锁,或数据更新不足,或在其他更关键的地方出现减速。
总而言之,最好不要去碰那些已经稳定运行的东西。

你说得对,但似乎有一些瓶颈。现在市场已经关闭,我在1个图表上运行了下面的代码,其他的都没有作用。它运行在VPS上,只运行MT5,除了截图之外,我没有与图表/MT5进行任何互动。时间单位为μs,平均127μs,但峰值为43,995μs。


附加的文件:
342152.mq5  5 kb
 

先生们 开发者们!

如果我写错了主题,请纠正我。有一些关于易用性和调试的建议,我认为这对许多人来说是有用的,对我来说也很重要。


1.增加对象的OBJPROP_TOOLTIP 行的长度(2倍即可)。对于有大量图形的策略来说,目前的长度是非常短的。对于调试,你每次都要花时间把所有必要的数据装进去。然后你必须定期改变和/或增加对消费者的减免。


2.增加对输入参数名称的注释长度(2次就够了)。对输入参数的评论对消费者来说是必要的。而如果有一个很大的数字,也方便进行额外的编号。对于优化来说,知道变量的名称很重要。因此,往往不可能把所有东西都装进目前的长度中。例子。


3.在优化结果表中改变列的选择,直至显示ENUM_STATISTICS 的所有内容,让用户选择他/她需要的内容。这是一个非常 糟糕的分析选择。在有固定成交量的优化过程中,以%为单位的缩减是无用的。在货币和存款方面,没有选择最大提款额的可能性。在优化过程中,有时买入和卖出头寸之间会有很大的偏差,但你只有在运行一次测试后才能了解到这一点。我们经常要在结果字段(STAT_CUSTOM_ONTESTER)中输入缺少的参数。但是我们想在那里显示额外的结果标准,有可能只显示一个,如果我们从ENUM_STATISTICS 中改变标准标准的列数,我们还是可以忍受的。总而言之,我不得不在过度优化和分析上花费大量的额外时间。

谢谢你!

 
Alain Verleyen:

你说得对,但似乎有一些瓶颈。现在市场已经关闭,我在1个图表上运行了下面的代码,其他的都没有作用。它运行在VPS上,只运行MT5,除了截图外,我没有与图表/MT5进行任何互动。时间单位是μs,平均为127μs,但峰值为43,995μs。

我假设峰值是图表注释的渲染,否则,当图表队列为空时,ChartGetXXX函数的调用(注意是带同步的调用)需要0.13毫秒

 
Sergey Dzyublik:

你对异步和同步这两个术语有一些误解。
当你说一个函数是异步的,这意味着它将不在当前的执行线程中执行,而是在其他线程中执行。

从主线程调用一个异步的作为ChartSetInteger的函数是快速的,因为实际执行发生在不同的线程。


另一方面,调用ChartGetInteger的同步函数将需要线程的同步,这可能需要额外的时间。
当并行线程不断地更新图表结构的数据时(例如,当用户移动图表窗口或滚动浏览历史记录时),延迟尤其明显。
最有可能的是,为了简单和可靠,其图表数据结构使用了一个单一的同步对象。
你可以尝试使用 "数据分段 "来提高执行速度,但另一方面,现在你可能会遇到死锁,或更新不足的数据,或在其他更关键的领域出现减速。
一般来说,最好不要碰已经顺利运行的东西。

没错,为了加快同步命令的处理速度,你需要改变架构(尤其是GUI),它是通过阻断图表的渲染来给予更多的负载/时间。
 
有趣的行为。
如果你按下PrtScr按钮并移动图表窗口,会造成可怕的延迟,最长可达5秒。
然而,如果你只用ALT + PrtScr对terminal.exe程序窗口进行截图,则完全没有延迟。
 
Ilyas:
TERMINAL_GUI_ON/OFF

从内置的VPS服务 来看,有一些经验。

 
Ilyas :

我将假设峰值是图表注释的渲染,否则,当图表队列为空时,对ChartGetXXX函数的调用(注意,有同步的调用)需要0.13毫秒

不,伊利亚斯,看起来没有图表评论。我将使用日志并发布。

编辑:这是结果,运行后没有与图表或MT5或Windows互动,除了复制日志。只有一个图表,系统上没有运行其他软件。峰值较少,但与平均水平相比仍然非常重要。(µs)

2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Number = 7440
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Min = 37
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Max = 17776
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Avg = 147

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д. Значение...
 
Alain Verleyen :

不,伊利亚斯,看起来对图表 没有评论。我将使用日志并发布。

编辑:这是结果,一旦启动,除了复制日志,与图表或MT5或Windows没有任何互动。只有一个图表,系统上没有运行其他软件。峰值较少,但与平均水平相比仍然非常重要。(µs)

2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Number = 7440
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Min = 37
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Max = 17776
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Avg = 147

更新:

最大峰值现在严重增加。

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) 最大 = 23520
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) 最小 = 33
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) 最大 =81011
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) 平均 = 149