MT5和速度在行动 - 页 35

 
fxsaber:

厌倦 对快照的调试。终于使它变得完美。一个顾问,什么都没有。二--完美。20 - 灾难:CPU低于100%。HistorySelect滞后很多毫秒。

似乎MT5并不打算同时操作许多专家顾问。

你是在写一个压力测试 还是写一个通常的专家顾问?

最有可能的是正是在一个基地的多线程压力测试。所以我再重复一遍。

关于交易、自动交易系统和交易策略测试的论坛

MT5和速度在行动

Renat Fatkhullin, 2020.09.16 12:47

如果我理解正确,这不是一个EA,而是每个符号的压力测试器。这就完全改变了情况。而且它显示了对初始条件的隐藏。

也就是说,在8(4+HT)个CPU上,16个线程(+N个工作终端线程并行)不停地、无延迟地闯入一个同步的符号数据库对象。读/写锁被混在一起,因为有不断的勾选写入。

通常在这样的情况下,根据处理器的陡峭度和它对线程的掌握程度,每个线程可以花60%到80%的时间等待。

而且这与任务的类型无关。

如果你真的在20个线程中为一个资源不停地战斗,有几个选择。

  1. 在逻辑上对访问进行解耦,不进行压力测试
  2. 去你自己的缓存(第1点的变体)。
  3. 升级你的硬件(不要被i7 2600k不坏的事实所迷惑--它很坏)。


仔细阅读盒子。如果N个线程击中一个同步对象,空等待将达到60-80%。

而多线程效率的极限将是8-12个线程左右。随着线程数的增加,采样率会下降。在2600k上,效率限制甚至更低。

 
Renat Fatkhullin:

你是在写压力测试 还是写普通的专家工作?

普通

相反,它是一个多线程的压力测试,在一个基础上。所以我再重复一遍。

如果事实上你正在为20个线程中的单一资源做不间断的战斗,有几个选择。

  1. 从逻辑上解耦访问,不处理压力测试。
  2. 去你自己的缓存(第1点的变体)。
  3. 升级你的硬件(不要被i7 2600k不坏的事实所迷惑--它很坏)。


仔细阅读盒子。如果N个线程击中一个同步对象,空等待将达到60-80%。

而多线程效率的极限将是8-12个线程左右。随着线程数的增加,采样率会下降。在2600k上,效率限制甚至更低。

完全缓存历史。但即使这样也需要调用HistorySelect(0, INT_MAX)。

作为一个实验,我削减了交易逻辑所需的所有对历史的调用。CPU上的负载已经减少了很多。


一般来说,如果有20个机器人,在历史上到处调用它们,意味着你只用一个终端就可以造成一场灾难。关于几个终点站,我们甚至不能谈论。

而且感觉同步对象不仅是历史。看来,SymbolInfoTick、CopyTicks和其他东西。

总之,我甚至不能让五个终端机运行,每个终端机上有十几个机器人。

看了看刹车剖面图,很无奈

 
fxsaber:

普通

完全缓存的历史。但即使这样也需要调用HistorySelect(0, INT_MAX)。

作为一个实验,我切断了交易逻辑所需的所有历史调用。CPU上的负载已经减少了很多。


一般来说,如果有20个机器人,那么在历史上到处调用它们,意味着你只用一个终端就能造成灾难。关于几个终点站,我们甚至不能谈论。

而且感觉同步对象不仅是历史。看来,SymbolInfoTick、CopyTicks和其他东西。

总之,我甚至不能让五个终端机运行,每个终端机上有十几个机器人。

看了看刹车剖面图,很无奈

没有证据,也没有数字数据。

1) 每个EA每秒进行多少次HistorySelect查询?

2)到底是哪些功能变慢了?

3)日志?

4)机器人的原理是什么?

 
fxsaber:

总而言之,如果有20个机器人,那么解决他们身上的故事,就是只用一个终端就能造成一场灾难。多个终端是不可能的。

也许恰恰相反--每个终端将支持自己的同步对象,而且不会有20个EA的队列给它?

尝试在1个终端上运行1个机器人,看看结果会很有趣。

 
Andrey Khatimlianskii:

也许恰恰相反--每个终端将支持自己的同步对象,不会有20个EA的队列给它?

尝试在1个终端上运行1个机器人,看看结果很有意思。

不幸的是,这个实验的结果不会回答这个问题,该怎么做?

 
fxsaber:

不幸的是,这个实验的结果不会回答这个问题,该怎么做?

重新考虑交易机器人的概念

添加

我有3个真实终端+1个演示终端,我在其中工作

每个终端有42个机器人,使用3到4个字符的OnBoorEvent。

加上每0.5秒的定时器触发+每个机器人访问终端的全局变量

而且它使用了8.34GB的32GB内存和6.7%的CPU

而且,除了交易时段开始时的TM5服务器外,没有任何东西会变慢。

 
Renat Fatkhullin:

没有证据,也没有任何数字数据。

1)每位专家每秒进行多少次HistorySelect查询?

2)到底是哪些功能变慢了?

3)日志?

4)机器人背后的原理是什么?

我很难回答这些问题,因为即使是我自己也无法掌握什么是慢下来的。剖析器甚至没有运行。他们的测量是在作弊,因为滞后已经来自CPU。不幸的是,通过快照和缓存减少对环境函数的访问,并没有带来预期的效果。我正在等待一个剖析器,它将能够编译专家顾问。


在我忙碌的时候,我发现策略测试器中的交易历史如此混乱。

void OnTick()
{
  static bool FirstRun = true;
    
  if (FirstRun)
  {
    MqlTick Tick;

    if (SymbolInfoTick(_Symbol, Tick) && Tick.ask)
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_PENDING;
      Request.type = ORDER_TYPE_BUY_LIMIT;
      Request.symbol = _Symbol;
      Request.volume = 1;
      Request.price = Tick.ask - 10000 * _Point;

      if (OrderSend(Request, Result)) // Выставили отложку.
      {
        Request.action = TRADE_ACTION_DEAL;      
        Request.type = ORDER_TYPE_BUY;
        Request.price = Tick.ask;
        
        FirstRun = !OrderSend(Request, Result); // Открыли позицию.
      }
    }
  }

  HistorySelect(0, INT_MAX); // Результат зависит от этой строки.  
}

// Проверяет наличие ордера в истории торгов.
bool CheckTicket( const long Ticket )
{
  return(HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket);
}

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

void OnDeinit( const int )
{
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(CheckTicket(4)); // true
    PRINT(CheckTicket(3)); // true
    PRINT(CheckTicket(2)); // false
  }  
}


其结果是

        AUDCAD : real ticks begin from 2020.07.15 00:00:00
        2020.07.15 00:01:09   buy limit 1 AUDCAD at 0.84993 (0.94914 / 0.94993)
        2020.07.15 00:01:09   market buy 1 AUDCAD (0.94914 / 0.94993)
        2020.07.15 00:01:09   deal #2  buy 1 AUDCAD at 0.94993 done (based on order #3)
        2020.07.15 00:01:09   deal performed [#2  buy 1 AUDCAD at 0.94993]
        2020.07.15 00:01:09   order performed buy 1 at 0.94993 [#3  buy 1 AUDCAD at 0.94993]
        2020.07.15 23:59:58   position closed due end of test at 0.94646 [#3  buy 1 AUDCAD 0.94993]
        2020.07.15 23:59:58   deal #3  sell 1 AUDCAD at 0.94646 done (based on order #4)
        2020.07.15 23:59:58   deal performed [#3  sell 1 AUDCAD at 0.94646]
        2020.07.15 23:59:58   order performed sell 1 at 0.94646 [#4  sell 1 AUDCAD at 0.94646]
        2020.07.15 23:59:58   order canceled due end of test [#2  buy limit 1 AUDCAD at 0.84993]
        final balance 99999653.00 pips
        2020.07.15 23:59:58   CheckTicket(4) = true
        2020.07.15 23:59:58   CheckTicket(3) = true
        2020.07.15 23:59:58   CheckTicket(2) = false


我几乎没有注意到这个错误,并且已经尝试写了一个多小时的回放。这段代码很白痴,但它显示了这个问题。我不知道是否有类似的东西不在测试器里,而在终端里,我不知道。

搜索字符串:Oshibka 013。


ZS b2626 - 固定。

 
prostotrader:

重新考虑交易机器人的概念

只有一个机器人可以交易所有的符号?

 
fxsaber:

只有一个机器人可以交易所有的符号?

不同的机器人,但都大致建立在相同的模式上。

一个码头同时有42个工作,在三个码头上,126个大约是400个符号。

添加

要重复(我)

每个机器人使用3到4个字符的OnBoorEvent。

加上每0.5秒触发一个计时器+每个机器人访问 终端的全局变量

8.34 GB的32GB内存和6.7%的CPU使用率

而除了TM5服务器(或Openreach硬件)在交易时段开始时,没有任何东西会变慢。

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
prostotrader:

不同的机器人,但都大致按照相同的方案建造。

一次有42个工作涉及到一个终端,而在三个终端上--126个大约是400个字符

添加

要重复(我)。

每个机器人使用3到4个字符的OnBoorEvent。

加上每0.5秒触发一个计时器+每个机器人访问 终端的全局变量

8.34 GB的32GB内存和6.7%的CPU使用率

而且,除了TM5服务器(或Open的铁器)在交易时段开始时,没有任何东西会变慢。

奇怪的是,对我来说,情况恰恰相反。

我的设备有4个终端,我已将专家顾问的数量减少到约200个,我已切断所有的OnBooks,切换回OnTick并更新了我的硬件,但问题与fxsaber相同。

但我的开放者在早上已经很久没有出现滞后现象了。而他们曾经是什么!?有时长达75秒 :)