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

 
Roman:

Хорошо, перефразирую. В рамках mql примерно возможен, в зависимости от тактовой частоты процессора. 
А как же ШИМ? - импульсный сигнал постоянной частоты и переменной скважности.
Он не задаёт постоянство?

Для начала почитайте, что такое функция WinAPI Sleep, и что она реально делает

PS Windows не является системой реального времени

 
Slava:

Для начала почитайте, что такое функция WinAPI Sleep, и что она реально делает

PS Windows не является системой реального времени

Кхм, стесняюсь спросить, причём тут WinAPI Sleep?
Когда у нас речь за микросекундный слип
Индивидуально, под свой процессор можно определить частоту таймера и рассчитать количество повторений.
То есть на mql можно написать свой MicrosecondCount, но смысл? Стандартного хватает.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

Кхм, стесняюсь спросить, причём тут WinAPI Sleep?
Когда у нас речь за микросекундный слип
Индивидуально, под свой процессор можно определить частоту таймера и рассчитать количество повторений.
То есть на mql можно написать свой MicrosecondCount, но смысл? Стандартного хватает.

Свой ожидающий слип без переключения контекста сьест свое ядро на 100%.

Это жуткий метод программирования. Не дай бог такой код просочится в маркет.

 
Renat Fatkhullin:

Свой ожидающий слип без переключения контекста сьест свое ядро на 100%.

Это жуткий метод программирования. Не дай бог такой код просочится в маркет.

А не кто не отрицал, что хардкор  ))
Если покажите пример переключения контекста, может получится улучшить?

Вот загрузка процессора для µsSLEEP(µsRange), на VirtualBox где выделено всего 2 ядра, 4 потока.
Майнеры похлеще жгут ))

cp

 

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

Библиотеки: Sequence

fxsaber, 2020.10.13 12:54

Пример советника, который убьет большинство VPS.
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

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

input datetime inFrom = D'2020.09.01'; // С какой даты анализировать историю

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


Запускаем его на нескольких чартах разных символов. Для автоматизации сего действия использовал этот скрипт с inAmount = 5.


Результат.

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

Больше 4 Gb памяти потребовал Терминал для запуска этих шести советников. Заметьте, это нужно только для инициализации, но не для работы этих советников. Представьте, что запускаете Терминал с висящими советниками в нем. Если нет честных свободных 4 Gb RAM - почти катастрофа.


Теперь уберем комментарий этой строки в исходнике.

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

Тем самым включив последовательную инициализацию советников.


Смотрим на результат (после перекомпиляции).

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


На запуске советников удалось уменьшить потребление памяти Терминалом более, чем на 2.5 Gb. Вероятность VPS-катастрофы (и слабых домашних машин) значительно уменьшилась.


Вот так оба запуска выглядят в динамике.

Последовательный запуск растянул общую инициализации по времени, но сумел удержать Терминал от огромного потребления ОЗУ.


На верхнем и нижнем графиках хорошо виден процесс параллельной инициализации(левый высокий пик) и шести последовательных инициализаций (шесть средних пиков).


ЗЫ Во время экспериментов выявился неприятный нюанс со Sleep - см. исходник.


Прошу как-то разрешить насильно освобождать память после использования CopyTicks. Чтобы не создавать вот такие Sleep-костыли.

 
Прошу порекомендовать самый дешевый по потреблению памяти способ запроса истории тиков на заданном интервале.
 
fxsaber:
Прошу порекомендовать самый дешевый по потреблению памяти способ запроса истории тиков на заданном интервале.

по моему Вы ищете не дешевый, а способ быстро освобождать память

как вариант проверить:

 - обернуть в класс динамический массив MqlTick Ticks[]    и обьект создавать через new ( т.е. тоже динамический обьект ), удалять когда не нужен

- то же самое, но со структурой, но в локальной области видимости ( или функция или локальный блок {  }  - или цикл с одной итерацией ? ), структуры  не так работают как классы - переписал большую часть кода своего ЕА уйдя от классов и заменив их структурами данных, ощутимо возросла скорость оптимизации - может субьективно - может новые билды быстрее  работают

- попробовать добавить в деструктор ArrayFree()

 
Igor Makanu:

по моему Вы ищете не дешевый, а способ быстро освобождать память

Не освобождает Терминал память. MQL-переменные не при чем.

 
fxsaber:

Не освобождает Терминал память. MQL-переменные не при чем.

а если принудительно размер задать = 1  ?

а если сделать^

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

а если

После вызова CopyTicks Терминал несколько секунд держит все данные в памяти. На тот случай, если кто-то захочет повторно кусок тиковой истории прочесть.

Т.е. количество так потребляемой Терминалом памяти никак не зависит от размеров MQL-переменных.


Задача заставить Терминал принудительно освободить память.