Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 62

 
Nikolai Semko :
Чтение с жесткого диска (Не SSD) 1 Гбайта за 4 секунды!? Какой-то очень крутой диск.

В самом деле ? Я думал, что это было медленно (мне нужно прочитать 250 миллионов тиков: -D).

Сколько у вас есть ?

EDIT: Кстати, это не 1 ГБ / 4 секунды. Отображаемая память представляет собой размер массива в mql, а не размер данных, читаемых на жестком диске (они сильно сжаты на диске, всего ~ 6/7 байт за 1 тик)

 
Alain Verleyen:

EDIT: Кстати, это не 1 ГБ / 4 секунды. Отображаемая память представляет собой размер массива в mql, а не размер данных, читаемых на жестком диске (они сильно сжаты на диске, всего ~ 6/7 байт за 1 тик)

Да, я уже понял и дополнил свое последнее сообщение. 
 
fxsaber:

Это и есть канвас. Просто в канвас Вы только пишите, а мне еще нужно читать.

Делал через RAM-диск. Замеров не делал. Как только MT4-ресурсы починили, перешел на них, т.к. внутри Терминала все.

Ведь, действительно,  если упаковывать тики при передаче и распаковывать при приёме,  можно пропускную  способность увеличить на порядок. Это же гораздо вкуснее.
 
Nikolai Semko:
Все равно я ожидал бы 1-2 мега mqltick в секунду даже при r/w, т.е. на порядок быстрее. 
Какого размера блоки передаются?
Received  433556 ticks: 2018.11.30 18:28:01 - 2018.12.07 00:32:10, TransferTime = 3689ms. (117518 ticks/sec)
Nikolai Semko:
Ведь, действительно,  если упаковывать тики при передаче и распаковывать при приёме,  можно пропускную  способность увеличить на порядок. Это же гораздо вкуснее.

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

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

fxsaber, 2018.12.06 21:41

Лаг не сильно зависит от количества данных. Я бы не очень рекомендовал этот канал передачи данных, если нужна скорость.

Лог выше из HistoryTicks. Время трансфера

  • из советника отправил флаг-запрос в глобальную переменную.
  • индикатор поймал этот флаг и отправил свои тики в ресурс.
  • Советник обнаружил, что ресурс не пустой и получил данные из него.
Вот эти три пункта и есть TransferTime. Все исходники доступны.


 
Alain Verleyen:
MqlTick - 60 байт.

Не всегда

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

Бета-версия платформы MetaTrader 4 build 1145

fxsaber, 2018.12.06 10:29

Просьба исправить для совместимости двух платформ
void OnStart()
{
  MqlTick Tick;
  
  Tick.volume_real = 0; // 'volume_real' - struct member undefined
}
 
Andrey Khatimlianskii:

Пустой МТ5 1957 с 3 графиками без индикаторов и советников кушает 4-6% процессора.

Раньше столько потреблял мультивалютный индикатор, получающий на каждом тике информацию по 50 инструментам.

Renat Fatkhullin:

Дайте больше информации, пожалуйста:

  1. какие именно графики: символы, типы, кастомные/формульные ли
  2. какая глубина в барах
  3. сколько объектов на графиках
  4. сколько символов в обзоре рынка
  5. находится ли терминал в фазе подкачек, синхронизации, фоновой перекомпиляции программ или перестроения истории

Проверка на 4 графиках с миллионами М1 баров показала 0% нагрузку.

Можете воспроизвести ситуацию?

Andrey Khatimlianskii:

Сейчас не воспроизводится.



  MetaTrader 5 x64 build 1958
  Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i7-4720HQ  @ 2.60GHz
, Memory: 10647 / 16311 Mb, Disk: 317 / 463 Gb, GMT+3    Всегда всё обновляю. Всё лицензия.


5 терминалов. Один девственный.

Демо-счета, alpari и MetaQuotes, один alpari заброшенный реал.


Везде:

-- обзор рынка:  28 основных кроссов.

-- по 4 случайных символа/графика. М1.

-- макс. баров в окне - 1000. В основном   2018.

-- на графиках нет объектов, советников, скриптов, индикаторов (кроме дефолтного терминала, там профиль, который после установки mt).

-- не обращаю внимания на всплески нагрузки на CPU в начале запуска терминала, а также

      в моменты лихорадки котировок.



Час ночи:

12


3



        Renat Fatkhullin,  ПОЧЕМУ?

 
Замер скорости
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

const RESOURCEDATA<MqlTick> Resource("::" + __FILE__); // Ресурс для передачи данных (тики)
MqlTick TicksIn[];
const int Init = ArrayResize(TicksIn, 1000000);

void TestResource()
{
  MqlTick TicksOut[];

  Resource = TicksIn;
  Print(Resource.Get(TicksOut));
}

void OnStart()
{
  BENCH(TestResource());
}


Результат

1000000
Time[TestResource()] = 4203287


Предполагаю, что тормозит моя реализация.

ЗЫ Профилирование подтвердило, тормозит мой код.
 
fxsaber:
ЗЫ Профилирование подтвердило, тормозит мой код.

Попробовал ускорить, но получил

code generation error           1       1
1 error(s), 0 warning(s)                2       1

Оставил затею.

 
fxsaber :

Не всегда

Это тема MT5, и, честно говоря, меня не волнует "совместимости двух платформ" :-D
 
fxsaber:

Лог выше из HistoryTicks. Время трансфера

  • из советника отправил флаг-запрос в глобальную переменную.
  • индикатор поймал этот флаг и отправил свои тики в ресурс.
  • Советник обнаружил, что ресурс не пустой и получил данные из него.
Вот эти три пункта и есть TransferTime. Все исходники доступны.


fxsaber:
Замер скорости


Результат


Предполагаю, что тормозит моя реализация.

ЗЫ Профилирование подтвердило, тормозит мой код.

Код Ваш, я, конечно, не изучал. На меня наводят ужас эти бесконечные инклудники и вложенность классов(я конечно люблю классы, но не до такой степени).

Но смущает меня размер массива в 433556 тиков ( это в байтах 26 Mb). Возможно в этом причина или одна из причин тормозов. Ренат как-то говорил о влиянии кэшов процессора на производительность больших и малых массивов и я очень четко прочувствовал всю тормознутость на массивах в несколько мегабайт, когда массив превышает кэш процессора.
Поэтому, считаю, что нужно производить передачу более мелкими пакетами (например по 10 Килотиков), и лучше в упакованном виде. Более того не только передачу производить в упакованном формате, но и хранение в массиве - получателе, а распаковывать по мере необходимости тоже по несколько тысяч тиков. Когда имеешь дело с массивами таких объемов, это архиважно - оптимизировать работу с массивами и следить за непревышением рабочего массива кэша процессора. Думаю, выигрыш в скорости может достигать в несколько десятков раз при грамотной организации работы с массивами.

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