//+------------------------------------------------------------------+
//|                                                       Errors.mq4 |
//|                                                            drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "drknn"
#property link      "drknn@mail.ru"

/*В библиотеке надо указать, что это библиотека вот этой строкой:
#property library

Далее, надо создать заголовочный файл *.mqh
В этом файле надо перечислить все задействованные в этой библиотеке функции.
Перед перечислением указать, что импорт этих перечисляемых функций будет
осуществляться из файла библиотеки.
Но, текст файла библиотеки имеет расширение *.mq4, а указывать надо расширение
откомпилировванного файла, то есть, не *.mq4, а *.ex4. Например,
#import "Errors.ex4" 

В советнике остаётся указать строкой имя заголовочного файла
#include <Errors.mqh>

ВНИМАНИЕ!!!!!!!!!!
Заголовочный файл при создании не всегда создаётся с расширением *.mqh
Поэтому если он создался с другим расширением, его следует либо перемиеновать,
либо указывать в советнике именно то расширение, какое есть у заголовочного файла. 

*/

#property library
//+------------------------------------------------------------------+
//|                      Моя функция                                 |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
//   {
//    return(value+value2);
//   }
//+------------------------------------------------------------------+


// ======================= Вызов номера и описания ошибки выбора  ==========================================
//   Функция WriteError() пишет номер возникшей ошибки выбора и её русское описание
// --------------------------------------------------------------------------------

void WriteError(int i){
 int GLE=GetLastError(); 
 string ED=ErrorDescription(GLE);
 Print("Ошибка ", GLE, " при выборе ордера номер ",i);
 Print ("Описание ошибки - ",ED);
}
// =========================================================================================================


// ======================= Ошибка модификации =====================================================
//  Функция ModifError() пишет номер возникшей ошибки модификации и её русское описание
// ------------------------------------------------------------------------------------
void ModifError(){
 int GLE=GetLastError();
 string ED=ErrorDescription(GLE);
 Print("Модификация ордера № ",OrderTicket(), " вернула ошибку № ",GLE);
 Print ("Описание ошибки: ",ED);
}
// ================================================================================================

// ======================= Общая ошибка =====================================================
//  Функция GeneralError() пишет номер возникшей ошибки и её русское описание
// ------------------------------------------------------------------------------------
void GeneralError(){
 int GLE=GetLastError();
 string ED=ErrorDescription(GLE);
 Print(" ! Ошибка № ",GLE);
 Print ("Описание ошибки: ",ED);
}
// ================================================================================================

//========= Словестное описание ошибок ===============================
// Функция ErrorDescription() возвращает не код ошибки а её словестное описание
//-----------------------------------------------------------
string ErrorDescription(int error_code){
      string error_string;
      switch(error_code)
        {
         //---- codes returned from trade server
           case 0:      error_string=" Нет ошибки"; break;
           case 1:      error_string=" Нет ошибки, но результат неизвестен"; break;
           case 2:      error_string=" Общая ошибка"; break;
           case 3:      error_string=" Неправильные параметры"; break;
           case 4:      error_string=" Торговый сервер занят"; break;
           case 5:      error_string=" Старая версия клиентского терминала"; break;
           case 6:      error_string=" Нет связи с торговым сервером"; break;
           case 7:      error_string=" Недостаточно прав"; break;
           case 8:      error_string=" Слишком частые запросы"; break;
           case 9:      error_string=" Недопустимая операция нарушающая функционирование сервера"; break;
           case 64:     error_string=" Счет заблокирован"; break;
           case 65:     error_string=" Неправильный номер счета"; break;
           case 128:    error_string=" Истек срок ожидания совершения сделки"; break;
           case 129:    error_string=" Неправильная цена"; break;
           case 130:    error_string=" Неправильные стопы"; break;
           case 131:    error_string=" Неправильный объем"; break;
           case 132:    error_string=" Рынок закрыт"; break;
           case 133:    error_string=" Торговля запрещена"; break;
           case 134:    error_string=" Недостаточно денег для совершения операции"; break;
           case 135:    error_string=" Цена изменилась"; break;
           case 136:    error_string=" Нет цен"; break;
           case 137:    error_string=" Брокер занят"; break;
           case 138:    error_string=" Новые цены"; break;
           case 139:    error_string=" Ордер заблокирован и уже обрабатывается"; break;
           case 140:    error_string=" Разрешена только покупка"; break;
           case 141:    error_string=" Слишком много запросов"; break;
           case 145:    error_string=" Модификация запрещена, так как ордер слишком близок к рынку"; break;
           case 146:    error_string=" Подсистема торговли занята"; break;
           case 147:    error_string=" Использование даты истечения ордера запрещено брокером"; break;
           case 148:    error_string=" Количество открытых и отложенных ордеров достигло предела, установленного брокером"; break;
           case 4000:   error_string=" Нет ошибки"; break;
           case 4001:   error_string=" Неправильный указатель функции"; break;
           case 4002:   error_string=" Индекс массива - вне диапазона"; break;
           case 4003:   error_string=" Нет памяти для стека функций"; break;
           case 4004:   error_string=" Переполнение стека после рекурсивного вызова"; break;
           case 4005:   error_string=" На стеке нет памяти для передачи параметров"; break;
           case 4006:   error_string=" Нет памяти для строкового параметра"; break;
           case 4007:   error_string=" Нет памяти для временной строки"; break;
           case 4008:   error_string=" Неинициализированная строка"; break;
           case 4009:   error_string=" Неинициализированная строка в массиве"; break;
           case 4010:   error_string=" Нет памяти для строкового массива"; break;
           case 4011:   error_string=" Слишком длинная строка"; break;
           case 4012:   error_string=" Остаток от деления на ноль"; break;
           case 4013:   error_string=" Деление на ноль"; break;
           case 4014:   error_string=" Неизвестная команда"; break;
           case 4015:   error_string=" Неправильный переход"; break;
           case 4016:   error_string=" Неинициализированный массив"; break;
           case 4017:   error_string=" Вызовы DLL не разрешены"; break;
           case 4018:   error_string=" Невозможно загрузить библиотеку"; break;
           case 4019:   error_string=" Невозможно вызвать функцию"; break;
           case 4020:   error_string=" Вызовы внешних библиотечных функций не разрешены"; break;
           case 4021:   error_string=" Недостаточно памяти для строки, возвращаемой из функции"; break;
           case 4022:   error_string=" Система занята"; break;
           case 4050:   error_string=" Неправильное количество параметров функции"; break;
           case 4051:   error_string=" Недопустимое значение параметра функции"; break;
           case 4052:   error_string=" Внутренняя ошибка строковой функции"; break;
           case 4053:   error_string=" Ошибка массива"; break;
           case 4054:   error_string=" Неправильное использование массива-таймсерии"; break;
           case 4055:   error_string=" Ошибка пользовательского индикатора"; break;
           case 4056:   error_string=" Массивы несовместимы"; break;
           case 4057:   error_string=" Ошибка обработки глобальныех переменных"; break;
           case 4058:   error_string=" Глобальная переменная не обнаружена"; break;
           case 4059:   error_string=" Функция не разрешена в тестовом режиме"; break;
           case 4060:   error_string=" Функция не подтверждена"; break;
           case 4061:   error_string=" Ошибка отправки почты"; break;
           case 4062:   error_string=" Ожидается параметр типа string"; break;
           case 4063:   error_string=" Ожидается параметр типа integer"; break;
           case 4064:   error_string=" Ожидается параметр типа double"; break;
           case 4065:   error_string=" В качестве параметра ожидается массив"; break;
           case 4066:   error_string=" Запрошенные исторические данные в состоянии обновления"; break;
           case 4067:   error_string=" Ошибка при выполнении торговой операции"; break;
           case 4099:   error_string=" Конец файла"; break;
           case 4100:   error_string=" Ошибка при работе с файлом"; break;
           case 4101:   error_string=" Неправильное имя файла"; break;
           case 4102:   error_string=" Слишком много открытых файлов"; break;
           case 4103:   error_string=" Невозможно открыть файл"; break;
           case 4104:   error_string=" Несовместимый режим доступа к файлу"; break;
           case 4105:   error_string=" Ни один ордер не выбран"; break;
           case 4106:   error_string=" Неизвестный символ"; break;
           case 4107:   error_string=" Неправильный параметр цены для торговой функции"; break;
           case 4108:   error_string=" Неверный номер тикета"; break;
           case 4109:   error_string=" Торговля не разрешена"; break;
           case 4110:   error_string=" Длинные позиции не разрешены"; break;
           case 4111:   error_string=" Короткие позиции не разрешены"; break;
           case 4200:   error_string=" Объект уже существует"; break;
           case 4201:   error_string=" Запрошено неизвестное свойство объекта"; break;
           case 4202:   error_string=" Объект не существует"; break;
           case 4203:   error_string=" Неизвестный тип объекта"; break;
           case 4204:   error_string=" Нет имени объекта"; break;
           case 4205:   error_string=" Ошибка координат объекта"; break;
           case 4206:   error_string=" Не найдено указанное подокно"; break;
           case 4207:   error_string=" Ошибка при работе с объектом"; break;
        }
  
  return(error_string);
}
//===============================================================================================================================



