Новая версия платформы MetaTrader 5 build 4380: улучшения в работе - страница 3

 

Посмотрите, Алексей, на этот скриншот. Толстая линия слева от шкалы цен отсутствует

Вы хотите рассмотреть подробно, что там творится. Но !  Двиная мышью при нажатой левой кнопке по шкале цен Вы можете лишь уменьшить

или вернуть к прежнему размеру

А теперь в свойствах графика на вкладке Общие включите фиксированный масштаб


Удалось увеличить масштаб по вертикали.Видите толстую полоску? Понятно, что она означает? Можно заглянуть выше и ниже графика

Зачем? Там у меня отложки и графические построения. Видеть их = значит чувствовать рынок. Учитесь ! ! !

 

b4390, ArrayResize без увеличения количества элементов и отказом от зарезервированного куска памяти занимается физическим перераспределением памяти.

void OnStart()
{
  MqlTick Ticks[];
  
  const ulong StartTime1 = GetMicrosecondCount();
  ArrayResize(Ticks, 1, 1e7); // Выделилось (1 + 1e7) * sizeof(MqlTick) байтов. Количество элементов = 1.
  Print(GetMicrosecondCount() - StartTime1); // 13
  Print(MQLInfoInteger(MQL_MEMORY_USED)); // 573

  const ulong StartTime2 = GetMicrosecondCount();
  ArrayResize(Ticks, 1e7 + 1); // Физического перераспределения памяти не произошло.Количество элементов = (1 + 1e7).
  Print(GetMicrosecondCount() - StartTime2); // 0 - бесплатно.
  Print(MQLInfoInteger(MQL_MEMORY_USED)); // 573

  const ulong StartTime3 = GetMicrosecondCount();
  ArrayResize(Ticks, 1e7 + 2, 1e7); // Выделилось ЕЩЕ (2 + 1e7 * 2) * sizeof(MqlTick) - байтов. Количество элементов = (1e7 + 2).
                                    // Скопировались значения (1 + 1e7)-элементов и освободилось (1 + 1e7) * sizeof(MqlTick) байтов.
  Print(GetMicrosecondCount() - StartTime3); // 259527 - дорого: выделение(1%) + копирование(99%).
  Print(MQLInfoInteger(MQL_MEMORY_USED)); // 1145

  const ulong StartTime4 = GetMicrosecondCount();
  ArrayResize(Ticks, 1e7 + 2, -1); // Выделилось ЕЩЕ (2 + 1e7) * sizeof(MqlTick) - байтов.
                                   // Скопировались значения (2 + 1e7)-элементов и освободилось (2 + 1e7 * 2) * sizeof(MqlTick) байтов.
  Print(GetMicrosecondCount() - StartTime4); // 235230 - дорого: выделение(1%) + копирование(99%).
  Print(MQLInfoInteger(MQL_MEMORY_USED)); // 573

  
  const ulong StartTime5 = GetMicrosecondCount();
  MqlTick Ticks2[];
  
  // Альтернатива ArrayResize(Ticks, 1e7 + 2, -1).
  ArrayCopy(Ticks2, Ticks); // Выделилось ЕЩЕ (2 + 1e7) * sizeof(MqlTick) - байтов. Количество элементов = (1e7 + 2).
  ArraySwap(Ticks, Ticks2); // Скопировались значения (2 + 1e7)-элементов                            
  ArrayFree(Ticks2);        // и освободилось (2 + 1e7) * sizeof(MqlTick) байтов.
    
  Print(GetMicrosecondCount() - StartTime5); // 214611 - дорого: выделение(1%) + копирование(99%). 
  Print(MQLInfoInteger(MQL_MEMORY_USED)); // 573
}


Просьба при отказе от резерва делать это бесплатно. Сейчас, например, если массив занимает 40% + 20%(reserve) RAM, то отказаться от reserve-части невозможно - нехватка памяти.

Строка для поиска: Uluchshenie 092.
 
  1. MetaTrader 5 Web Terminal
  1. Исправлена ошибка в работе панели быстрой торговли на графике.
  2. Исправлен диалог предупреждения, открываемый при включении панели быстрой торговли на графике.

Можно ещё добавить в веб-терминал расширение Фибоначчи?

 
В версии 4380, в тестере невозможно получить доступ к фибо-сетке через окно объектов. Доступ к трендовой линии нормальный. Исправьте, пожалуйста.
 

Билд 4392

Эту ошибку так и не исправили.

Поясню действия. Использую ресурсный индикатор, который копирует в свой единственный в буфер значение time[] из OnCalculate. Другой индикатор на каждом новом баре вызывает этот ресурсный индикатор по старшему ТФ.

Т.е. запускаю индикатор на графике М1 и прописываю как параметр для ресурсного индикатора: ТФ = М2.

Ниже табличка, какое время ожидаю и какое получаю, при появлении нового бара:

Т.е. на первом тике в 12:20 и в 12:22 я ожидаю, что ресурсный индикатор вернет time[] с такими же значениями, т.к. тут совпадение кратности ТФ, но происходит запаздывание. К слову,функция  iTime(M2) возвращает все верно. Получается между iTime и CopyBuffer есть такое вот несоответствие.

Во вложении скрин с записями из журнала.


Файлы:
NewElderBar.png  179 kb
 
Vasiliy Pushkaryov #:

Получается между iTime и CopyBuffer есть такое вот несоответствие.

Скорее всего, это связано с очередью выполнения индикаторов.

Нулевой индикатор - график, поэтому в любом индикаторе iTime возвращает актуальное значение.

Дальше начинают вызываться по очереди индикаторы. И в "матрешке" индикаторов сначала вызывается внешний контур (master), затем - внутренние (slaves).

Это архитектурная особенность MT5.

 
fxsaber #:

Это архитектурная особенность MT5.

Жаль, если это так и задумано для МТ5. Глобально ведь время (и куча других данных) уже изменилось, а CopyBuffer() не получает этих свежих данных с других ТФ.

В МТ4 подобный код по iCustom() из ресурсного индикатора получает на первом тике уже отовсюду обновленную информацию. Получается преимущество в обработке такого типа данных в целый тик. Как-то странно.

 
Vasiliy Pushkaryov #:

Билд 4392

Эту ошибку так и не исправили.

Поясню действия. Использую ресурсный индикатор, который копирует в свой единственный в буфер значение time[] из OnCalculate. Другой индикатор на каждом новом баре вызывает этот ресурсный индикатор по старшему ТФ.

Т.е. запускаю индикатор на графике М1 и прописываю как параметр для ресурсного индикатора: ТФ = М2.

Ниже табличка, какое время ожидаю и какое получаю, при появлении нового бара:

Т.е. на первом тике в 12:20 и в 12:22 я ожидаю, что ресурсный индикатор вернет time[] с такими же значениями, т.к. тут совпадение кратности ТФ, но происходит запаздывание. К слову,функция  iTime(M2) возвращает все верно. Получается между iTime и CopyBuffer есть такое вот несоответствие.

Во вложении скрин с записями из журнала.


Новый бар на М2 должен видеть не текущий индикатор, а ресурсный. То-есть впишите в ресурсный индикатор новый бар по TF M2 и в это время заполнение буфера.

2024.06.19 20:14:05.511 Test_MTF.ex5::test-R (EURUSD,M1)         ***** Test-R 2024.06.19 20:14:00
2024.06.19 20:16:00.928 Test_MTF.ex5::test-R (EURUSD,M1)         ***** Test-R 2024.06.19 20:16:00
2024.06.19 20:18:00.950 Test_MTF.ex5::test-R (EURUSD,M1)         ***** Test-R 2024.06.19 20:18:00
2024.06.19 20:20:07.762 Test_MTF.ex5::test-R (EURUSD,M1)         ***** Test-R 2024.06.19 20:20:00
2024.06.19 20:22:11.995 Test_MTF.ex5::test-R (EURUSD,M1)         ***** Test-R 2024.06.19 20:22:00
 
Alexey Viktorov #:

Новый бар на М2 должен видеть не текущий индикатор, а ресурсный. То-есть впишите в ресурсный индикатор новый бар по TF M2 и в это время заполнение буфера.

Тогда у МТ4 есть преимущество. Он видит новые бары старших ТФ через ресурсные (и кастомные) индикаторы и успевает получить на первом тике обновленные данные по другому ТФ. Я ведь время привел для простоты и наглядности, у меня посложнее расчеты в ресурсном индикаторе. Да, расчеты в МТ5 в кастомном индикаторе производятся на первом тике, но я не могу получить результаты расчетов через CopyBuffer() на данном тике. Меня это удивляет, ведь многие MTF-индикаторы строятся на анализе первого тика нового бара. Показалось, что это "поломка", поэтому написал.
 
Vasiliy Pushkaryov #:
Тогда у МТ4 есть преимущество. Он видит новые бары старших ТФ через ресурсные (и кастомные) индикаторы и успевает получить на первом тике обновленные данные по другому ТФ. Я ведь время привел для простоты и наглядности, у меня посложнее расчеты в ресурсном индикаторе. Да, расчеты в МТ5 в кастомном индикаторе производятся на первом тике, но я не могу получить результаты расчетов через CopyBuffer() на данном тике. Меня это удивляет, ведь многие MTF-индикаторы строятся на анализе первого тика нового бара. Показалось, что это "поломка", поэтому написал.

А как вы думаете на каком тике вторая и третья запись в предоставленной распечатке предыдущего сообщения? То, что распечатка в +5, +7 и даже +11 секунд не говорит о том, что это второй или даже третий тик… И это конечно сделано с применением ресурсного индикатора и конечно-же через CopyBuffer(). Сделано это очень небрежно, черновой вариант, поэтому не выкладываю. А разработчики молчат только потому, что разбираться в логике ваших задумок никому нет желания.