Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - страница 25

 

Столкнулся сегодня с такой штукой.

Лэнгвидж установлен в инглиш.

Версия 5226.


 
Поставьте английскую Windows
 
Rashid Umarov #:
Поставьте английскую Windows
😊👍
 
Vitaliy Davydov #:

Столкнулся сегодня с такой штукой.

Лэнгвидж установлен в инглиш.

Версия 5226.


это всегда так было.

 
Rashid Umarov #:
Поставьте английскую Windows

Маленькое уточнение, что уже сравнительно давно все версии Windows за исключением редких, которые особо помечены как Single Language, позволяют добавлять и менять язык системного интерфейса через настройки. Но в любом случае, вряд ли это то, чего хотел автор вопроса ;-).

 

Проверьте пожалуйста у себя - вот такой тестовый минимальный индикатор роняет МТ5 без всяких сообщений и логов:

#property indicator_chart_window

input group "···  SETUP AND WORKING MODES"
input string s = "";

int OnInit()
{
  const string shortname = StringFormat("rnd%d", MathRand());
  IndicatorSetString(INDICATOR_SHORTNAME, shortname);
  const int h = ChartIndicatorGet(0, 0, shortname);
  
  MqlParam parameters[];
  ENUM_INDICATOR type;
  if(IndicatorParameters(h, type, parameters) > 0)
     ArrayPrint(parameters);                        // <-- MT5 crashes silently
  IndicatorRelease(h);
  
  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[])
{
   return rates_total;
}

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

ЗЫ. Кстати, после этого невозможно отлаживаться, т.к. перезапущенный МТ5 при попытке запуска программы пишет в лог:

MQL5 debugger    dispatcher already in debug mode
Нужно перезапускать и ME.
 
Stanislav Korotky #:

Проверьте пожалуйста у себя - вот такой тестовый минимальный индикатор роняет МТ5 без всяких сообщений и логов:

b5232 - подтверждаю поведение.

 
fxsaber #:

b5232 - подтверждаю поведение.

Ещё есть предположение (м.б. уже писали), что не хватает чего-то типа элемента TYPE_GROUP в перечислении ENUM_DATATYPE для поля MqlParam::type.

 
Stanislav Korotky #:

Ещё есть предположение (м.б. уже писали), что не хватает чего-то типа элемента TYPE_GROUP в перечислении ENUM_DATATYPE для поля MqlParam::type.

Наверное, пригодился бы пример для демонстрации целесообразности.

 

Проверьте пожалуйста у себя такой тестовый минимальный индикатор:

#property indicator_chart_window

int OnInit()
{
  const string shortname = StringFormat("rnd%d", MathRand());
  IndicatorSetString(INDICATOR_SHORTNAME, shortname);
  const int h = ChartIndicatorGet(0, 0, shortname);

  int j = 0;
  double buffer[];
  ResetLastError();
  while(CopyBuffer(h, j, 0, 10, buffer) == 10 && _LastError == 0)
  {
     Print(j, " ", buffer[0]);                                    // <<-- outputs a data for nonexisting buffer!
     j++;
  }
  
  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[])
{
   return rates_total;
}

Суть в том, что для любого индикаторного хендла (здесь берем самого себя, но это для простоты) вызов CopyBuffer происходит успешно на 1 большее число раз, чем количество буферов в индикаторе. В данном случае, индикатор безбуферный и вызов CopyBuffer должен завершаться ошибкой. Кроме того возвращаются какие-то данные с потолка.

ИМХО, это баг или расскажите мне, в чем здесь логика.