错误、漏洞、问题 - 页 2778

 
Alain Verleyen:

另一个终端,但20个图表(不同的符号),在同一时间开始。

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

2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) 数量 = 240
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) 最小 = 38
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) 最大 = 2235
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) 平均 = 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的问题。我将与其他同时进行的终端检查。

从日志来看,一个人的减速与另一个人的减速并不一致,也就是说不是同时进行。所以问题出在终端本身。

 

MQL5程序通过交易队列与图表一起工作(Get/Set方法)。

这可以使GUI和终端本身从不可避免的阻塞中解放出来,这对MQL5程序来说是个问题。

事务性异步允许在分离模式下快速写入或读取,并在混合Set和Get方法时立即启用同步模式。

也就是说,最好先做异步的Set 1000次,然后再做Get 1000次,而不是交替做Get & Set,把队列变成一个同步过程。因为你需要确保之前的异步Set是完全重叠的,现在你可以读取它。


你需要谨慎地使用系统功能,并尽可能地将其缓存起来。

 
Renat Fatkhullin:

你需要谨慎使用系统功能,并在可能的情况下对其进行缓存。

下午,问题有点不同--ChartGetInteger和类似的函数执行起来非常慢。
当从build 2009切换到build 2485时,ChartGetInteger的运行时间从5ms增加到200-250ms的峰值,特别是当50多个图表被打开时,这就成为一个问题。
系统: Terminal Windows 10 build 18363, Intel Core i7-7700HQ @ 2.80GHz, 19 / 31 GB内存, 262 / 640 GB磁盘, 4K显示器, NVidia 1050Ti
使用了问题描述中的代码:https://www.mql5.com/en/forum/342152

问题的可能原因。

漏洞,漏洞,问题

Sergey Dzyublik, 2020.06.13 19:20

我比较了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调用 的汇编程序代码。



 
让我们来看看。
 
Renat Fatkhullin:
看看吧。

播放的步骤。

long chart_id;

int OnInit(){
   for(int i = 0; i < 95; ++i){
      ChartOpen(_Symbol, _Period);
   }

   chart_id = ChartID();
   EventSetMillisecondTimer(250);
   return(INIT_SUCCEEDED);
}

void OnTimer(){
  ulong t=GetMicrosecondCount();
  long autoscroll = ChartGetInteger(chart_id, CHART_AUTOSCROLL);
  ulong delay =(GetMicrosecondCount()-t)/1000;
  if (delay>0){
    Print("Execution delay: ",delay, " ms");
  }
}


1.用一个干净的MT终端,在上面打开一个图表,在该图表上运行上面编译的EA。
2.在打开所有95个新图表后,如果以前没有这样做,请将图表窗口扩大到MT中图表空间的全部宽度。
3.要从一个图表标签移动到另一个,并从日志中记录ChartGetInteger的运行时间值。
要关闭所有打开的图表,你可以按住CTRL+W


MT5的结果(2009年构建)。

2020.06.14 15:33:43.173 Test123456 (EURUSD,H1)  Execution delay: 2 ms
2020.06.14 15:33:43.674 Test123456 (EURUSD,H1)  Execution delay: 3 ms
2020.06.14 15:33:44.177 Test123456 (EURUSD,H1)  Execution delay: 5 ms
2020.06.14 15:33:44.422 Test123456 (EURUSD,H1)  Execution delay: 4 ms
2020.06.14 15:33:44.673 Test123456 (EURUSD,H1)  Execution delay: 2 ms
2020.06.14 15:33:44.923 Test123456 (EURUSD,H1)  Execution delay: 3 ms
2020.06.14 15:33:45.173 Test123456 (EURUSD,H1)  Execution delay: 2 ms
2020.06.14 15:33:45.423 Test123456 (EURUSD,H1)  Execution delay: 2 ms
2020.06.14 15:33:45.672 Test123456 (EURUSD,H1)  Execution delay: 2 ms


MT5的结果(buidl 2485)。

2020.06.14 15:33:12.947 Test123456 (EURUSD,H1)  Execution delay: 163 ms
2020.06.14 15:33:13.198 Test123456 (EURUSD,H1)  Execution delay: 1 ms
2020.06.14 15:33:13.293 Test123456 (EURUSD,H1)  Execution delay: 1 ms
2020.06.14 15:33:13.831 Test123456 (EURUSD,H1)  Execution delay: 287 ms
2020.06.14 15:33:14.702 Test123456 (EURUSD,H1)  Execution delay: 136 ms
2020.06.14 15:33:15.316 Test123456 (EURUSD,H1)  Execution delay: 3 ms
2020.06.14 15:33:15.677 Test123456 (EURUSD,H1)  Execution delay: 110 ms
2020.06.14 15:33:17.041 Test123456 (EURUSD,H1)  Execution delay: 221 ms


结果和结论的比较:
1.在2009年版本中显示的记录数量远远多于2485版本中的记录。
在切换到build 2485后,"正常情况下 "的ChartGetInteger函数 变得更快。

2.2009年build的 峰值运行时间--15毫秒,2485年build的 峰值运行时间--310毫秒。
在切换到build 2485后,ChartGetInteger函数在 "不利条件下 "的速度变得慢了20倍。

3.同样,你可以通过眼睛来估计95张图表的打开速度。
对于这两个构建,早期打开的图表数量的 "指数 "复杂性是很明显的,以及在2009年构建中明显的执行速度。

 
Stanislav Korotky :

从日志来看,一个人的减速与另一个人的减速并不一致,也就是说不是同时进行。所以问题出在终端本身。

日志只是每分钟打印一次(翻译把时间戳弄乱了!),我可以更准确地检查,但这不值得。

我已经在几个终端上试过了,它清楚地显示,峰值不是同时出现的。这显然是MT5的事情。

 
Renat Fatkhullin :

MQL5程序通过交易队列与图表一起工作(Get/Set方法)。

这可以使GUI和终端本身从不可避免的阻塞中解放出来,这对MQL5程序来说是个问题。

事务性异步允许在分离模式下快速写入或读取,并在混合Set和Get方法时立即启用同步模式。

也就是说,最好先做异步的Set 1000次,然后再做Get 1000次,而不是交替做Get & Set,把队列变成一个同步过程。因为你必须确保之前的异步Set是完全重叠的,现在你可以读取它。


你需要谨慎地使用系统功能,并尽可能地将其缓存起来。

这是一个可以理解的、好的系统。但我认为在某处有一个小故障,正如@Sergey Dzyubli 也证明的那样。
Sergey Dzyublik
Sergey Dzyublik
  • www.mql5.com
Добавил тему Вход через MQL5.community (OAuth) В настройках профиля появилась новая вкладка Приложения (https://www.mql5.com/ru/users/USER_NAME/apps): Эта функция позволяет людям авторизоваться на вашем сайте или в приложении, используя аккаунт MQL5.community. Технология проста и безопасна. Она Добавил...
 
Alexey Navoykov:
据我所知,对ChartRedraw的调用 并不会导致图表的立即重绘。 重绘只发生在一些Get方法被调用的时候。
而ChartRedraw本质上是同一个异步方法。 所以你的BuildChart测量是不可靠的。

试着把这两行换一下

那么在测量中就不会有任何异步的东西,看看会发生什么。它将会更快。

 
fxsaber:
笨了很久,不明白编译器不喜欢这一行的原因。

忘记写了,如果。认为为这样的蠢货咀嚼一下信息是个好主意。

大约5年前,也许更久,要求我为所有的编译器 错误和警告 做一个描述和例子。

也许你可以做得更好。

 
Renat Fatkhullin:

MQL5程序通过交易队列与图表一起工作(Get/Set方法)。

这可以使GUI和终端本身摆脱不可避免的阻塞,这对MQL5程序来说是个问题。

事务性异步允许在分离模式下快速写入或读取,并在混合Set和Get方法时立即启用同步模式。

也就是说,最好先做异步的Set 1000次,然后再做Get 1000次,而不是交替做Get & Set,把队列变成一个同步过程。因为你必须确保之前的异步Set是完全重叠的,现在你可以读取它。


你需要谨慎地使用系统功能,并尽可能地将其缓存起来。

我没有理解错,不仅Set方法是异步的,Get也是?
Ilyas在这里 错了,不是吗?
当Slava说ChartXYToTimePrice方法是异步的时候,他在这里 是对的?毕竟,ChartXYToTimePrice方法很可能是指Get方法。

文档 中只谈到了Set方法的异步性。