MT5和速度在行动 - 页 2

 
fxsaber:

请为这个想法提供一个初步的图表代码。乍听起来,这完全是一种误解。

在执行OnMain函数的过程中,没有办法知道 当前真实队列的状态。要做到这一点,唯一的变通办法是使用间谍软件,如链接中给出的。

在其最简单的形式中。

OnXXX( параметры )
{
        запомнить параметры (поместить в очередь)
        OnMain();
}
On2XX( параметры )
{
/*вычисления*/
        поменять приоритет обработки событий (если нужно)
/*вычисления*/
        промежуточный return (если нужно) 
/*вычисления*/
}
void OnMain()
{
        прочитать приоритет обработки событий
        для каждой группы событий
                извлечь параметры из очереди
                OnTradeXXX( параметры )
                удалить событие из очереди
}

你只需要改变计算本身的方法(按任务要求的频率做中间返回)。但如果这很难,请考虑在第1步中,OnMain对你来说并不存在(你不是在OnMain中移动主代码,而是在On2XX中),分别在OnMain中你不需要学习任何东西。

 
A100:

拐杖的制作方向是错误的。

留下OnXXX函数只复制队列中的事件(参数)并调用主OnMain函数。将他们所有的代码转移到重复的On2XX函数中。并从OnMain中按你需要的顺序调用这些重复的On2XX函数,依次将队列中的数据作为参数传递给它们。

然后运行测量并显示速度的提高,然后你可以建议用适当的功能来补充MQL。但是,如果你已经在这里和现在自己做了一切,为什么还要加呢?

这不是你要写的东西。
问题是,在 "OntaredeTransaction "函数的输入变量中填充字段的功能与帮助中的描述不一致,更糟糕的是:
,即许多字段在调用中甚至在TRADE_TRANSACTION_HISTORY_ADD的最终调用中没有被填充。
因此,所有的交易者都在这里苦苦思索,以某种方式在到达的那一刻确定这些缺失的参数。
这里有很多讨论,只要在论坛上搜索一下就可以了--糟糕的 "OntaredeTransaction "功能导致了额外的费用,包括时间和 "负载 "交易者在开发适当的工作代码上花费的额外时间(即巨大的时间损失和社区层面的巨大无效性)。
目前来自开发商的答复,如 "如果你有一个市场执行符号,它的价格值将是零;它应该是这样的"(链接)。(链接)--这是不正常的,再次--
,在最后一次函数调用中缺乏详尽的数值,导致大量的额外工作。

Новая версия платформы MetaTrader 5 build 2450: Сервис "Подписки", улучшения в интерфейсе и удобные функции в MetaEditor
Новая версия платформы MetaTrader 5 build 2450: Сервис "Подписки", улучшения в интерфейсе и удобные функции в MetaEditor
  • 2020.05.18
  • www.mql5.com
В пятницу 22 мая 2020 года будет выпущена обновленная версия платформы MetaTrader 5...
 
fxsaber:

HistorySelect.


这是一个极其昂贵的功能。而且,不幸的是,现在无论多少缓存都无法使其速度变得可以接受。


例如,在战场上,用实际的数据工作是很重要的。特别是,如果可能的话,来自Market Watch和CopyTicks的ticks没有过期。

要做到这一点,没有很好的,但被迫的机制来检查当前价格数据的相关性。这个机制的一部分是检测一个符号的交易比最后一个tick晚的情况。这种情况并不罕见,因此了解当前的蜱虫是否仍然是最新的,这一点很重要。


为了进行这种检测,你需要能够访问最近交易的历史。它是通过使用HistorySelect以如下示意方式完成的。


不幸的是,这样调用HistorySelect需要5-30毫秒(我在Release-EX5中亲自测量过)。当专家顾问在OnTick中进行几次这样的更新时(应该在任何暂停之后进行,例如在每次OrderSend之后),那么一切都变得异常昂贵/漫长。HistorySelect可以在一次OnTick中集体吃掉几秒钟。


亲爱的开发商,为什么这么贵?通过适当的执行,该功能可以立即执行。

你有关于 "对HistorySelect 的这种调用 持续了5-30毫秒"的证据吗?

如果我对你的想法理解正确,那么测试代码应该是这样的。

void OnStart()
  {
   MqlTick Tick;
   SymbolInfoTick(_Symbol, Tick);
   ulong start=GetMicrosecondCount();
   for(int i=0; i<100000; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   ulong end=GetMicrosecondCount()-start;
   Print("100000 HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
  }

这就是100000次查询的工作方式。

100000 HistorySelect = 141.63 ms
 
Anton:

你有关于 "对HistorySelect 的这种调用 持续了5-30毫秒"的证据吗?

如果我对你的观点理解正确,那么测试代码应该是这样的。

这就是100,000次查询的工作方式。

还有一个疑问?如果编译器在优化时就这样做,我不会感到惊讶))
 
Anton:

你有关于 "对HistorySelect 的这种调用 持续了5-30毫秒"的证据吗?

如果我对你的观点理解正确,那么测试代码应该是这样的。

这就是100,000次查询的工作方式。

运行你的脚本。

        100000 HistorySelect = 19493.96 ms


启动另一个脚本。

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }
}


HistoryDealsTotal() = 17828
HistoryOrdersTotal() = 22142


正常的战斗次数。不是HFT。


顺便说一下,你的脚本显示,HistorySelect每次都会重新计算所有的东西。而输入参数没有变化,历史表没有更新,其他HistorySelect函数没有被调用。

 
fxsaber:

运行你的脚本。

那么就需要细节。

我的测试是在并非最快的 "Intel Xeon E5-2630 v4 @ 2.20GHz "上运行的,后台有很多其他进程。

我的测试账户历史显示,自2009年以来,或多或少均匀地 有31315个订单,包括今天的8个订单。

也许,你有一些脚本或专家顾问在同时运行,导致终端数据库的急剧加载。在一个 "干净 "的终端上试试。

更多信息的测试。

void OnStart()
  {
   MqlTick Tick;
   SymbolInfoTick(_Symbol, Tick);
//---   
   ulong start=GetMicrosecondCount();
   int count=100000;
   for(int i=0; i<count; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   ulong end=GetMicrosecondCount()-start;

   Print(count," HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
   Print("Selected = ",HistoryOrdersTotal());
//---   
   Tick.time=(Tick.time/86400)*86400;
   
   start=GetMicrosecondCount();
   count=1000;
   for(int i=0; i<count; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   end=GetMicrosecondCount()-start;

   Print(count," HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
   Print("Selected = ",HistoryOrdersTotal());
//---   
   HistorySelect(0, INT_MAX);
   Print("Selected = ",HistoryOrdersTotal());
  }

三次运行。

2020.05.29 13:53:14.281 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 141.76 ms
2020.05.29 13:53:14.281 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05.29 13:53:14.284 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.82 ms
2020.05.29 13:53:14.284 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05.29 13:53:15.566 TestHistorySelect (EURUSD,H1)   Selected = 31315
2020.05.29 13:53:16.930 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 138.30 ms
2020.05.29 13:53:16.930 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05.29 13:53:16.933 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.61 ms
2020.05.29 13:53:16.933 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05.29 13:53:18.176 TestHistorySelect (EURUSD,H1)   Selected = 31315
2020.05.29 13:53:22.217 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 142.94 ms
2020.05.29 13:53:22.217 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05.29 13:53:22.220 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.57 ms
2020.05.29 13:53:22.220 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05.29 13:53:23.498 TestHistorySelect (EURUSD,H1)   Selected = 31315
 
Anton:

那么就需要细节。

我的测试是在并非最快的 "Intel Xeon E5-2630 v4 @ 2.20GHz "上运行的,后台有很多其他进程。

测试账户自2009年以来,在其历史上或多或少均匀地有31315个订单,包括今天的8个订单。

也许,你有一些脚本或专家顾问在同时运行,导致终端数据库的急剧加载。在一个 "干净 "的终端上试试。

在同一账户和机器上的空终端。

        100000 HistorySelect = 19367.01 ms


在其他账户和终端机上也是这样的情况。配置。

2020.05.29 13:53:44.766 Terminal        ICMarkets - MetaTrader 5 x64 build 2453 started for International Capital Markets Pty Ltd.
2020.05.29 13:53:44.766 Terminal        Windows 7 Service Pack 1 build 7601, Intel Core i7-2700 K  @ 3.50 GHz, 6 / 15 Gb memory, 4 / 29 Gb disk, IE 11, Admin, GMT+2


我请读者给出他们对这个剧本的结果。

void OnStart()
{
  // https://www.mql5.com/ru/forum/342090/page2#comment_16607997
#define  PRINT(A) Print(#A + " = " + (string)(A))
  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

   // https://www.mql5.com/ru/forum/342090/page2#comment_16607922
   MqlTick Tick;
   SymbolInfoTick(_Symbol, Tick);
   ulong start=GetMicrosecondCount();
   for(int i=0; i<100000; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   ulong end=GetMicrosecondCount()-start;
   Print("100000 HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
}
 
Anton:

一个更有内容的测试。

三次首发。

        100000 HistorySelect = 18344.01 ms
        Selected = 0
        1000 HistorySelect = 602.77 ms
        Selected = 1169
        Selected = 22142
        100000 HistorySelect = 18331.15 ms
        Selected = 0
        1000 HistorySelect = 446.45 ms
        Selected = 1169
        Selected = 22142
        100000 HistorySelect = 18495.35 ms
        Selected = 0
        1000 HistorySelect = 549.40 ms
        Selected = 1169
        Selected = 22142

空的终端2460。


ZS 在空账户上运行。

        100000 HistorySelect = 28.30 ms
        Selected = 0
        1000 HistorySelect = 0.28 ms
        Selected = 0
        Selected = 0


速度似乎受到交易数量 的强烈影响,而不是订单的影响。

 
fxsaber:

在同一账户和机器上清空终端。


在其他账户和终端机上也是如此。配置。


我请读者引用他们对这个脚本的结果。

这并不能证明什么,但随着每一次新的运行(在不同的符号上),时间的增加--这一事实令人震惊......

2020.05.29 13:59:36.625 test1 (USDJPY,H1)       HistoryDealsTotal() = 1
2020.05.29 13:59:36.626 test1 (USDJPY,H1)       HistoryOrdersTotal() = 0
2020.05.29 13:59:36.642 test1 (USDJPY,H1)       100000 HistorySelect = 16.00 ms
2020.05.29 13:59:53.522 test1 (EURUSD,H1)       HistoryDealsTotal() = 1
2020.05.29 13:59:53.522 test1 (EURUSD,H1)       HistoryOrdersTotal() = 0
2020.05.29 13:59:53.546 test1 (EURUSD,H1)       100000 HistorySelect = 24.36 ms
2020.05.29 14:00:03.640 test1 (USDCHF,H1)       HistoryDealsTotal() = 1
2020.05.29 14:00:03.640 test1 (USDCHF,H1)       HistoryOrdersTotal() = 0
2020.05.29 14:00:03.669 test1 (USDCHF,H1)       100000 HistorySelect = 29.25 ms
2020.05.29 14:00:14.994 test1 (GBPUSD,H1)       HistoryDealsTotal() = 1
2020.05.29 14:00:14.994 test1 (GBPUSD,H1)       HistoryOrdersTotal() = 0
2020.05.29 14:00:15.026 test1 (GBPUSD,H1)       100000 HistorySelect = 31.76 ms
 
Сергей Таболин:

需要在一个有长期交易历史的账户上运行。