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

 
fxsaber:

Неоднократно видел ситуации, когда Терминал грузит CPU на 100% настолько, что ни на что не реагирует.

Потом по логам смотрел, что там дикие пропуски тиков в OnTick. Но если написать грамотно советник, то реально, что на результате торговли такое ужасное обстоятельство не скажется. Специально это анализировал, все четко.

Интересно, насколько распространены механизмы борьбы с задержками в Маркет-продуктах? Ни разу не видел, чтобы говорилось о мощности машины для запуска. Минимальный пинг - это да.

Где вы их пускали?

Если на ВПС за 2-5 долларов, то там запросто задержки в десятки и сотни миллисекунд ловятся в любой мало-мальски серьезной WinAPI функции. Тормозит все начиная с уровня гипервизора, превращая виртуалку в слайд-шоу.

Объяснение выше дал.

 
Renat Fatkhullin:

Это не GetMicrosecondsCount тормозит, а операционка квантует CPU ресурсы для любого потока вашей придушенной впски. Для любой функции, любого действия, любой программы внутри вашей ВПС.

Ну не может никакой CPU шедулер нарезать честно и распределить ресурсы, когда у него 20 (это еще по божески) операционок по 1500 потоков выполнения в каждой копии. Возьмите 8-16 ядер и распределите их на 20 * 1 500 = 30 000 (тридцать тысяч физических тредов).

В моем случае (виртуал-бокс с вин7 + 2 ядра + 16 Гб ОЗУ на полностью своей железке, где больше ничего не крутится), откуда периодические 2-3 мкс?

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

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

Andrey Khatimlianskii, 2020.10.05 10:19

Не совсем ВПС, но виртуалка на арендованной железяке:

2020.09.29 00:11:11.350 Terminal        MetaTrader 5 x64 build 2615 started for MetaQuotes Software Corp.
2020.09.29 00:11:11.352 Terminal        Windows 7 Service Pack 1 build 7601 on Virtual Box, Intel Core i7-4770  @ 3.40GHz, 14 / 15 Gb memory, 4 / 31 Gb disk, IE 11, Admin, GMT+2
2020.10.05 11:11:25.340 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:11:31.308 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:12:34.699 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 3 mсs.
2020.10.05 11:13:04.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:13:58.116 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:08.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:14.975 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:19.095 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:28.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:55.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:56.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:27.818 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 9 mсs.
2020.10.05 11:16:35.275 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:45.775 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 27 mсs.
2020.10.05 11:16:51.715 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:17:30.477 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 5 mсs.
2020.10.05 11:18:25.081 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.

 
Andrey Khatimlianskii:

В моем случае (виртуал-бокс с вин7 + 2 ядра + 16 Гб ОЗУ на полностью своей железке, где больше ничего не крутится), откуда периодические 2-3 мкс?

Такова цена двойной виртуализации.

Тем более, что VirtualBox не является полноценным гипервизором типа Hyper-V, а живет поверх вашей текущей десктопной операционки (Windows 7 к тому же?), у которой CPU шедулер заточен под другой кейс использования.

То есть, у вас:   Windows 7/10 -> VirtualBox -> Windows 7.  По сути, два уровня виртуализации, причем первый не знает чаяний VirtualBox, считая его просто обычной программой. Распределение CPU ресурсов(шедулер потоков) явно ни к черту.

А должно быть: Hyper-V 2016/2019 -> Windows 2016/2019

 
Renat Fatkhullin:

Это не GetMicrosecondsCount тормозит, а операционка квантует CPU ресурсы для любого потока вашей придушенной впски. Для любой функции, любого действия, любой программы внутри вашей ВПС.

Думаю, вас заставит задуматься такой аргумент. Советник.

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

// Сделал действия по этой ссылке: https://www.mql5.com/ru/forum/342090/page41#comment_18597040

void OnStart()
{
  _BV(
  for (int i = 0; i < 1e6; i++)
    GetMicrosecondCount();
      , 1)
      
  _BV(
  for (int i = 0; i < 1e6; i++)
    GetTickCount();
      , 1)      
}



2020.10.06 00:24:26.779 Alert: Time[Test6.mq5 52: for(inti=0;i<1e6;i++)GetMicrosecondCount();] = 16289902 mсs.
2020.10.06 00:24:26.784 Alert: Time[Test6.mq5 57: for(inti=0;i<1e6;i++)GetTickCount();] = 4300 mсs.


Так что далеко не все тормозит. Поэтому и смог довольно безобидно перейти на winmm::timeBeginPeriod(1)+winmm::timeGetTime(), получив скорость, как GetTickCount, но при этом без ужасного ограничения в 16 мс. Однако, Маркет-продукам такой путь заказан, т.к. DLL. Вряд ли будете делать миллисекундный штатный вариант.

 
Renat Fatkhullin:

MQL5 функция минимизации всех окон и самого приложения - это отличная идея. Проработаем.

Тут еще такое дело.

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

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

fxsaber, 2020.10.02 23:01

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

Но при этом, если человек пускает самостоятельно терминал на VPS, то тут он сильно будет против того, что у него все резко свернется. Он сам может и должен сворачивать окна, если уходит с RDP сессии.

Делаю сейчас через WinAPI сворачивание по горячей клавише. Очень удобно и куда безобиднее штатной TerminalClose.
 
Renat Fatkhullin:


Вот пример того, о чём я хотел сказать.
Оба сервера разных брокеров, находятся в одном районе, могут и в одной локации находится.
Сервис карта предлагает для AMP, разместится в UK.
А для Just почему то предлагает в NL.
Почему? Если есть впс ближе.

dfgh

jt

 
fxsaber:

Думаю, вас заставит задуматься такой аргумент. Советник.


Так что далеко не все тормозит. Поэтому и смог довольно безобидно перейти на winmm::timeBeginPeriod(1)+winmm::timeGetTime(), получив скорость, как GetTickCount, но при этом без ужасного ограничения в 16 мс. Однако, Маркет-продукам такой путь заказан, т.к. DLL. Вряд ли будете делать миллисекундный штатный вариант.

Ну вы мастер гонять стресс-тесты без контроля соотносимости и резонности.

Конечно микросекундный замер требует ресурсов, чтобы можно было замерять промежутки в 1000 раз меньше миллисекунды.

Если вам периодически требуется замерять промежутки сверх точно, то используйте микросекунды. И стоить это будет вам 0 микросекунд.

Если же вы настроены вызывать миллионы раз самозамер, то скорее всего вы занимаетесь самообманом.


На придушенном VPS разгонять системный таймер через timeBeginPeriod чревато. Вы просто наоборот повысите затраты CPU:

This function affects a global Windows setting. Windows uses the lowest value (that is, highest resolution) requested by any process. Setting a higher resolution can improve the accuracy of time-out intervals in wait functions. However, it can also reduce overall system performance, because the thread scheduler switches tasks more often. High resolutions can also prevent the CPU power management system from entering power-saving modes. Setting a higher resolution does not improve the accuracy of the high-resolution performance counter.

Иначе давно бы в операционке сделали точные GetTickCount/GetTickCount64 и радовались бесплатной точностью. Но нет, за точность этого таймера придется заплатить.

 
Просьба устранить тормоза CHART_IS_MAXIMIZED. Сейчас WinAPI решение не порядок быстрее штатного.
 
Roman:

Вот пример того, о чём я хотел сказать.
Оба сервера разных брокеров, находятся в одном районе, могут и в одной локации находится.
Сервис карта предлагает для AMP, разместится в UK.
А для Just почему то предлагает в NL.
Почему? Если есть впс ближе.

Мы знаем геоточки своих серверов, а вот позиции брокерских серверов строим из GeoIP баз.

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

Будем завтра детальнее разбираться, так как надо вручную все перепроверять и пересканировать, чтобы ответить на вопрос.

 
Renat Fatkhullin:

Такова цена двойной виртуализации.

Тем более, что VirtualBox не является полноценным гипервизором типа Hyper-V, а живет поверх вашей текущей десктопной операционки (Windows 7 к тому же?), у которой CPU шедулер заточен под другой кейс использования.

То есть, у вас:   Windows 7/10 -> VirtualBox -> Windows 7.  По сути, два уровня виртуализации, причем первый не знает чаяний VirtualBox, считая его просто обычной программой. Распределение CPU ресурсов(шедулер потоков) явно ни к черту.

А должно быть: Hyper-V 2016/2019 -> Windows 2016/2019

Нет, у меня на ЦентОС виртуалки крутятся. Но я не компетентен продолжать этот диалог.

Причина обращения: