Новая версия платформы MetaTrader 5 build 3520: добавлена 2FA/TOTP аутентификация с помощью Google Authenticator - страница 2

 

В TaskManager (b3521) нарываюсь на нулевые значения.


 

Есть большие подозрения, что Sleep(1) выполняется на последних версиях Windows 10 строго 16 мс(среднее время). Запустил проверку времени исполнения Sleep(1). Сделал тест на трех ноутах и одном ПК.

Windows 10 стоит на 1 слабом ноуте и на ноуте купленном 3 года назад  и старом ПК. Везде Sleep(1) выполняется 16 мс. Хотя два года назад я выкладывал тесты на том же ПК на той же Windows 10, но более ранней сборки, было 2 мс. 

Запустил проверку и на древнем ноуте где стоит Windows 8.1 . Получил время выполнения 2 мс.

Начал копать в сторону Current timer resolution. На всех машинах стоит 1 mc. Причем на всех WIndows 10 измение 

Current timer resolution не сказывается на времени выполнения Sleep(1), а на древнем ноуте, где стоит восьмерка удалось уменьшить время выполнения до 1.5 мс.  

Стал читать в интернете на набрел на статью на habr. Так сказано

Шаг 0: поднимем разрешение до максимального. Начиная с Win10 2004 это разрешение больше не является глобальным так что можно ни в чём себе не отказывать (с другой стороны - если процесс не поднял себе разрешение то оно будет 15.6мс вне зависимости от того что там в "глобальном" параметре).

 Прошу сделать время выполнение Sleep(1)  на Windows 10, последних версий, такой же как и на Windows 8 хотя бы 1-2 мс. Было бы вообще супер, чтобы минимальное время между вызовами OnTimer() также было порядка 1-2 мс, а не как сейчас 16 мс на любой версии Windows 10 и Windows 8. Вот скрипт с помощью которого измерял:

int OnInit()
  {
   EventSetMillisecondTimer(1);
   return INIT_SUCCEEDED;
  }
int  VizovovOnTimer=0;
int  KolichestoVizovov= 100;
ulong Start= GetMicrosecondCount();

void OnTimer()
  {
   VizovovOnTimer++;
   if(  VizovovOnTimer == KolichestoVizovov ) 
     {
      ulong End= GetMicrosecondCount();
      Print("Количество вызово OnTimer ",VizovovOnTimer," Среднее время на вызов OnTimer ",(End-Start)/KolichestoVizovov);

      Start= GetMicrosecondCount();
      for( int i=0;i<KolichestoVizovov;i++)
      Sleep(1);
      End= GetMicrosecondCount();
      Print("Количество вызово Sleep ",VizovovOnTimer," Среднее время на вызов Sleep ",(End-Start)/KolichestoVizovov);  
      ExpertRemove();    
     }     
  }

Статья с habr https://habr.com/ru/post/651237/

И всё-таки, возможен ли 1мс таймер в Windows?
И всё-таки, возможен ли 1мс таймер в Windows?
  • 2022.02.13
  • habr.com
В комментариях к недавней статье оказалось что, во-первых, этот вопрос кому-то да и интересен, и, во-вторых, существует некоторое количество заблуждений на эту тему. Вводные: нам нужен таймер, на Windows, с точностью порядка 1мс, драйвер при этом мы писать не хотим и решения при исполнении которых процессор попытается радикально ускорить...
 
Запустил такой советник.
void OnInit() {}

TaskManager меняет соответствующие значения.

Просьба рассказать, что обозначает каждое значение.


Сам пытаюсь найти решение, как определить, что какой-либо советник живой - запускается OnTick на событие NewTick. Нужно для того, чтобы сразу определять отвалившийся от торговли робот.

 

3521

В цикле заполняю кастомный символ, историческими минутными данными, длиной где-то два с половиной года, с помощью 

CustomRatesUpdate();

В OHLC записываю одинаковое значение,только Open.

На каком-то моменте цикла, заполнение перестаёт работать, это видно по кастомному графику который перестаёт заполнятся. 
Происходит какой-то клинч, и кастомный график мёртвый, никак не реагирует на мышь.
Хотя цикл продолжает успешно  работать до конца. По принту это видно.
Но в историю данные больше не пишутся. После завершения цикла, график так и остаётся безжизненным.
Удаляю из кастом папки записанную корявую тиковую и ohlc историю, перезагружаю терминал, запускаю заново цикл.
Всё то-же самое.

В логе какой-то инвалид с датой (1970.01.01)
Перепроверил заливаемые данные, такая дата у меня в данных отсутствует.

CS      3       18:22:47.017    HistoryCache    'CUSTOM_SYMBOL' invalid container header [0]
CS      3       18:22:47.017    HistoryBase     'CUSTOM_SYMBOL' invalid container (1970.01.01) found (off: 30305, size: 35049, file: 4295032650)


С 

CustomTicksAdd();

тоже какие-то непонятки.
Цикл идёт, а заполнение не происходит.

Просьба исправить.


UPD.
Удаляю кастом папку истории по символу.
Записываю только один Октябрь месяц за 2022 год.
А в папке вакханалия получается.
И кажется многовато для одного месяца заняло места 2022.hcc

h

Файлы:
20221128.log  110 kb
 
pivomoe #:

Есть большие подозрения, что Sleep(1) выполняется на последних версиях Windows 10 строго 16 мс(среднее время).

 

#import "kernel32.dll"
void timeBeginPeriod(uint uPeriod);
void timeEndPeriod(uint uPeriod);
#import

Если установить таймер Windows на 1мс, sleep(1) выполняется чуть меньше 2мс.

А OnTimer() где-то с версии 13хх перестал правильно работать. И никому до этого дела нет. Нужно было выравнивать секундные интервалы с точностью до 1 мс. Пришлось делать "вручную". Благо теперь есть  winapi\sysinfoapi.mqh.

 
synth #:

А OnTimer() где-то с версии 13хх перестал правильно работать. И никому до этого дела нет. Нужно было выравнивать секундные интервалы с точностью до 1 мс. Пришлось делать "вручную". Благо теперь есть  winapi\sysinfoapi.mqh.

Реализовывал выравнивание в виде одной строки.

AccurateTimer
AccurateTimer
  • www.mql5.com
Повышение точности штатного таймера.
 
synth #:
 

Если установить таймер Windows на 1мс, sleep(1) выполняется чуть меньше 2мс.

А OnTimer() где-то с версии 13хх перестал правильно работать. И никому до этого дела нет. Нужно было выравнивать секундные интервалы с точностью до 1 мс. Пришлось делать "вручную". Благо теперь есть  winapi\sysinfoapi.mqh.

   Спасибо. Получилось.

 
fxsaber #:

Сам пытаюсь найти решение, как определить, что какой-либо советник живой - запускается OnTick на событие NewTick. Нужно для того, чтобы сразу определять отвалившийся от торговли робот.

   Можно просто в начале OnTick записывать глобальную переменную терминала время вызова. А потом с помощью другого советника смотреть на графике последние время работы всех советников или выводить Alert если какой нибудь их советников долго не подает признаки жизни. Можно вообще записывать периодически время вызова функций на диск. Синхронизировать папку где лежит файл  с помощью Sync. Таким образом можно получать данные о работе всех терминалов даже из разных локальных сетей.

 
pivomoe #:

   Можно просто в начале OnTick записывать глобальную переменную терминала время вызова. А потом с помощью другого советника смотреть на графике последние время работы всех советников или выводить Alert если какой нибудь их советников долго не подает признаки жизни. Можно вообще записывать периодически время вызова функций на диск. Синхронизировать папку где лежит файл  с помощью Sync. Таким образом можно получать данные о работе всех терминалов даже из разных локальных сетей.

Спасибо, буду думать над оптимальным решением.

 
fxsaber #:

Реализовывал выравнивание ...

На мой взгляд для торговли гораздо полезней абсолютный, а не относительный таймер. Чтоб можно было написать что-то типа OnTimer(ulong time_of_event), где time_of_event - UNIX время в мс. Очень полезно, если данные принимаются с разных площадок.

PS:

Локальное время синхронизирую с серверами ВНИИФТРИ. В рабочее время точность  не хуже +/- 2мс.