//+---------------------------------------------------------------------------------------------------------------------------------------+
//| LErrorsHandling.mq4 |
//| hoz |
//| |
//+---------------------------------------------------------------------------------------------------------------------------------------+
#property library
#property copyright "hoz"
#property link ""
#property version "1.00"
#property strict
//+=======================================================================================================================================+
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//| БИБЛИОТЕКА ДЛЯ КОНТРОЛЯ СОБЫТИЙ И ОШИБОК, ВОЗНИКАЮЩИХ ВО ВРЕМЯ РАБОТЫ ЭКПЕРТА |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+=======================================================================================================================================+
//----
// =========================================================== Константы ===============================================================+
#define WM_COMMAND 0x0111
// ====================================================== Импорт внешних модулей =========================================================+
#import "user32.dll"
int GetAncestor (int hWnd, int gaFlags);
int PostMessageA (int hWnd, int Msg, int wParam, string lParam);
#import
#include <HOZ_Code\Includes\IBase.mqh>
#include <HOZ_Code\Classes\CLogging.mqh>
CLogging logging;
//----
//+=======================================================================================================================================+
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ |
//+=======================================================================================================================================+
string bs_LibName = "hoz_HandlingWithErrorS@Library";
//+=======================================================================================================================================+
//=================================================== Перечень функций библиотеки ====================================================|
//+=======================================================================================================================================+
//| 1.1 Функция обрабатывает ошибки. |
//| 1.2 Сканирование серверов при разрыве связи. |
//| 1.3 Формируем строки из № ошибки и её описания. |
//| 1.4 Функция преобразует код последней ошибки в текстовую строку, содержащую описание данной ошибки. |
//+---------------------------------------------------------------------------------------------------------------------------------------+
//----
//=========================================================================================================================================
// 1.1 Функция обрабатывает ошибки. =======================================================================================================
bool fErrorHandling (int fi_Error, bool& fb_InvalidSTOP, bool fb_PrintPermission, bool fb_CommentPermission) export
{
//----
if (fi_Error == 0)
return (true);
switch (fi_Error)
{
case 4: /*ERR_SERVER_BUSY*/
case 137: /*ERR_BROKER_BUSY*/
case 139: /*ERR_ORDER_LOCKED*/
case 146: /*ERR_TRADE_CONTEXT_BUSY*/ Sleep (500); return (false);
case 6: /*ERR_NO_CONNECTION*/ fReConnect(); Sleep (1000); return (false);
case 135: /*ERR_PRICE_CHANGED*/
case 136: /*ERR_OFF_QUOTES*/
case 138: /*ERR_REQUOTE*/ Sleep (1); return (false);
case 129: /*ERR_INVALID_PRICE*/
case 130: /*ERR_INVALID_STOPS*/ fb_InvalidSTOP = true; return (false);
case 4109: /*ERR_TRADE_NOT_ALLOWED*/
Print ("Торговля запрещена ! Необходимо включить опцию \'Разрешить советнику торговать\'");
return (true);
default: logging.fWrite_Log (StringConcatenate ("тикет #", OrderTicket(), ", Критическая ошибка № ", fi_Error, " :: ", "[", fErrorDescription (fi_Error),"]"), fb_PrintPermission, fb_CommentPermission);
return (true);
}
//----
return (true);
}
//=========================================================================================================================================
// 1.2 Сканирование серверов при разрыве связи. ===========================================================================================
void fReConnect() export
{
//---- Получаем Handle терминала
int hMetaTrader = GetAncestor (WindowHandle (Symbol(), Period()), 2);
//---- Команда пересканировать все сервера
if (hMetaTrader != 0)
{
PostMessageA (hMetaTrader, WM_COMMAND, 37400, NULL);
}
//----
return;
}
//=========================================================================================================================================
// 1.3 Формируем строки из № ошибки и её описания. ========================================================================================
string fErrorToString (int fi_Error) export
{
bi_Err = fi_Error;
return (StringConcatenate ("Ошибка № ", bi_Err, " :: ", fErrorDescription (bi_Err)));
}
//=========================================================================================================================================
// 1.4 Функция преобразует код последней ошибки в текстовую строку, содержащую описание данной ошибки. ====================================
string fErrorDescription (int fi_Error) export
{
string ls_Error = "";
switch (fi_Error)
{
// Коды ошибок, возвращаемые торговым сервером:
case 0: ls_Error = "Нет ошибки";
case 1: ls_Error = "Нет ошибки, но результат не известен";
case 2: ls_Error = "Общая ошибка";
case 3: ls_Error = "Неправильные параметры";
case 4: ls_Error = "Торговый сервер занят";
case 5: ls_Error = "Старая версия клиентского терминала";
case 6: ls_Error = "Нет связи с торговым сервером";
case 7: ls_Error = "Недостаточно прав";
case 8: ls_Error = "Слишком частые запросы";
case 9: ls_Error = "Недопустимая операция, нарушающая функционирование сервера";
case 64: ls_Error = "Счёт заблокирован";
case 65: ls_Error = "Не правильный номер счёта";
case 128: ls_Error = "Истёк срок ожидания совершения сделки";
case 129: ls_Error = "Неправильная цена";
case 130: ls_Error = "Неправильные стопы";
case 131: ls_Error = "Неправильный объём";
case 132: ls_Error = "Рынок закрыт";
case 133: ls_Error = "Торговля запрещена";
case 134: ls_Error = "Недостаточно денег для совершения операции";
case 135: ls_Error = "Цена изменилась";
case 136: ls_Error = "Нет цен";
case 137: ls_Error = "Брокер занят";
case 138: ls_Error = "Новые цены";
case 139: ls_Error = "Ордер заблокирован и уже обрабатывается";
case 140: ls_Error = "Разрешена только покупка";
case 141: ls_Error = "Слишком много запросов";
case 145: ls_Error = "Модификация запрещена, т.к. ордер слишком близок к рынку";
case 146: ls_Error = "Подсистема торговли занята";
case 147: ls_Error = "Использование даты истечения ордера запрещено брокером";
case 148: ls_Error = "Количество открытых и отложенных ордеров достигло предела, установленого брокером";
case 149: ls_Error = "Попытка открыть позицию к уже существующей, в случае, если хеджирование запрещено";
case 150: ls_Error = "Попытка закрыть позицию по инструменту в противоречии с правилом FIFO";
// Коды ошибок выполнения MQL4-программы:
case 4000: ls_Error = "Нет ошибки";
case 4001: ls_Error = "Неправильный указатель функции";
case 4002: ls_Error = "Индекс массива - вне диапазона";
case 4003: ls_Error = "Нет памяти для стека функций";
case 4004: ls_Error = "Переполнение стека после рекурсивного вызова";
case 4005: ls_Error = "На стеке нет памяти для передачи параметров";
case 4006: ls_Error = "Нет памяти для строкового параметра";
case 4007: ls_Error = "Нет памяти для временной строки";
case 4008: ls_Error = "Неинициализированная строка";
case 4009: ls_Error = "Неинициализированная строка в массиве";
case 4010: ls_Error = "Нет памяти для строкового массива";
case 4011: ls_Error = "Слишком длинная строка";
case 4012: ls_Error = "Остаток от деления на ноль";
case 4013: ls_Error = "Деление на ноль";
case 4014: ls_Error = "Неизвестная команда";
case 4015: ls_Error = "Неправильный переход";
case 4016: ls_Error = "Неинициализированный массив";
case 4017: ls_Error = "Вызовы DLL не разрешены";
case 4018: ls_Error = "Не возможно загрузить библиотеку";
case 4019: ls_Error = "Не возможно вызвать функцию";
case 4020: ls_Error = "Вызовы внешних библиотечных функций не разрешены";
case 4021: ls_Error = "Недостаточно памяти для строки, возвращаемой из функции";
case 4022: ls_Error = "Система занята";
case 4050: ls_Error = "Неправильное количество параметров функции";
case 4051: ls_Error = "Недопустимое значение параметра функции";
case 4052: ls_Error = "Внутренняя ошибка строковой функции";
case 4053: ls_Error = "Ошибка массива";
case 4054: ls_Error = "Неправильное использование массива-таймсерии";
case 4055: ls_Error = "Ошибка пользовательского индикатора";
case 4056: ls_Error = "Массивы не совместимы";
case 4057: ls_Error = "Ошибка обработки глобальных переменных";
case 4058: ls_Error = "Глобальная переменная не обнаружена";
case 4059: ls_Error = "Функция не разрешена в тестовом режиме";
case 4060: ls_Error = "Функция не разрешена";
case 4061: ls_Error = "Ошибка отправки почты";
case 4062: ls_Error = "Ожидается параметр типа string";
case 4063: ls_Error = "Ожидается параметр типа integer";
case 4064: ls_Error = "Ожидается параметр типа double";
case 4065: ls_Error = "В качестве параметра ожидается массив";
case 4066: ls_Error = "Запрошенные исторические данные в состоянии обновления";
case 4067: ls_Error = "Ошибка при выполнении торговой операции";
case 4099: ls_Error = "Конец файла";
case 4100: ls_Error = "Ошибка при работе с файлом";
case 4101: ls_Error = "Неправильное имя файла";
case 4102: ls_Error = "Слишком много открытых файлов";
case 4103: ls_Error = "Не возможно открыть файл";
case 4104: ls_Error = "Не совместимый режим доступа";
case 4105: ls_Error = "Ни один ордер не выбран";
case 4106: ls_Error = "Не известный символ";
case 4107: ls_Error = "Не правильный параметр цены для торговой функции";
case 4108: ls_Error = "Не верный номер тикета";
case 4109: ls_Error = "Торговля не разрешена. Необходимо включить опцию \"Разрешить советнику торговать\" в свойствах эксперта";
case 4110: ls_Error = "Длинные позиции не разрешены. Необходимо проверить свойства эксперта";
case 4111: ls_Error = "Короткие позиции не разрешены. Необходимо проверить свойства эксперта";
case 4200: ls_Error = "Объект уже существует";
case 4201: ls_Error = "Запрошено неизвестное свойство объекта";
case 4202: ls_Error = "Объект не существует";
case 4203: ls_Error = "Неизвестный тип объекта";
case 4204: ls_Error = "Нет имени объекта";
case 4205: ls_Error = "Ошибка координат объекта";
case 4206: ls_Error = "Не найдено указанное подокно";
case 4207: ls_Error = "Ошибка при работе с объектом";
default: ls_Error = "Ошибок нет вообще никаких";
}
return (ls_Error);
}