Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления

 

В пятницу 16 декабря 2022 года будет выпущена обновленная версия платформы MetaTrader 5. Обновление содержит следующие изменения:

MetaTrader 5 Client Terminal build 3550

  1. Terminal: Обновлены переводы пользовательского интерфейса.
  2. Исправления по крешлогам.

MetaTrader 5 Web Terminal build 3550

Обновление будет доступно через систему Live Update.

 
fxsaber #:

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

И тут такой БАГ!

Два одинаковых тикета в истории. Чтобы исключить GUI-ошибку, запускаю скрипт вывода последних тиков.

2283119237 != 2283119327

true

 
trader6_1 #:

2283119237 != 2283119327

true

Спасибо, надо спать.

 
Просьба обратить внимание разработчиков на проблему. Давно замечал странные перерисовывания индикаторов. Возможная проблема в спонтанном обнулении  prev_calculated при выполнении некоторых функций.

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

Нужна помощь с iBarShift.

Nikolai Semko, 2022.12.21 16:48

На самом деле проблема существует. Пока не могу понять источник.
Проблема в том, что в данном индикаторе, если использовать штатный iBarShift, то prev_calculated постоянно обнуляется, хотя это должно происходить только при первом запуске. 
Если использовать мой старый вариант fBarShift, то обнуления  prev_calculated не происходит.
Пока не могу понять, почему так происходит. Возможно Лилита права и что-то реально поломалось. 
Тем более я уже не однократно замечал какие-то странные мигания (перерисовывания) индикаторов в последнее время. Думаю, реально что-то поломали, но вряд ли проблема с  iBarShift. Проблема сидит где-то в другом месте MT5.



 



 
Nikolai Semko #:
Просьба обратить внимание разработчиков на проблему. Давно замечал странные перерисовывания индикаторов. Возможная проблема в спонтанном обнулении  prev_calculated при выполнении некоторых функций.


Давно обращал внимание на мигание, например, уровневых индикаторов. Мигает до тех пор, пока не загрузятся все бары на графике. Возможное решение - не давать рисовать линии, пока всё не загрузится, но тогда некоторые будут думать, что индикатор не работает. Тогда конечно можно выводить надпись "Loading". И всё же, решение на уровне терминала было бы логичнее. А также скорость перерисовки линий/прямоугольников с привязкой к X/Y тоже происходит с некоторым дёрганьем.

Итог, МТ5 затачивается под автоторговлю, но под работу с индикаторами пока что быстрее МТ4, хоть и не без изъянов. Да, да, всё понимаю, 21 век на дворе, все трейдеры уже в МТ5... но не точно

 
Nikolai Semko #:
Просьба обратить внимание разработчиков на проблему. Давно замечал странные перерисовывания индикаторов. Возможная проблема в спонтанном обнулении  prev_calculated при выполнении некоторых функций.


Ой, нет, прошу прощения.
Поспешил, не углубился в код другого разработчика. 
там у нее в OnCalculate в трех местах стоит return(0)

 
Nikolai Semko #:

Ой, нет, прошу прощения.
Поспешил, не углубился в код другого разработчика
там у нее в OnCalculate в трех местах стоит return(0)

но все равно проблема существует. 
Почему в данном индикаторе стандартный iBarShift(NULL,_Period,time[rates_total-1]) возвращает -1, тогда как моя функция  fBarShift возвращает 0, как и должно быть?
В другом индикаторе пока не могу это воспроизвести.

2022.12.21 14:08:21.545 ATRCustom (USDCHF,H1)   PERIOD_H2 / BarShift: -1
2022.12.21 14:08:21.545 ATRCustom (USDCHF,H1)   iBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = -1
2022.12.21 14:08:21.545 ATRCustom (USDCHF,H1)   fBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = 0
2022.12.21 14:08:24.049 ATRCustom (USDCHF,H1)   PERIOD_H2 / BarShift: -1
2022.12.21 14:08:24.049 ATRCustom (USDCHF,H1)   iBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = -1
2022.12.21 14:08:24.049 ATRCustom (USDCHF,H1)   fBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = 0
2022.12.21 14:08:24.157 ATRCustom (USDCHF,H1)   PERIOD_H2 / BarShift: -1
2022.12.21 14:08:24.157 ATRCustom (USDCHF,H1)   iBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = -1
2022.12.21 14:08:24.157 ATRCustom (USDCHF,H1)   fBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = 0
Файлы:
ATRCustom.mq5  21 kb
 
Nikolai Semko #:

но все равно проблема существует. 
Почему в данном индикаторе стандартный iBarShift(NULL,_Period,time[rates_total-1]) возвращает -1, тогда как моя функция  fBarShift возвращает 0, как и должно быть?
В другом индикаторе пока не могу это воспроизвести.

Да - это явный баг. 
Если запустить такой индикатор:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int shift = iBarShift(NULL,PERIOD_H2,time[rates_total-1]);
   Print("BarShift = " + string(shift));
   return(rates_total);
  }

то будет выводить:

2022.12.21 21:00:57.331 Bug_iBarShift (EURUSD,M1)       BarShift = 0
2022.12.21 21:00:59.344 Bug_iBarShift (EURUSD,M1)       BarShift = 0
2022.12.21 21:01:01.231 Bug_iBarShift (EURUSD,M1)       BarShift = 0
2022.12.21 21:01:02.760 Bug_iBarShift (EURUSD,M1)       BarShift = 0
2022.12.21 21:01:02.922 Bug_iBarShift (EURUSD,M1)       BarShift = 0
2022.12.21 21:01:07.069 Bug_iBarShift (EURUSD,M1)       BarShift = 0
2022.12.21 21:01:10.444 Bug_iBarShift (EURUSD,M1)       BarShift = 0

как и должно быть.
Но если в этом же окне или же в другом окне с тем же символом и ТФ запусть индикатор ATRCustom (см. выше), то каждый тик уже выдает следующее:

2022.12.21 21:07:13.386 Bug_iBarShift (EURUSD,M1)       BarShift = -1
2022.12.21 21:07:13.673 Bug_iBarShift (EURUSD,M1)       BarShift = -1
2022.12.21 21:07:19.722 Bug_iBarShift (EURUSD,M1)       BarShift = -1
2022.12.21 21:07:20.827 Bug_iBarShift (EURUSD,M1)       BarShift = -1

думаю проблема такая будет не только  с iBarShift. Проблема более глубокая.
Причем не важно - indicator_separate_window или indicator_chart_window

 

Уважаемые разработчики, обратите внимание на путаницу с шаблонными типами (b3552):

class A {};

template <typename T>
class X  {};


template <typename T>
void fun1(X<T*> & p)
  {
   Print(__FUNCSIG__);         // void fun1<A*>(X<A*>&)
   T* tmp = NULL;
   //tmp = (T*)NULL;           //   при компиляции этой строки ошибка:
      //'*' - pointer to pointer is illegal
      //    in template 'void fun1(X<T*>&)' specified with [T=A*]
  }

void OnStart()
  {
   X<A*> a;
   fun1(a);
  }

При вызове fun1() c аргументом типа X<A*> ожидался тип шаблона T=A; 

но, судя по результату FUNCSIG  и ошибке компилятора к строке "tmp = (T*)NULL;", фактический  T=A*.

При этом почему-то   T* tmp=NULL компилируется без ошибок.

 

В системной либе есть такой метод в классе HashMap:


//+------------------------------------------------------------------+
//| Copies a range of elements from the map to a compatible          |
//| one-dimensional array.                                           |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
int CHashMap::CopyTo(CKeyValuePair<TKey,TValue>*&dst_array[],const int dst_start=0)
  {
//--- resize array
   if(dst_start+m_count>ArraySize(dst_array))
      ArrayResize(dst_array,dst_start+m_count);

Мне кажется он должен выглядеть вот так:

//+------------------------------------------------------------------+
//| Copies a range of elements from the map to a compatible          |
//| one-dimensional array.                                           |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
int CHashMap::CopyTo(CKeyValuePair<TKey,TValue>*&dst_array[],const int dst_start=0)
  {
//--- resize array
   if(dst_start+m_count-m_free_count>ArraySize(dst_array))
      ArrayResize(dst_array,dst_start+m_count-m_free_count);

В противном случае, если были вызовы метода Remove, метод CopyTo выдает массив большего размера, чем метод Count()

 
Уважаемые разработчики MQL может быть уже появилась время/возможность сделать доступной в тестере любую глубину истории, а не только за текущий год и предыдущий??Для МО надо анализировать несколько лет истории. Хотя бы для локального ПК и локальной сети. Видимо это ограничение для экономии траффика в облачных вычислениях.