Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 38

 
Alexey Viktorov #:

Запускал и скрипт, и советник, и в b3029, и в b3030… о разнице писал тут

Видимо, дело в CPU.

 
Alexey Viktorov #:

Запускал и скрипт, и советник, и в b3029, и в b3030… о разнице писал тут


Да, мы добавили более точный механизм отлова делений на ноль.

Абсолютно точный отлов строки падения в рантайме не всегда возможен, так как это потребует усложнения кода и потенциального замедления на операциях деления.

 
Renat Fatkhullin #:

Да, мы добавили более точный механизм отлова делений на ноль.

Абсолютно точный отлов строки падения в рантайме не всегда возможен, так как это потребует усложнения кода и потенциального замедления на операциях деления.

Так почему деление на ноль не срабатывает?

 

b3030, CTRL+B не работает. Объекты есть, пункт меню по ПКМ активен. ALT+B - работает.

Перезагрузил терминал, стал работать CTRL+B. Все делал на домашнем компе.


Возможно, с этим проблема связана.

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

Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях

fxsaber, 2021.08.19 21:00

На удаленных машинах (VPS через RDP) постоянно сталкиваюсь с одной и той же проблемой.

Запущено несколько одинаковых советников. Одни реагируют на нажатие CTRL/SHIFT, другие - нет.

  static bool IsKeyCtrl( void )
  {
    return(::TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL) < 0);
  }


Если из советника, который не реагирует на эти клавиши, запустить что-нибудь стороннее через это.

  #import "shell32.dll"
    int ShellExecuteW( int, string, string, string, string, int );
  #import

То советник волшебным образом начинает реагировать на нажатия CTRL/SHIFT!


Вроде, про проблему отсутствия реакций на нажатия в VPS где-то озвучивалось ранее. Про костыль "лечения" - нет.

Просьба посмотреть эту проблему.

 

Запускаю скрипт от fxsaber в b3030, откомпилированный по F7, получаю следующие результаты, никаких сообщений об ошибке.

      int i = 0;
      double d = 0;

      Print(1 / i); // 35594864
      Print(1 / d); // inf


2021.08.30 15:03:12.754 Terminal        Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M  @ 2.50GHz, 3 / 7 Gb memory, 30 / 287 Gb disk, IE 11, UAC, GMT+3

Когда запускую по F5, то получаю во время выполнения алерт по критической ошибке с вопросом перейти в дебагер, причем:

-Если отвечаю "Да", то активируется окно ME с отладкой, но при этом в логе экспертов нет никакого сообщения об ошибке!

-Если отвечаю "Нет", то в логе экспертов запись " zero divide, check divider to avoid this error in 'sTestDiv0.mq5' (22,15)"

В b2981 этот же скрипт,  скомпилированный в релиз, вылетал с сообщениями zero divide.


@Alexey Viktorov

у вас в b3030 ошибка zero divide выдается для скрипта, откомпилированного в дебаг или релиз режиме?


@Renat Fatkhullin

В чем заключается "более точный механизм отлова делений на ноль", если в b2981 этот же скрипт в рантайме выдавал ошибку, а в b3030 нет?

 
@Renat Fatkhullin

В чем заключается "более точный механизм отлова делений на ноль", если в b2981 этот же скрипт в рантайме выдавал ошибку, а в b3030 нет?

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

В билде 3030 это неудачно получилось, в 3031 все будет правильно. Уже исправили.

 
@Renat Fatkhullin

В чем заключается "более точный механизм отлова делений на ноль", если в b2981 этот же скрипт в рантайме выдавал ошибку, а в b3030 нет?

Работы по удалению контроля за делителем не закончены в билде 3030


Мы отказалить от контроля за делителем (и переполнением) со стороны языка, т.к. в MQL нет и не планируется обработка исключений.
Да, значения координат (в коде ) исключения полезны, но цена им - скорость, на каждом делении проверка + условный переход.

При делении на ноль вещественных чисел исключения не будет, результатом будет inf.
Впрочем получить inf можно и другими способами, кроме как деление на ноль, поэтому программистам нужно самим заботиться о корректности расчётов, например, используя функцию MathClassify


Мы оставили проверки деления (целых и вещественных) в режиме отладки, где можно будет увидеть координаты в коде.
Документация по MQL5: Математические функции / MathClassify
Документация по MQL5: Математические функции / MathClassify
  • www.mql5.com
MathClassify - Математические функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ilyas #:

При делении на ноль вещесвтенных чисел, исключения не будет, результатом будет inf.

Впрочем получить inf можно и другими способами, кроме как деление на ноль, поэтому программистам, нужно самим заботиться о корректности расчётов, например используя функцию MathClassify

Язык становится все более низкоуровневым. Не знаю, плохо это или хорошо.


Сам наткнулся на эту ситуацию, когда стал вычислять маржинальные требования (фактически, торговые лоты) и случайно запустил на кастомном символе, получив странное значение.

Полез в код, увидел деление на ASK-цену. Но у кастомного символа такой цены не было (CustomTicksAdd не вызывал) - MarketWatch-поля пустые, т.е. нулевые. И вот происходит деление на ноль, а ошибок нет.


Стал разбираться, и оказалось, что отныне делить на ноль можно. И если раньше знал, что случись деление на ноль в боевом советнике, программа просто вылетит и даже сообщит, что и где произошло. То теперь несколько некомфортно, т.к. в случае деления на ноль программа не остановится, а начнет некорректные вычисления пихать в торговлю: огромные лоты, близкие стопы, спам торговыми приказами, бесконечные перевороты и т.д.


Т.е. можно очень круто слить на программной ошибке! В этом дискомфорт. Ситуации же, когда вдруг произошло деление на ноль, могут быть настолько редкими, что не подвластны идее с дебагом. Раз в год "палка" стрельнет и сольет торговый счет. Надо придумывать какие-то защиты. Какие - голову ломать, видимо, долго.

 
Ilyas #:

Работы по удалению контроля за делителем не закончены в билде 3030


Мы отказалить от контроля за делителем (и переполнением) со стороны языка, т.к. в MQL нет и не планируется обработка исключений.
Да, значения координат (в коде ) исключения полезны, но цена им - скорость, на каждом делении проверка + условный переход.

При делении на ноль вещественных чисел исключения не будет, результатом будет inf.
Впрочем получить inf можно и другими способами, кроме как деление на ноль, поэтому программистам нужно самим заботиться о корректности расчётов, например, используя функцию MathClassify


Мы оставили проверки деления (целых и вещественных) в режиме отладки, где можно будет увидеть координаты в коде.
Спасибо за информацию!
 
fxsaber #: Надо придумывать какие-то защиты. Какие - голову ломать, видимо, долго.

Можно сделать функцию-обертку для операции деления наподобие Div(a,b,exit=true,default=0),

Если b(делитель) == 0 или это NaN, то  для exit=true делать аварийное завершение программы, а для false - возвращать default.

А в режиме отладки пусть считает простым делением.

И применять ее всегда!


Теперь возникает вопрос - как сделать полное аварийное прерывание программы (ABORT)?

раньше это можно было сделать через if(1/MathAbs(0.0)==1) - а теперь?

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