Обсуждение статьи "Обработка ошибок и логирование в MQL5"

 

Опубликована статья Обработка ошибок и логирование в MQL5:

В статье рассматриваются общие вопросы обработки ошибок в программном обеспечении. Кроме того, затрагивается тема логирования и демонстрируется пример реализации логгера средствами MQL5.

В процессе работы большинства программ время от времени могут возникать ошибки. Их адекватная обработка — один из важных аспектов функционирования качественного и устойчивого программного обеспечения. В данной статье будут рассмотрены основные методы обработки ошибок, будут даны рекомендации по их применению, а также будет рассмотрен вопрос логирования средствами MQL5.

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


Логирование средствами MQL5

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

Уровни логирования

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

  • Debug: отладочные сообщения. Этот уровень логирования включается на этапах разработки, отладки и пуско-наладочных работ.
  • Info: информационные сообщения. Они несут в себе информацию о различных действиях системы (например: начало/окончание работы, открытие/закрытие сделок и т.п.). Обычно сообщения этого уровня не требуют никакой реакции, но могут ощутимо помочь при изучении цепочек событий, приведших к тем или иным ошибкам работы.
  • Warning: предупреждающие сообщения. Данный уровень сообщений может включать в себя описание ситуаций, приведших к ошибкам, которые не требуют вмешательства пользователя. К примеру, если рассчитанный объем сделки оказался меньше минимально допустимого, и программа автоматически его скорректировала, то об этом можно сообщить в лог-файл с уровнем «Warning».
  • Error: сообщения об ошибках, которые требуют явного вмешательства. Этот уровень логирования обычно применяется при возникновении ошибок вроде невозможности сохранения какого-то файла, открытия или модификации сделки и т.п. Иными словами, сюда попадают ошибки, которые программа не в состоянии самостоятельно преодолеть и которые требуют явного вмешательства (пользователя или программиста).
  • Fatal: сообщения о критических ошибках, которые приводят к невозможности дальнейшей работы программы. Такие сообщения требуют как можно более быстрой реакции, нередко для этого уровня предусматривается оповещение пользователя или программиста посредством электронной почты, SMS и т.п. Как будет показано далее, в MQL5 для оповещений можно применять PUSH-уведомления.
2015.09.23 09:02:10, USDCAD (D1), INFO: 
2015.09.23 09:02:10, USDCAD (D1), INFO: ---------- OnInit() -----------
2015.09.23 09:02:10, USDCAD (D1), DEBUG: Example of debug message (LoggerTest.mq5; int OnInit(); Line: 36)
2015.09.23 09:02:10, USDCAD (D1), INFO: Example of info message (LoggerTest.mq5; int OnInit(); Line: 38)
2015.09.23 09:02:10, USDCAD (D1), WARNING: Example of warning message (LoggerTest.mq5; int OnInit(); Line: 40)
2015.09.23 09:02:10, USDCAD (D1), ERROR: Example of error message (LoggerTest.mq5; int OnInit(); Line: 42)
2015.09.23 09:02:10, USDCAD (D1), FATAL: Example of fatal message (LoggerTest.mq5; int OnInit(); Line: 44)

Автор: Sergey Eremin

 

Добрый день!

А почему Вы не рассмотрели вопрос "Обработка кодов возврата торгового сервера" ?

Это гораздо ВАЖНЕЕ, чем всё изложенное в Вашей статье. 

 
Михаил:

Добрый день!

А почему Вы не рассмотрели вопрос "Обработка кодов возврата торгового сервера" ?

Это гораздо ВАЖНЕЕ, чем всё изложенное в Вашей статье. 

Для начала прочтите всю статью. Если не поймёте - тогда ещё и ещё читайте - до полного понимания. Только в таком случае поймёте, что Ваше сообщение вообще никаким боком не относится к теме затронутой в статье.
 
Karputov Vladimir:
Для начала прочтите всю статью. Если не поймёте - тогда ещё и ещё читайте - до полного понимания. Только в таком случае поймёте, что Ваше сообщение вообще никаким боком не относится к теме затронутой в статье.

Статью нужно было назвать не "Обработка ошибок и логирование в МТ5",

а "Обработка СОБСТВЕННЫХ ошибок и логирование в МТ5"! 

 
Михаил:

Добрый день!

А почему Вы не рассмотрели вопрос "Обработка кодов возврата торгового сервера" ?

Это гораздо ВАЖНЕЕ, чем всё изложенное в Вашей статье. 

Михаил, а почему бы Вам просто не написать такую статью? Прямо готовая тема! :)

Я вот не посчитал, что эта тема важнее, чем всё изложенное в статье. Если Вы так считаете - ну дык просто сделайте это, к чему ругать за не сделанное?


В самом деле этот момент я не стремился подробно рассматривать, т.к. хотел более общие вопросы затронуть. Так мы можем удариться и в подробное рассмотрение возвращаемых кодов ошибок стандартных функций языка. Например, как ещё одна тема статьи - "Обработка ошибок, возникающих при работе с графическими объектами на MQL5".

Моя цель была не та. Впрочем да, спустя месяц после написания статьи вижу, что получилось "так себе". Что ж, постараюсь быть лучше в будущем.

 
Sergey Eremin:

Почему бы Вам просто не написать такую статью? Прямо готовая тема! :)

В самом деле этот момент я не стремился подробно рассматривать, т.к. хотел более общие вопросы затронуть. Так мы можем удариться и в подробное рассмотрение возвращаемых кодов ошибок стандартных функций языка. Например, как ещё одна тема статьи - "Обработка ошибок, возникающих при работе с графическими объектами на MQL5".

Моя цель была не та. Впрочем да, спустя месяц после написания статьи вижу, что получилось "так себе". Что ж, постараюсь быть лучше в будущем.

Сергей!

Да всё нормально, только я бы назвал статью

"Расширенные методы отладки экспертов в МТ5 с логированием." 

Потому что когда эксперт отлажен, ошибок (разработчика уже нет) ,

 а вот коды возврата торгового сервера, могут "пестрить" ошибками,

которые необходимо обрабатывать как раз в штатном режиме эксперта. 

 
Михаил:

Сергей!

Да всё нормально, только я бы назвал статью

"Расширенные методы отладки экспертов в МТ5 с логированием." 

Но ведь обработка ошибок это не отладка :)

Или Вы хотите сказать, что, к примеру, обработка ошибки "недостаточно средств" (о чём в качестве примера говорится в статье) есть отладка?

 
Sergey Eremin:

Но ведь обработка ошибок это не отладка :)

Или Вы хотите сказать, что, к примеру, обработка ошибки "недостаточно средств" (о чём в качестве примера говорится в статье) есть отладка?

"Недостаточно средств", это не ошибка а сообщение Вам (эксперту о состоянии Вашего счёта) и

эта СТАНДАРТНАЯ обрабатываемая ситуация. И нормальный разработчик ОБЯЗАН, перед сделкой или выставлением

ордера ПРОВЕРИТЬ наличие средств. 

//+------------------------------------------------------------------+
//| Expert Check money function                                      |
//+------------------------------------------------------------------+ 
bool CheckMoney( const long volume )
{
  double a_go = SymbolInfoDouble( _Symbol, SYMBOL_MARGIN_INITIAL ) * double(volume);
  double free_margin = ( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 90;
//---  
  if ( a_go <= free_margin )
  {
    return( true );
  }
  Print( "Check Money: Не достаточно средств!" );
  return( false );
}
 
Михаил:

"Недостаточно средств", это не ошибка а сообщение Вам (эксперту о состоянии Вашего счёта) и

эта СТАНДАРТНАЯ обрабатываемая ситуация. 

Но это и не отладочный момент. Называйте как хотите, но обработать это надо (причём как я вижу в этом мы согласны). В моём понимании это ошибочная ситуация относительно нормального течения вещей. Ведь эксперт может предполагать, что средств таки достаточно. И если никак это не проверять и не обрабатывать, то получится ерунда.

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


Ну и ещё раз: всё таки в статье я стремился больше рассмотреть вопросы именно обработки ошибок уже в процессе работы программы, а не вопросы отладки ПО. Это вообще другая тема и коррелирует со статьёй только в рамках логгирования (и то лишь частично).
И не было целью рассмотреть конкретные ошибки (будь то коды возврата торгового сервера, или, как я выше сказал, к примеру возможные ошибки при работе с граф. объектами). Лишь общие методы, которые применимы и к ошибкам (или к стандартным ситуациям, если Вам так угодно), которые возвращает и торговый сервер в том числе.

Мне очень жаль, если мой посыл остался непонятным. Надеюсь, теперь всё встанет на свои места.

 
Михаил:

эта СТАНДАРТНАЯ обрабатываемая ситуация. И нормальный разработчик ОБЯЗАН, перед сделкой или выставлением

ордера ПРОВЕРИТЬ наличие средств. 

Увы, я вынужден спросить: Вы всё таки читали статью или так, пробежались и давай осуждать? Я говорил о предварительных проверках в статье (каюсь, конкретно о проверке средств не говорил, но думал это итак понятно). А обработать возможную ошибку "недостаточно средств" и после попытки открытия сделки - не самая плохая идея, даже если мы сделали эту проверку до. Всякое может случиться за время между проверкой "до" и непосредственной попыткой открытия.

 
Sergey Eremin:

Увы, я вынужден спросить: Вы всё таки читали статью или так, пробежались и давай осуждать? Я говорил о предварительных проверках в статье (каюсь, конкретно о проверке средств не говорил, но думал это итак понятно). А обработать возможную ошибку "недостаточно средств" и после попытки открытия сделки - не самая плохая идея, даже если мы сделали эту проверку до. Всякое может случиться за время между проверкой "до" и непосредственной попыткой открытия.

Сергей!

Вот для таких ситуаций и существуют коды возврата торгового сервера.

Пример: Вы проверили наличие свободных средств и получили утвердительный результат.

Отсылаете ордер, а он не был принят (как Вы сказали : "Да мало ли что может произойти "),

так вот, торговый сервер вернёт Вам в коде возврата ошибку "Недостаточно средств". 

И получается, что совершенно "по-барабану" сколько раз Вы будете проверять наличие ошибки

в промежутке от Вашей проверки (CheckMoney) до кода возврата торгового сервера!

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