Обработка ошибок mql4

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

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

В зависимости от типа ошибки, возможна следующие варианты обработки:

  1. задержка перед повторной попыткой предыдущего действия
  2. выход из функции с критической ошибкой

Код функции:

bool print.Error(int err,int j,string informer="",int pause=5000){
   bool is_open=true;
 
   switch(err){
         case ERR_NO_ERROR:
         case ERR_NO_RESULT: 
         case ERR_COMMON_ERROR:{is_open=false; break;}      
         case ERR_BROKER_BUSY: {Print("Брокер занят, попытка №"+DoubleToStr(j,0)); Sleep(pause);} break;
         case ERR_SERVER_BUSY: {Print("Сервер занят, попытка №"+DoubleToStr(j,0)); Sleep(pause);} break;
         case ERR_NO_CONNECTION: {Print("Нет подключения к серверу, попытка №"+DoubleToStr(j,0)); Sleep(pause);} break;
         case ERR_TRADE_TIMEOUT: {Print("Истек срок ожидания совершения сделки, попытка №"+DoubleToStr(j,0)); Sleep(pause);} break;
         case ERR_PRICE_CHANGED: {Print("Цена изменилась, попытка №"+DoubleToStr(j,0)+" "+informer); Sleep(pause);} break;
         case ERR_REQUOTE: {Print("Реквот, попытка №"+DoubleToStr(j,0)+" "+informer); Sleep(pause);} break;
         case ERR_TOO_FREQUENT_REQUESTS: {Print("Слишком частые запросы, попытка №"+DoubleToStr(j,0)+" "+informer); Sleep(pause);} break;
         case ERR_ORDER_LOCKED: {is_open=false; Print("Ордер заблокирован и уже обрабатывается");} break;
         case ERR_INVALID_STOPS: {Print("Неверный стоп, попытка №"+DoubleToStr(j,0)+" "+informer); Sleep(pause);} break;
         case ERR_INVALID_PRICE: {Print("Неправильная цена(проскальзывание), попытка №"+DoubleToStr(j,0)+" "+informer);} break;
         case ERR_OFF_QUOTES: {Print("Нет цен, попытка №"+DoubleToStr(j,0)); Sleep(pause);} break;
         case ERR_INVALID_TRADE_VOLUME: {is_open=false; Print("Неверный объем, "+informer);} break;
         case ERR_MARKET_CLOSED: {is_open=false; Print("Рынок закрыт");} break;
         case ERR_TRADE_DISABLED: {is_open=false; Print("Торговля запрещена");} break;
         case ERR_NOT_ENOUGH_MONEY: {is_open=false; Print("Недостаточно денег для совершения операции, "+informer);} break;
         case ERR_LONG_POSITIONS_ONLY_ALLOWED: {is_open=false; Print("Разрешена только покупка");} break;
         case ERR_TRADE_MODIFY_DENIED: {Print("Ордер слишком близко к рынку (модификация запрещена), попытка №"+DoubleToStr(j,0)+" "+informer); Sleep(pause);} break;
         case ERR_TRADE_EXPIRATION_DENIED: {is_open=false; Print("Использование даты истечения ордера запрещено брокером");} break;
         case ERR_TRADE_TOO_MANY_ORDERS: {is_open=false; Print("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");} break; 
         case ERR_TRADE_HEDGE_PROHIBITED: {is_open=false; Print("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");} break; 
         case ERR_TRADE_PROHIBITED_BY_FIFO: {is_open=false; Print("Попытка закрыть позицию по инструменту в противоречии с правилом FIFO.");} break; 
         case ERR_ARRAY_INDEX_OUT_OF_RANGE: {is_open=false; break;}
         case ERR_LONGS_NOT_ALLOWED: {is_open=false; break;}
         case ERR_SHORTS_NOT_ALLOWED: {is_open=false; break;}
         case ERR_INVALID_TICKET: {is_open=false; break; }
         default: {is_open=false; Print("Неизвестная ошибка: "+err+" "+informer);} break;
      }
 
    return (is_open);  
}