MT5 и скорость в боевом исполнении - страница 40

 
Andrey Khatimlianskii:

Зачем сворачивать чарты, если можно свернуть весь терминал?

Проверял. CPU-нагрузка выше, чем если свернуть чарты, Обзора рынка и Инструменты.


ЗЫ Возможно, ошибаюсь.

 
Просьба добавить TERMINAL_IS_MINIMIZED по аналогии с CHART_IS_MINIMIZED. Пока приходится использовать DLL-решение.
user32::IsIconic(TerminalHandle)
Чтобы понимать, что можно снять опросы той же мышки, не рисовать панели и т.д.
 

Просьба поделиться результатами запуска этого советника со своего VPS (не с домашней машины).

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

const bool Init = EventSetTimer(1);

void OnTimer()
{  
  _B(GetMicrosecondCount(), 1); // Замеряем длительность выполнения GetMicrosecondCount()
}


На таком VPS

2020.10.03 20:21:49.222 Terminal        MetaTrader 5 x64 build 2629 started for MetaQuotes Software Corp.
2020.10.03 20:21:49.222 Terminal        Windows Server 2012 R2 build 9600 on KVM, Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS), 4 / 5 Gb memory, 7 / 38 Gb disk, IE 11, RDP, UAC, Admin, GMT+3


результат.

2020.10.04 12:01:22.763 Test6 (EOSUSD,M1)       Alert: Time[Test6.mq5 7 in OnTimer: GetMicrosecondCount()] = 26 mсs.
2020.10.04 12:01:23.747 Test6 (EOSUSD,M1)       Alert: Time[Test6.mq5 7 in OnTimer: GetMicrosecondCount()] = 33 mсs.
2020.10.04 12:01:24.747 Test6 (EOSUSD,M1)       Alert: Time[Test6.mq5 7 in OnTimer: GetMicrosecondCount()] = 36 mсs.
2020.10.04 12:01:25.748 Test6 (EOSUSD,M1)       Alert: Time[Test6.mq5 7 in OnTimer: GetMicrosecondCount()] = 32 mсs.
2020.10.04 12:01:26.762 Test6 (EOSUSD,M1)       Alert: Time[Test6.mq5 7 in OnTimer: GetMicrosecondCount()] = 23 mсs.


Желательно вместе с результатом предоставить и конфигурацию VPS, как показал выше.


Столкнуля с тем, что тормозят буквально все функции. Перед тем, как менять VPS, хочется сравнить с другими решениями и понять, какой лучше выбрать. Поэтому прошу поделиться для объективной картины.


ЗЫ Можно на любом Терминале: MT4/MT5. Но больше волнует, конечно, пятерка.

 
Поробовал заменить на WinAPI-вариант.
#import "kernel32.dll"
  int QueryPerformanceCounter(ulong &lpPerformanceCount);
  int QueryPerformanceFrequency(ulong &lpFrequency);
#import

ulong QueryPerfomanceCounter() { ulong value;  if (QueryPerformanceCounter(value)) return value;  return 0; } 

ulong QueryPerformanceFrequency() { ulong freq = 0;  if (kernel32::QueryPerformanceFrequency(freq)) return freq;  return 0; }  


// https://www.mql5.com/ru/forum/170952/page89#comment_8203859
ulong GetPerfomanceCount_mcs()
{ 
  static ulong freq= QueryPerformanceFrequency();
  return freq ? QueryPerfomanceCounter()*1000000/freq : 0;
}

#define GetMicrosecondCount GetPerfomanceCount_mcs
Результат идентичный штатному. Видимо, внутренняя реализация такая же. Есть какая-то другая реализация замера в микросекундах?
Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2018.07.27
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 

Определяет, на тормозной машине запущена программа или нет.

// Возвращает true, если тормозной VPS.
bool IsFreezeVPS()
{
  static bool FirstRun = true;
  static bool Res;
  
  if (FirstRun)
  {
    if (Res = ::GetMicrosecondCount() - ::GetMicrosecondCount())
      ::Alert("Warning: FreezeVPS - https://www.mql5.com/ru/forum/342090/page40#comment_18579094");
    
    FirstRun = false;
  }
  
  return(Res);
}
 

Похоже, обошел тормоза GetMicrosecondsCount на VPS-машинах. Может показаться, что ерунда. На самом деле боевые советники убивали VPS CPU-нагрузкой, т.к. микросекундные замеры обязаны во всю использоваться при снепшотах торгового окружения, которые, в свою очередь, призваны не грузить, а снимать нагрузку с CPU.


Кто сюда еще забрался? Снепшоты, теперь еще и GetMicrosecondsCount...

 
fxsaber:

Определяет, на тормозной машине запущена программа или нет.

Нулевая разница или нет - это дело случая:

void OnStart()
{
        const int max = 2000000;
        int count = 0;
        for ( int i = 0; i < max; i++ )
                if ( GetMicrosecondCount() != GetMicrosecondCount() )
                        count++;
        Print( max, ":" ,count );
}

Результат: 2000000:213579

 
A100:

Ноль или не ноль - это дело случая:

Результат: 2000000:213579

Да, поэтому в mqh использую такое условие.

    // Несколько проверок - от ложных срабатываний.
    bool Res = (bool)(::GetMicrosecondCount() - ::GetMicrosecondCount()) &&
               (bool)(::GetMicrosecondCount() - ::GetMicrosecondCount()) &&
               (bool)(::GetMicrosecondCount() - ::GetMicrosecondCount()) &&
               (bool)(::GetMicrosecondCount() - ::GetMicrosecondCount()) &&
               (bool)(::GetMicrosecondCount() - ::GetMicrosecondCount());
 
fxsaber:

Да, поэтому в mqh использую такое условие.

Это только 5 проверок. У меня медленный компьютер (планшет), но даже у меня разница возникает только на каждой 2000000/213579=10ой проверке. А то, что у меня медленный - подтверждается тем, что даже это ни у кого не воспроизводится:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MT5 и скорость в боевом исполнении

A100, 2020.09.05 00:13

Тоже по поводу задержек

да и все графические построения вручную (трендовая, Фибоначчи и др.) происходят также медленно

Настройки все по умолчанию:

  • Сервер: MetaQuotes-Demo
  • История: доступна с 01.01.1971
  • точная шкала времени: нет
  • Макс.баров в окне: 100000
  • Тип графика: японские свечи
  • уменьшение масштаба графика: максимальное

Символ, период баров задержка
EURUSD, Mounthly 597 есть
EURUSD, Weekly
2590 есть
EURUSD, Daily  

12797

нет

Какая то обратная зависимость: чем меньше баров, тем медленнее

На месячных и недельных допустим EURGBP графиках (где нет такой глубокой истории) - задержек нет


 
A100:

Это только 5 проверок. У меня медленный компьютер (планшет), но даже у меня разница возникает только на каждой 2000000/213579=10ой проверке. А то, что у меня медленный - подтверждается тем, что даже это ни у кого не воспроизводится:

Если пять подряд проверок дают ненулевой результат, то это тормозной GetMicrosecondsCount. Конечно, могут быть другие (даже более логичные) варианты определения наличия проблемы. Оставил пока так.

По поводу работы с баровой историей - не использую. Всегда стоят M1+5000 баров. Задача быстро торговать.