MT5和速度在行动 - 页 16

 
fxsaber:

将同样的脚本与其他交易平台进行比较是很有意思的。

MT4 b1280。

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    _B2(OrdersHistoryTotal());
    _B2(OrdersTotal());
    _B2(OrderSelect(0, SELECT_BY_POS));
    _B2(OrderSelect(0, SELECT_BY_POS, MODE_HISTORY));
    _B2(OrderSelect(0, SELECT_BY_TICKET));
        
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
                
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);      
}


2020.08.27 13:09:46.799 Test6 EURUSD,M1: Alert: Time[Test6.mq4 39: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
2020.08.27 13:09:46.790 Test6 EURUSD,M1: Alert: Time[Test6.mq4 18: OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)] = 2 ms.
2020.08.27 13:09:46.784 Test6 EURUSD,H1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.

只有三张滑板,然后他们很少冒出来。由于没有HistorySelect 和CopyTicks,可能很难创建一个制动器。

 
Fast235:

所以它们都是Haswell,Xeon的工作频率要低得多,在性能和单一测试中会有性能下降,只有在多线程优化中才会有优势。最新型号的i3的运行速度应该快得多

问一下开发人员关于缓存水平对速度的影响,以及一般来说Zen2和最新的英特尔的速度。


增加

我有Ryzen 3700x,你可以用英特尔做测试

例如,用这个MQL5/Scripts\UnitTests\Stat\TestStatBenchmark.mq5脚本

用定时器循环数次

我们在这里谈论的不是测试,而是订单 执行中的延迟。这个延迟是存在的,而且是浮动的。这让TS和我都感到很不爽。

 
fxsaber:

只有三样东西跳出来,然后它们很少跳出来。由于没有HistorySelect和CopyTicks,一定很难创建一个制动器。

在MT4上也等着呢。

2020.08.27 13:18:00.306 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:17:39.820 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 2 ms.
2020.08.27 13:17:32.598 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 36 ms.
2020.08.27 13:17:29.676 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:17:26.468 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 5 ms.
2020.08.27 13:17:26.460 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 1 ms.
2020.08.27 13:17:14.528 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 3 ms.
2020.08.27 13:16:52.309 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.308 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.307 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 13:16:42.448 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 17: OrderSelect(0,SELECT_BY_POS)] = 2 ms.
2020.08.27 13:16:32.480 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 3 ms.
2020.08.27 13:16:32.479 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 3 ms.
2020.08.27 13:16:32.477 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:16:29.096 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:16:14.593 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 23 ms.
2020.08.27 13:14:55.398 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 1 ms.
2020.08.27 13:13:34.891 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 2 ms.

以36毫秒为单位的TimeLocal。选择一个具有较大刻度量 的符号。

 

对任何感兴趣的人来说,这里是 播放的说明。

谁认为它不会被触动。

2020.08.27 13:17:56.139 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 2 ms.
2020.08.27 13:17:56.167 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 39 ms.
2020.08.27 13:17:56.198 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 54 ms.
2020.08.27 13:18:11.512 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 3 ms.
 
fxsaber:

挑选了一个具有较大tick量 的符号。

甚至不打算去检查它。想象一下,最受欢迎的FORTS符号有一个勾选的订阅。而不是在OnBookEvent中的OnTick逻辑。滞后的情况一定很糟糕。

需要官方建议,如何做才能尽量减少滞后性。

 
fxsaber:

为了重现刹车,你需要在一个字符的多个字符上运行脚本--让OnTick在同一时间被调用。然后,警报将在每一个嘀嗒声中被提示。

CPU负载图显示,terminal64.exe对8个逻辑核心的负载高达30%。这只是四个运行脚本的欧元兑美元图表。你可以清楚地看到每个图表每次加载的数量。

这么多的资源去了哪里?

这个问题很容易回答。

在这里,你复制了大量的数据。

    HistorySelect(MathRand(), INT_MAX);

你实际上是在给一个命令,把所有可用的交易历史从终端数据库中提取到EA环境中,供以后使用。你是故意要把一个可能的相同请求的缓存算法跑掉。

但你并没有使用所有这些数据,而是立即在下一行将其重置。

    _B2(HistorySelect(Tick.time, INT_MAX));

很明显,这里的终端基地是一个具有同步访问的共享资源。而且你还特意在其中创造了成千上万的订单和交易。

所有这些毫无意义的动作在每次勾选时 都会从几个线程中重复10次。而你是故意让这些行动从几个线程同时发生。

所以你很清楚你在做什么,为什么,资源花在哪里,同时你声称 "延迟是由MT5的CPU负载过大造成的"。

说了这么多,你的电脑显然有问题。也就是说,是的,你在主动移动大量的内存,但它不应该影响函数的执行时间,特别是与HistorySelect()没有任何关系的函数。

在我们的测试中,b2582,即使每格1000次,在一个字符图上有5个EA,即比你的默认条件大几个数量级,也没有观察到任何一个警报。

我们的测试系统:Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

 
Anton:

这个问题很容易回答。

这是你复制大量数据的地方。

你实际上是在给一个命令,将所有可用的交易历史从终端数据库中提取到EA环境中,供以后使用。故意随机地试图打乱相同请求的可能的缓存算法。

但你并没有使用所有这些数据,而是立即在下一行将其重置。

很明显,这里的终端基地是一个具有同步访问的共享资源。而且你还特意在其中创造了成千上万的订单和交易。

所有这些毫无意义的动作在每次勾选时 都会从几个线程中重复10次。而你是故意让这些行动从几个线程同时发生。

所以你很清楚你在做什么,为什么,资源花在哪里,同时你声称 "延迟是由MT5的CPU负载过大造成的"。

说了这么多,你的电脑显然有问题。也就是说,是的,你在主动移动大量的内存,但它不应该影响函数的执行时间,特别是与HistorySelect()没有任何关系的函数。

在我们的测试中,b2582,即使每格1000次,在一个字符图上有5个EA,即比你的默认条件大 几个数量级,也没有观察到任何一个警报。

我们的测试系统:Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz


同事们。

现在是时候让你走出飞机模型的圈子了。

这里是战斗条件。4个终端,约300个专家顾问,约30个工具。其中有三分之一的人订阅了滚轮。所有这些都是在FORTS。在这种条件下进行模拟。

 
Dmi3:


同事们。

现在是时候让你走出飞机模型的圈子了。

这里是战斗条件。4个终端,约300个EA,约30个工具。三分之一的选举人认购了滚轮。所有这些都是在FORTS。在这种条件下进行模拟。

"给你 "被接受为一个压缩文件,加上对问题的详细描述。否则就是一场空谈。

这里讨论的是所提交的EA代码和其执行的有效性。根据所发现的问题,已经进行了优化终端代码 的工作。

 
Anton:

"给你 "被接受为一个压缩文件,加上对问题的详细描述。否则就是一场空谈。

在这种情况下,讨论的是EA提交的代码和其执行的效率。终端代码已经 针对发现的问题进行了优化。

我没有任何问题,没有什么可送的。

fxsaber有问题。 他已经在这里写了16页。

而米哈伊尔自2014年以来也有同样的 问题,他已经写了149页:https://www.mql5.com/ru/forum/38456/page149。

他们都有足够的资格给你提供你需要的所有信息。

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.08.20
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 
Anton:

这个问题很容易回答。

这是你复制大量数据的地方。

你实际上是在给一个命令,将所有可用的交易历史从终端数据库中提取到EA环境中,供以后使用。故意随机化,试图打乱相同请求的可能的缓存算法。

你没有遵循这个主题的发展年表,所以你允许自己在发言中进行指责。

我删除了MathRand一行。这里有一个简短的记录。

2020.08.27 22:38:57.920 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 3 ms.
2020.08.27 22:38:57.923 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:38:57.926 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:38:57.928 Alert: Time[Test6.mq5 61: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 22:38:57.940 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 11 ms.
2020.08.27 22:39:02.227 Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 1 ms.
2020.08.27 22:39:02.229 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:39:02.238 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 7 ms.
2020.08.27 22:39:02.241 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 1 ms.
2020.08.27 22:40:34.575 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:40:44.407 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:40:44.409 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 9 ms.
2020.08.27 22:40:46.819 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.
2020.08.27 22:40:52.760 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:40:52.764 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 3 ms.
2020.08.27 22:40:54.907 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:41:11.415 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.27 22:41:13.517 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:41:14.689 Alert: Time[Test6.mq5 18: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:41:45.343 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:42:12.156 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:42:19.654 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:32.581 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:48.662 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:49.754 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:49.756 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:50.803 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:50.804 Alert: Time[Test6.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 1 ms.
2020.08.27 22:42:50.805 Alert: Time[Test6.mq5 44: TimeCurrent()] = 1 ms.
2020.08.27 22:43:42.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.27 22:43:42.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.27 22:43:54.985 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:44:01.402 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:44:01.405 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.


但你并没有使用所有这些数据,而是立即将其倾倒在下一行。

显然,这里的终端基地是一个具有同步访问的共享资源。而且你还特意在其中创造了成千上万的订单和交易。

我在真实账户上进行测试,其中超过10K的订单是正常的。这些不是假订单,因为其中>70%的订单被执行。

顺便说一下,在截图上,9331+576!=12529。

所有这些无意义的动作在每次打勾 时都会同时从几个线程中重复10次。而你是故意让这些来自多个线程的行动同时发生。

我在不同的角色上都有问题。建议用一个符号来更快地再现问题。

每一次打勾都要重复10次,这是一个至关重要的必要条件。因为一个EA包含一打不同专业的TC是正常的。

所以你很清楚你在做什么,为什么,以及资源的去向,但你却声称 "延迟是由于MT5的CPU负载过大"。

说了这么多,你的电脑显然有问题。我的意思是,是的,你在主动移动大量的内存,但它不应该影响函数的执行时间,尤其是与HistorySelect()没有任何关系的函数。

我不能指责你的无能,但你写的东西,说句不好听的,让人摸不着头脑。HistorySelect是寻找四个索引(订单表的开始/结束和交易表的开始/结束)。这些表是按时间排序的,所以最差也有(应该有)一个二进制搜索。对于10K订单,它是瞬时的(计算二进制对数)。什么是记忆量的运动?这里没有人在谈论可怕的HistorySelectByPosition。初级的HistorySelect受到影响。

在我们的测试中,b2582,即使每格1000次,在一个字符图上有5个EA,即比你的默认条件大几个数量级,也没有观察到一个警报。

我们的测试系统:Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

请在此提供进行测试的交易账户的登录信息。