错误、漏洞、问题 - 页 2777

 
Alain Verleyen:

更新:

最大峰值现在严重增加。

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

为了实验的纯粹性,这个脚本必须在几个图表和几个终端中并行运行。然后比较挂机的时间。

 
Stanislav Korotky :

为了实验的需要,在几个图表和几个终端上并行地运行这个脚本。然后比较打嗝的时间。

好的,但如果它已经发生在一个图表上,那么它不会在多个图表上得到改善。

在多个图表/终端上运行会给你带来什么?

 
Alain Verleyen:

好的,但如果它已经发生在一个图表上,那么它不会在多个图表上得到改善。

在多个图表/终端上运行会给你带来什么?

如果在不同的终端都是一样的,那么问题就出在操作系统层面。

 
Stanislav Korotky :

如果在不同的终端都是这样,那么问题就出在操作系统上。

明白了。我会试一试的。
 
Stanislav Korotky :

为了实验的需要,在几个图表和几个终端上并行地运行这个脚本。然后比较盘旋的时间。

另一个终端,但20个图表(不同的符号),同时启动。

我检查了澳元兑美元的峰值出现的地方。

2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Number = 240
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Max = 2235
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Avg = 472
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) 平均 = 240
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) 最小 = 48
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) 最大 = 2323
2020.06.06.13 09: 16: 35.152 342152 (CADCHF, H1) 平均 = 606
2020.06.13 09: 16: 35.152 342152 (EURAUD, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) 最小 = 141
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) 最小 = 47
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) 最小。= 23
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) 最大 = 2368
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) 平均 = 607
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Min = 74
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (USDCHF, H1) Avg = 240
2020.06.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Min = 122
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Quantity = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Max = 2402
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 660
2020.06.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Min = 157
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Max = 2354
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Avg = 663
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Min = 32
。06.06.13 09: 16: 35.152 342152 (GBPCHF, H1) 最大 = 2380
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) 平均 = 616
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) 最大 = 2327
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) 平均 = 618
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Max = 2233
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Avg = 503
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1)13 09: 16: 35.152 342152 (CHFJPY, H1) Max = 2387
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Avg = 657
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Max = 2292
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Avg = 612
。13 09: 16: 35.152 342152 (EURNZD, H1) 数量 = 240
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) 最小 = 54
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) 最大 = 2361
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) 平均 = 612
2020.06.06.13 09: 16: 35.152 342152 (AUDCAD, H1) 平均 = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) 最低 = 121
2020.06.13 09: 16: 35.152 342152 (EURCAD, H1) 平均 = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) 最大 = 2328
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) 平均 = 605
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) 最大 = 2361
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) 平均 = 611
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Max = 2411
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 661
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 240
2020.06.13 09: 16: 35.13 09: 16: 35.153 342152 (GBPUSD, H1) Min = 113
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Max = 2362
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 667
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Quantity = 240
2020。06.06.13 09: 16: 35.153 342152 (USDCAD, H1) Min = 151
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Max = 2386
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Min = 35
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Avg = 671
。13 09: 16: 35.153 342152 (EURAUD, H1) 最大 = 2233
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) 平均 = 478
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) 数量 = 240
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) 最小 = 10
2020.06.06.13 09: 16: 35.153 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Max = 2384
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Avg = 658
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Min = 32
2020.06.06.13 09: 16: 35.153 342152 (USDCHF, H1) Max = 2369
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Avg = 614
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Max = 2344
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Avg = 658

而这时顶层设计就出现了。

2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) 平均 = 480
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) 最小 = 38
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) 最大 = 17421
2020.06.06.13 09: 17: 35.151 342152 (USDJPY, H1) 平均 = 533
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) 数量 = 480
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) 最小 = 35
2020.06.06.13 09: 17: 35.151 342152 (EURAUD, H1) 最大 = 17406
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) 平均 = 518
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) 数量 = 480
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Max = 17425
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Avg = 515
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) 数量 = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) 最小 = 18
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) 最大 = 17366
2020.06.13 09: 17: 35。151 342152 (EURCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Avg = 618
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (USDCHF, H1) 数量 = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) 最小 = 126
2020.06.13 09: 17: 35.151 342152 (CADCHF, H1) 数量 = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 10477
2020.06.13 09: 17: 35.151 342152 (EURCAD, H1) Quantity = 480
2020.06.13 09: 17: 35.151 342152 (GBPUSD, H1) Quantity = 480
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Min = 112
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Max = 10485
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) 平均 = 663
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) 最大 = 10435
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) 平均 = 661
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) 最小 = 71
2020.06.06.13 09: 17: 35.152 342152 (EURJPY, H1) 平均 = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) 平均 = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) 最低 = 54
.06.13 09: 17: 35.152 342152 (EURJPY, H1) Min = 10
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Max = 10487
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664.13 09: 17: 35.152 342152 (EURNZD, H1) 数量 = 480
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) 最小 = 54
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) 最大 = 17426
2020.06.06.13 09: 17: 35.152 342152 (EURNZD, H1) 平均 = 620
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) 最小 = 32
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) 最大 = 17427
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) 平均 = 649
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) 最大 = 480
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) 最小 = 32
2020.06.13 09: 17: 35。152 342152 (GBPCHF, H1) 最大 = 17433
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) 平均 = 647
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) 最小 = 480
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) 最小。= 47
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Max = 17415
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Avg = 640
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) 最大 = 17435
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) 平均 = 637
2020.06.13 09: 17: 35.152 342152 (AUDCHF, H1) 平均 = 662
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) 数量 = 480
2020.06.13 09: 17: 35。152 342152 (AUDUSD, H1) Min = 43
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Max = 17416
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Quantity = 480
2020.06.13 09: 17: 35.13 09: 17: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Max = 10468
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Avg = 660
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Quantity = 480
2020.06.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Max = 10474
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) 数量 = 480
2020.06.13 09: 17: 35.152 342152 (澳元,H1) 最小值 = 61
2020.06.13 09: 17: 35.152 342152 (澳元,H1) 最大值 = 10491
2020.06.13 09: 17: 35.152 342152 (澳元,H1) 平均值 = 663
2020.06.13 09: 17: 35.152 342152 (欧元,H1) 最大值 = 17414
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) 平均 = 646
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) 最大 = 480
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) 最小 = 100
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) 最大 = 17421
2020.06.06.13 09: 17: 35.152 342152 (AUDCAD, H1) 平均 = 638
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) 最大 = 10488
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) 平均 = 666
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) 平均 = 656

所以这一切都发生在同一时间。但这仍可能是MT5的问题。我将与其他同时进行的终端检查。

 
Stanislav Korotky:

如果在不同的终端都是一样的,那么问题就出在操作系统层面。

问题不在操作系统,而在MT。
我在MT5(build 2009)上检查了一下--一切都很顺利,执行时间不到5毫秒
而在MT5(build 2485)上--一切都变慢了,执行时间经常超过200毫秒(特别是在打开50多个图表时)
我使用了问题描述中的代码 https://www.mql5.com/en/forum/342152

我比较了MT5 2009和MT5 2485两个版本的ChartGetInteger函数的实现,也许有问题:
1.在2485中,为了读取图表对象的 "原子 "字段,使用了相当慢的操作:
mfence; lock mov eax,[rax+2C];
而在2009年的构建中,使用了: lock xadd [rcx+2C],eax

2.ntdll_RtlEnterCriticalSection中的逻辑和可能的停留时间似乎也发生了重大变化。
以前,在2009年,一个关键部分只会检查一对接收值,没有任何原子操作。
而在2485年,图表的链接列表对象还可以被列举出来。


据推测,这个问题可能发生在使用图表函数时,作为迁移到新编译器的一部分(大约2-3个月前),崩溃被修复。
附上MT5(build 2485)中ChartGetInteger调用 的汇编程序代码。

 
Sergey Dzyublik :

问题不在操作系统,而在MT。
我在MT5(build 2009)上检查了它--一切都很顺利,执行时间不到5ms
而在MT5(build 2485)上--一切都变慢了,执行时间经常超过200ms(特别是当50多个图表打开时)
使用了问题描述中的代码 https://www.mql5.com/en/forum/342152

我比较了MT5 2009和MT5 2485两个版本的ChartGetInteger函数的实现,也许有问题:
1.在2485中,为了读取图表对象的 "原子 "字段,使用了相当慢的操作:
mfence; lock mov eax,[rax+2C];
而在2009年的构建中,使用了: lock xadd [rcx+2C],eax

2.ntdll_RtlEnterCriticalSection中的逻辑和可能的停留时间似乎也发生了重大变化。
以前,在2009年,一个关键部分只会检查一对接收值,没有任何原子操作。
而在2485年,图表的链接列表对象还可以被列举出来。


据推测,这个问题可能发生在使用图表函数时,作为迁移到新编译器的一部分(大约2-3个月前),崩溃被修复。
附上MT5(build 2485)中ChartGetInteger调用 的汇编程序代码。

官方构建是2005年构建,然后是2085年构建,你有吗?我只有2007年的Build。
 
Sergey Dzyublik:

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

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

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

Ilyas:

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

我更习惯于用代码说话。
,例如,我就勾画了这样一个指标。


当鼠标移动时,ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR, 0)被执行;
,红色图形是这个函数的执行时间统计。
对一个数字的简单查询比BildChart函数的运行速度要慢很多倍,BildChart函数清除了整个屏幕,形成了一个有几千条线的图表,绘制了一个刻度,形成了一个文本信息块,并将其全部显示在屏幕上。

所有关于由于同步性而应该如此的学术讨论--同步性被认为是 "黑即白"。
有了完整的报价阵列,我就可以毫不费力地在kanvas的基础上创建自己的独立图表,并拥有该图表的完整特征表,可以在几纳秒的时间内访问。这样一来,图表的画布就会在不同的线程中呈现出来。

附加的文件:
 
我傻了很久,不明白编译器不喜欢这一行的内容。
  else (Type != -1) // expression has no effect

忘记写了,如果。我认为为这种蠢货拼出信息是个好主意。

 
Nikolai Semko:

对一个数字的简单查询要比BildChart函数慢很多倍,BildChart函数清除了整个屏幕,形成了一个有几千条线的图形,绘制了一个比例尺,形成了一个文本信息块,并将其全部输出到屏幕。

据我所知,调用ChartRedraw 并不会导致立即重绘图表。 只有在调用某些Get方法时才会发生重绘。
而ChartRedraw本质上是同一个异步方法,所以你的BuildChart测量是不可靠的。