Новая версия платформы MetaTrader 4 build 1160 - страница 2

 
h.i.a:

...

Группа №1.  Семейство MQLInfoInteger()/ AccountInfoInteger() / TerminalInfoInteger(), возвращающие "булеву" единицу.

...

Вторая группа предупреждений внезапно для меня прилетела на выражения с не сокращенными логическими И вида:

   bool Test()
   {
      return(this.Check1() & this.Check2() & this.Check3() & this.Check4());
   }
   bool Check1() {return(true);}
   bool Check2() {return(false);}
   bool Check3() {return(false);}
   bool Check4() {return(true);}


....

По группе 1, в приведённых Вами кодах, ошибок и ворнингов нет.

Скорее всего в коде Вы пытаетесь их значение вернуть из bool функции, только в этом случае возникает ворнинг.
Код компилятора, проверяющего на возврат результата из bool функции не пытается расширять сознание и разбираться в коде возвращаемого выражения, проверяется только его тип.
Результатом выражения TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) является long, поэтому компилятор и выдаёт предупреждение.
В этом случае правильно использовать следующую конструкцию:
bool TradeAllowed()
  {
   return(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)!=0);
  }

С точки зрения C++ программиста, предупреждение лишнее, которое уместно только для статических анализаторов кода.
Именно как статический анализатор кода в данном случае и поступает MQL
Изменяться данное поведение не будет.


По группе 2

Справедливое замечание, не следует для бинарных операций поднимать тип выражения до int, если операндами являются только bool выражения

Исправим

 
Alain Verleyen:

1. stdlib компилируется без #property strict, поэтому все его функции экспортируются по умолчанию

2. стандартная библиотека MQL4 больше не развивается, исправляются только явные ошибки. Используйте как есть.

 
Slava:

Написал проверочного эксперта

Вот его лог

В логе видно, когда был закрыт график USDJPY,H1

Либо я сильно упрощаю, либо Вы даёте не все подробности

Прошу прощения. Я чрезмерно обобщил. Проблема проявляется только при закрытии терминала.

Проверочный код:

#property strict

long g_lExtChartId = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   g_lExtChartId = ChartFirst();
   Print("First chart ", g_lExtChartId, "  ", ChartSymbol(g_lExtChartId), ", ", EnumToString(ChartPeriod(g_lExtChartId)));

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   uint uStart = GetTickCount();
   ChartGetInteger(g_lExtChartId, CHART_COLOR_BACKGROUND);
   uint uDelta = GetTickCount() - uStart;
   Print("Time: ", uDelta, " msc");
   Print("First chart ", ChartSymbol(g_lExtChartId),", ", EnumToString(ChartPeriod(g_lExtChartId)));
}

Воспроизведение:

  1. Подключить эксперт к любому чарту, кроме первого.
  2. Закрыть терминал.

В логе будет:

0       13:51:33.246    Test USDCHF,H1: First chart 131641462868592488  AUDUSD,PERIOD_D1
0       13:51:33.246    Test USDCHF,H1: initialized
0       13:51:42.817    Test USDCHF,H1: uninit reason 9
0       13:51:45.816    Test USDCHF,H1: Time: 3011 msc
3       13:51:50.318    Test USDCHF,H1: shutdown by timeout
0       13:51:51.838    Test USDCHF,H1: First chart , PERIOD_CURRENT
0       13:51:51.910    Expert Test USDCHF,H1: removed


 
Ihor Herasko:

Прошу прощения. Я чрезмерно обобщил. Проблема проявляется только при закрытии терминала.

Проверочный код:

Воспроизведение:

  1. Подключить эксперт к любому чарту, кроме первого.
  2. Закрыть терминал.

В логе будет:


Спасибо. Исправили.

Имейте в виду, что в OnDeinit на закрытии графика и на закрытии терминала использовать ChartGetInteger, ChartGetDouble, ChartGetString бесполезно, даже если вы обращаетесь к существующему графику

 
Slava:

Спасибо. Исправили.

И Вам спасибо.

Имейте в виду, что в OnDeinit на закрытии графика и на закрытии терминала использовать ChartGetInteger, ChartGetDouble, ChartGetString бесполезно, даже если вы обращаетесь к существующему графику

Эти функцию я ранее использовал как раз против зависания терминала. Если вызов приводил к ошибке, то не запускалась функция удаления всех объектов с графика (в каких-то ранних билдах такое случалось, в новых не проверял). Если же график еще существует, то следует вызов ObjectsDeleteAll().

 
Ilyas :

1. stdlib компилируется без #property strict, поэтому все его функции экспортируются по умолчанию

2. стандартная библиотека MQL4 больше не развивается, исправляются только явные ошибки. Используйте как есть.

Спасибо @Ilyas

Эти 2 ошибки будут исправлены и будут считаться не важными?

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

Новая версия платформы MetaTrader 4 build 1160

Alain Verleyen, 2018.12.14 14:50

Build 1151. Ошибка отображения графика MT4 при использовании индикатора с фиксированной высотой.

Пожалуйста, проверьте это видео, чтобы продемонстрировать ошибку.


Для воспроизведения прикрепите индикатор на графике и просто измените размер окна, как показано на видео.


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

Новая версия платформы MetaTrader 4 build 1160

Alain Verleyen, 2018.12.17 22:35

Когда окно графика закрывается (Ctrm, прикрепленный индикатор получает причину единицы 9 (ЗАКРЫТИЕ КЛЕММА), должно быть 4 (ЗАКРЫТИЕ КАРТЫ).

 void OnDeinit ( const int reason)
  {
   printf ( "reason " ,reason);
  }
2018.12.17 16:31:19.448    WrongReason AUDNZD,H1: uninit reason 9

 
Alain Verleyen:

Спасибо @Ilyas

Эти 2 ошибки будут исправлены и будут считаться не важными?



Исправлено. Спасибо.
 
Slava :
Исправлено. Спасибо.

Отлично. Спасибо.

Я подтверждаю, что обе ошибки исправлены в Build 1161.

 

Почти половина окна Алертов попусту используется


Просьба убрать/сжать это серое поле до размера сообщения. Сейчас при вертикальном изменении окна эта серая часть так же меняет размер. По итогу при раскрытии на весь экран почти половина выделяется под это пустое серое поле.


В MT5 с этим окном все в порядке.

 
Ilyas:
По группе 1, в приведённых Вами кодах, ошибок и ворнингов нет.

Скорее всего в коде Вы пытаетесь их значение вернуть из bool функции, только в этом случае возникает ворнинг.
Код компилятора, проверяющего на возврат результата из bool функции не пытается расширять сознание и разбираться в коде возвращаемого выражения, проверяется только его тип.
Результатом выражения TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) является long, поэтому компилятор и выдаёт предупреждение.
В этом случае правильно использовать следующую конструкцию:

С точки зрения C++ программиста, предупреждение лишнее, которое уместно только для статических анализаторов кода.
Именно как статический анализатор кода в данном случае и поступает MQL
Изменяться данное поведение не будет.


По группе 2

Справедливое замечание, не следует для бинарных операций поднимать тип выражения до int, если операндами являются только bool выражения

Исправим

По группе 2 поведение менять не будем.

Тип бинарной операции всегда int для операндов меньшего типа

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