При работе торгового терминала MetaTrader 4 возникают различные ошибки при обмене информацией с торговым сервером, который в ответ на ошибочные запросы отсылает программе MetaTrader 4 не описание ошибки, а цифровой код ошибки — специальную комбинацию цифр, которая отображается во вкладках Эксперты
и Журнал
(примеры этих вкладок и описание типичной ситуации при возникновении ошибок можно найти в статье «Обзор торгового терминала MetaTrader 4»). Не все торговые терминалы MetaTrader 4 различных дилинговых центров дают расшифровку цифрового кода, а если она и есть, то — на английском языке. Чтобы понять, почему программа МетаТрейдер 4 работает неправильно, полезно знать расшифровку цифрового кода — какой комбинации цифр соответствует определенное описание ошибки. В некоторых случаях эта информация может сильно облегчить «жизнь» трейдеру и помочь быстрее справиться с возникшей проблемой.
Итак, предлагаем Вашему вниманию расшифровку кодов ошибок, которые можно встретить при работе с торговым терминалом MetaTrader 4:
Коды ошибок, возвращаемые торговым сервером терминалу MetaTrader 4.
- Error: 0 — Нет ошибки.
- Error: 1 — Нет ошибки, но результат неизвестен.
- Error: 2 — Общая ошибка.
- Error: 3 — Неправильные параметры.
- Error: 4 — Торговый сервер занят.
- Error: 5 — Старая версия клиентского терминала.
- Error: 6 — Нет связи с торговым сервером.
- Error: 7 — Недостаточно прав.
- Error: 8 — Слишком частые запросы.
- Error: 9 — Недопустимая операция, нарушающая функционирование сервера.
- Error: 64 — Счёт заблокирован.
- Error: 65 — Неправильный номер счета.
- Error: 128 — Истек срок ожидания совершения сделки.
- Error: 129 — Неправильная цена.
- Error: 130 — Неправильные стопы.
- Error: 131 — Неправильный объём.
- Error: 132 — Рынок закрыт.
- Error: 133 — Торговля запрещена.
- Error: 134 — Недостаточно денег для совершения операции.
- Error: 135 — Цена изменилась.
- Error: 136 — Нет цен.
- Error: 137 — Брокер занят.
- Error: 138 — Новые цены.
- Error: 139 — Ордер заблокирован и уже обрабатывается.
- Error: 140 — Разрешена только покупка.
- Error: 145 — Модификация запрещена, так как ордер слишком близок к рынку.
- Error: 146 — Подсистема торговли занята.
- Error: 147 — Использование даты истечения ордера запрещено брокером.
- Error: 148 — Количество открытых и отложенных ордеров достигло предела, установленного брокером.
- Error: 149 — Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.
- Error: 150 — Попытка закрыть позицию по инструменту в противоречии с правилом FIFO.
Коды ошибок выполнения MQL4-программы (советника):
- Error: 4000 — Нет ошибки.
- Error: 4001 — Неправильный указатель функции.
- Error: 4002 — Индекс массива — вне диапазона.
- Error: 4003 — Нет памяти для стека функций.
- Error: 4004 — Переполнение стека после рекурсивного вызова.
- Error: 4005 — На стеке нет памяти для передачи параметров.
- Error: 4006 — Нет памяти для строкового параметра.
- Error: 4007 — Нет памяти для временной строки.
- Error: 4008 — Неинициализированная строка.
- Error: 4009 — Неинициализированная строка в массиве.
- Error: 4010 — Нет памяти для строкового массива.
- Error: 4011 — Слишком длинная строка.
- Error: 4012 — Остаток от деления на ноль.
- Error: 4013 — Деление на ноль.
- Error: 4014 — Неизвестная команда.
- Error: 4015 — Неправильный переход.
- Error: 4016 — Неинициализированный массив.
- Error: 4017 — Вызовы DLL не разрешены.
- Error: 4018 — Невозможно загрузить библиотеку.
- Error: 4019 — Невозможно вызвать функцию.
- Error: 4020 — Вызовы внешних библиотечных функций не разрешены.
- Error: 4021 — Недостаточно памяти для строки, возвращаемой из функции.
- Error: 4022 — Система занята.
- Error: 4050 — Неправильное количество параметров функции.
- Error: 4051 — Недопустимое значение параметра функции.
- Error: 4052 — Внутренняя ошибка строковой функции.
- Error: 4053 — Ошибка массива.
- Error: 4054 — Неправильное использование массива-таймсерии.
- Error: 4055 — Ошибка пользовательского индикатора.
- Error: 4056 — Массивы несовместимы.
- Error: 4057 — Ошибка обработки глобальныех переменных.
- Error: 4058 — Глобальная переменная не обнаружена.
- Error: 4059 — Функция не разрешена в тестовом режиме.
- Error: 4060 — Функция не разрешена.
- Error: 4061 — Ошибка отправки почты.
- Error: 4062 — Ожидается параметр типа string.
- Error: 4063 — Ожидается параметр типа integer.
- Error: 4064 — Ожидается параметр типа double.
- Error: 4065 — В качестве параметра ожидается массив.
- Error: 4066 — Запрошенные исторические данные в состоянии обновления.
- Error: 4067 — Ошибка при выполнении торговой операции.
- Error: 4099 — Конец файла.
- Error: 4100 — Ошибка при работе с файлом.
- Error: 4101 — Неправильное имя файла.
- Error: 4102 — Слишком много открытых файлов.
- Error: 4103 — Невозможно открыть файл.
- Error: 4104 — Несовместимый режим доступа к файлу.
- Error: 4105 — Ни один ордер не выбран.
- Error: 4106 — Неизвестный символ.
- Error: 4107 — Неправильный параметр цены для торговой функции.
- Error: 4108 — Неверный номер тикета.
- Error: 4109 — Торговля не разрешена. Необходимо включить опцию
Разрешить советнику торговать
в свойствах эксперта. - Error: 4110 — Длинные позиции не разрешены — необходимо проверить свойства эксперта.
- Error: 4111 — Короткие позиции не разрешены — необходимо проверить свойства эксперта.
- Error: 4200 — Объект уже существует.
- Error: 4201 — Запрошено неизвестное свойство объекта.
- Error: 4202 — Объект не существует.
- Error: 4203 — Неизвестный тип объекта.
- Error: 4204 — Нет имени объекта.
- Error: 4205 — Ошибка координат объекта.
- Error: 4206 — Не найдено указанное подокно.
- Error: 4207 — Ошибка при работе с объектом.
GetLastError() — функция, возвращающая коды ошибок. Кодовые константы ошибок определены
в файле stderror.mqh. Для вывода текстовых сообщений следует использовать функцию
ErrorDescription(), определенную в файле stdlib.mqh.
| Константа | Значение | Описание |
|---|---|---|
| ERR_NO_ERROR | 0 | Нет ошибки |
| ERR_NO_RESULT | 1 | Нет ошибки, но результат неизвестен |
| ERR_COMMON_ERROR | 2 | Общая ошибка |
| ERR_INVALID_TRADE_PARAMETERS | 3 | Неправильные параметры |
| ERR_SERVER_BUSY | 4 | Торговый сервер занят |
| ERR_OLD_VERSION | 5 | Старая версия клиентского терминала |
| ERR_NO_CONNECTION | 6 | Нет связи с торговым сервером |
| ERR_NOT_ENOUGH_RIGHTS | 7 | Недостаточно прав |
| ERR_TOO_FREQUENT_REQUESTS | 8 | Слишком частые запросы |
| ERR_MALFUNCTIONAL_TRADE | 9 | Недопустимая операция нарушающая функционирование сервера |
| ERR_ACCOUNT_DISABLED | 64 | Счет заблокирован |
| ERR_INVALID_ACCOUNT | 65 | Неправильный номер счета |
| ERR_TRADE_TIMEOUT | 128 | Истек срок ожидания совершения сделки |
| ERR_INVALID_PRICE | 129 | Неправильная цена |
| ERR_INVALID_STOPS | 130 | Неправильные стопы |
| ERR_INVALID_TRADE_VOLUME | 131 | Неправильный объем |
| ERR_MARKET_CLOSED | 132 | Рынок закрыт |
| ERR_TRADE_DISABLED | 133 | Торговля запрещена |
| ERR_NOT_ENOUGH_MONEY | 134 | Недостаточно денег для совершения операции |
| ERR_PRICE_CHANGED | 135 | Цена изменилась |
| ERR_OFF_QUOTES | 136 | Нет цен |
| ERR_BROKER_BUSY | 137 | Брокер занят |
| ERR_REQUOTE | 138 | Новые цены |
| ERR_ORDER_LOCKED | 139 | Ордер заблокирован и уже обрабатывается |
| ERR_LONG_POSITIONS_ONLY_ALLOWED | 140 | Разрешена только покупка |
| ERR_TOO_MANY_REQUESTS | 141 | Слишком много запросов |
| ERR_TRADE_MODIFY_DENIED | 145 | Модификация запрещена, так как ордер слишком близок к рынку |
| ERR_TRADE_CONTEXT_BUSY | 146 | Подсистема торговли занята |
| ERR_TRADE_EXPIRATION_DENIED | 147 | Использование даты истечения ордера запрещено брокером |
| ERR_TRADE_TOO_MANY_ORDERS | 148 | Количество открытых и отложенных ордеров достигло предела, установленного брокером. |
| Константа | Значение | Описание |
|---|---|---|
| ERR_NO_MQLERROR | 4000 | Нет ошибки |
| ERR_WRONG_FUNCTION_POINTER | 4001 | Неправильный указатель функции |
| ERR_ARRAY_INDEX_OUT_OF_RANGE | 4002 | Индекс массива — вне диапазона |
| ERR_NO_MEMORY_FOR_FUNCTION_CALL_STACK | 4003 | Нет памяти для стека функций |
| ERR_RECURSIVE_STACK_OVERFLOW | 4004 | Переполнение стека после рекурсивного вызова |
| ERR_NOT_ENOUGH_STACK_FOR_PARAMETER | 4005 | На стеке нет памяти для передачи параметров |
| ERR_NO_MEMORY_FOR_PARAMETER_STRING | 4006 | Нет памяти для строкового параметра |
| ERR_NO_MEMORY_FOR_TEMP_STRING | 4007 | Нет памяти для временной строки |
| ERR_NOT_INITIALIZED_STRING | 4008 | Неинициализированная строка |
| ERR_NOT_INITIALIZED_ARRAYSTRING | 4009 | Неинициализированная строка в массиве |
| ERR_NO_MEMORY_FOR_ARRAYSTRING | 4010 | Нет памяти для строкового массива |
| ERR_TOO_LONG_STRING | 4011 | Слишком длинная строка |
| ERR_REMAINDER_FROM_ZERO_DIVIDE | 4012 | Остаток от деления на ноль |
| ERR_ZERO_DIVIDE | 4013 | Деление на ноль |
| ERR_UNKNOWN_COMMAND | 4014 | Неизвестная команда |
| ERR_WRONG_JUMP | 4015 | Неправильный переход |
| ERR_NOT_INITIALIZED_ARRAY | 4016 | Неинициализированный массив |
| ERR_DLL_CALLS_NOT_ALLOWED | 4017 | Вызовы DLL не разрешены |
| ERR_CANNOT_LOAD_LIBRARY | 4018 | Невозможно загрузить библиотеку |
| ERR_CANNOT_CALL_FUNCTION | 4019 | Невозможно вызвать функцию |
| ERR_EXTERNAL_EXPERT_CALLS_NOT_ALLOWED | 4020 | Вызовы внешних библиотечных функций не разрешены |
| ERR_NOT_ENOUGH_MEMORY_FOR_RETURNED_STRING | 4021 | Недостаточно памяти для строки, возвращаемой из функции |
| ERR_SYSTEM_BUSY | 4022 | Система занята |
| ERR_INVALID_FUNCTION_PARAMETERS_COUNT | 4050 | Неправильное количество параметров функции |
| ERR_INVALID_FUNCTION_PARAMETER_VALUE | 4051 | Недопустимое значение параметра функции |
| ERR_STRING_FUNCTION_INTERNAL_ERROR | 4052 | Внутренняя ошибка строковой функции |
| ERR_SOME_ARRAY_ERROR | 4053 | Ошибка массива |
| ERR_INCORRECT_SERIES_ARRAY_USING | 4054 | Неправильное использование массива-таймсерии |
| ERR_CUSTOM_INDICATOR_ERROR | 4055 | Ошибка пользовательского индикатора |
| ERR_INCOMPATIBLE_ARRAYS | 4056 | Массивы несовместимы |
| ERR_GLOBAL_VARIABLES_PROCESSING_ERROR | 4057 | Ошибка обработки глобальныех переменных |
| ERR_GLOBAL_VARIABLE_NOT_FOUND | 4058 | Глобальная переменная не обнаружена |
| ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE | 4059 | Функция не разрешена в тестовом режиме |
| ERR_FUNCTION_NOT_CONFIRMED | 4060 | Функция не подтверждена |
| ERR_SEND_MAIL_ERROR | 4061 | Ошибка отправки почты |
| ERR_STRING_PARAMETER_EXPECTED | 4062 | Ожидается параметр типа string |
| ERR_INTEGER_PARAMETER_EXPECTED | 4063 | Ожидается параметр типа integer |
| ERR_DOUBLE_PARAMETER_EXPECTED | 4064 | Ожидается параметр типа double |
| ERR_ARRAY_AS_PARAMETER_EXPECTED | 4065 | В качестве параметра ожидается массив |
| ERR_HISTORY_WILL_UPDATED | 4066 | Запрошенные исторические данные в состоянии обновления |
| ERR_TRADE_ERROR | 4067 | Ошибка при выполнении торговой операции |
| ERR_END_OF_FILE | 4099 | Конец файла |
| ERR_SOME_FILE_ERROR | 4100 | Ошибка при работе с файлом |
| ERR_WRONG_FILE_NAME | 4101 | Неправильное имя файла |
| ERR_TOO_MANY_OPENED_FILES | 4102 | Слишком много открытых файлов |
| ERR_CANNOT_OPEN_FILE | 4103 | Невозможно открыть файл |
| ERR_INCOMPATIBLE_ACCESS_TO_FILE | 4104 | Несовместимый режим доступа к файлу |
| ERR_NO_ORDER_SELECTED | 4105 | Ни один ордер не выбран |
| ERR_UNKNOWN_SYMBOL | 4106 | Неизвестный символ |
| ERR_INVALID_PRICE_PARAM | 4107 | Неправильный параметр цены для торговой функции |
| ERR_INVALID_TICKET | 4108 | Неверный номер тикета |
| ERR_TRADE_NOT_ALLOWED | 4109 | Торговля не разрешена |
| ERR_LONGS_NOT_ALLOWED | 4110 | Длинные позиции не разрешены |
| ERR_SHORTS_NOT_ALLOWED | 4111 | Короткие позиции не разрешены |
| ERR_OBJECT_ALREADY_EXISTS | 4200 | Объект уже существует |
| ERR_UNKNOWN_OBJECT_PROPERTY | 4201 | Запрошено неизвестное свойство объекта |
| ERR_OBJECT_DOES_NOT_EXIST | 4202 | Объект не существует |
| ERR_UNKNOWN_OBJECT_TYPE | 4203 | Неизвестный тип объекта |
| ERR_NO_OBJECT_NAME | 4204 | Нет имени объекта |
| ERR_OBJECT_COORDINATES_ERROR | 4205 | Ошибка координат объекта |
| ERR_NO_SPECIFIED_SUBWINDOW | 4206 | Не найдено указанное подокно |
| ERR_SOME_OBJECT_ERROR | 4207 | Ошибка при работе с объектом |
Разбор полетов! Коды ошибок, их значения и способы устранения.
Разбор полетов! Коды ошибок, их значения и способы устранения.
Ввиду частых обращений ко мне, как специалисту в области программирования советников на мт4, с вопросами об ошибках, я попытаюсь Вам рассказать наиболее частые ошибки трейдера, и ошибки советников, способы их устранения и причины их возникновения.
Каждый советник имеет свой функциональный режим, но будем исходить из стандартного набора проблем и распространенных ошибок советников.
Итак начнем.
Краткая справка по ошибкам изложена в Коды Ошибок, а также в самом терминале MetaTrader4
Исходя из них — мы попробуем в стиле Руководства по ошибкам электронной техники описать проблему и способ ее решения.
Если Вашей ошибки нет в данной таблице, или способы решения не помогли, обратитесь к автору Вашего советника, но перед этим воспользуйтесь статьей Log файлы для детального рассмотрения проблемы с роботами* (Expforex Прибыльные советники — — Стратегии Форекс —)
ошибка 4, 146
Торговый сервер занят
1. Советник подал слишком много приказов одновременно
2. Не дождавшись ответа от сервера, при выполнении операции — советник пытается отправить новый приказ, Сервер перегружен
1. Перезагрузка терминала
2. Оптимизация кода советника с помощью функций обработки ошибок.
ошибка8, 141
Слишком частые запросы
1. Предыдущие причины ошибки, в сильно частом запросе.
ошибка129
Неправильная цена
1. Цена по которой Вы пытаетесь открыть позицию (BUY SELL)- неправильная
1. Золотое правило: BUY нужно открывать по Ask а закрывать по BID
SELL нужно открывать по BID а закрывать по ASK
ошибка130,145
Неправильные стопы
1. Стопы= Стоплосс, тейкпрофит или уровень открытия отложенника или лимитника.
2. Стопы расположены слишком близко к цене
3. Ваш счет открыт в группе ECN (ЕЦН) или NDD (НДД)
4. Ваш брокер использует Рыночное исполнение позиций
1. Проверьте значения Ваших стоплосс, тейпрофитов
2. Уточните минимальный стоп уровень по Вашему инструменту у брокера, при выставлении стопов — соблюдайте уровень минимальной дистанции
3. В хорошо написанном советнике должны быть функции работы на счетах ECN и NDD
ошибка131
Неправильный объем
1. Неправильный лот при открытии сделки
2. Лот, который вы пытаетесь открыть, меньше минимального
3. Лот, который вы пытаетесь открыть больше максимального
4. Разрядность лота отличается от разрядности брокера.
1. Проверьте правильность открытия лота, изучите спецификацию контракта и прочтите условия торговли в Вашем ДЦ
2.3. Проверьте, Минимальный и Максимальный лот в Вашем ДЦ и на Вашем счете. На некоторых типах счетов, минимальный лот может быть 0.01 а также 0.1 и даже 3. Максимальный лот может быть 5 лотов и 999 лотов и другие.
4. Уточните разрядность лотов на Вашем сервере. Если например разрядность лотов=1, то можно открыть лот 0.1 или 0.5 или 1.2 и так далее, с 1 знаком после запятой, если разрядность лота 2 знака, то исходя из минимального лота, лот может быть 0.01, 0.06, 0.17, 1.48. Также в некоторых ДЦ существует порядок степени лотов, например можно открыть 0.5 и 1 и 1.5 и так далее, а например 0.6 открыть нельзя. Уточните у своего брокера порядок установки лотов.
ошибка132
Рынок закрыт
1. Рынок закрыт в Выходные дни
1.Пробуйтесвязаться с рынком после выходных
ошибка133
Торговля запрещена
1. В данный момент торговля запрещена
2. По данной валютной паре запрещено торговать
1. Попробуйте торговать после выходных
ошибка134
Недостаточно денег для совершения операции
1. Лот, который Вы пытаетесь открыть, слишком большой, на него не хватает маржи
1. Проверьте уровень свободных средств, ирассчитайтесредства, которые Вам нужны, для открытия лота
2. Следите за уровнем Ваших свободных средств
ошибка135..138
Цена изменилась
1. Реквот
2. Слишком быстрый рынок
3. Брокер или ДЦ не дает Вам поставить позицию по заявленной цене
1. Не торгуйте в такие моменты
2. Увеличьте уровеньпроскальзывания, но помните что это влечет за собой открытие позиций не по заявленной Вами цене.
3. Сделайте в советнике функцию обработки ошибок и количество попыток открытия позиций
ошибка 147
Использование даты истечения ордера запрещено брокером
1. Ваш советник или Вы пытаетесь установить срок истечения отложенного ордера
1. В советнике, в функции OrderSend в параметре срок истечения поставьте=0
2. Не устанавливайте срок истечения ордера.
ошибка 148
Количество открытых и отложенных ордеров достигло предела, установленного брокером.
1. Максимальноеколичествооткрытых ордеров и позиций достигнут предела, установленного брокером.
1. Удалите или закройте часть позиций
2. Остановите процесс открытия новых позиций
3. Соблюдайте иерархию сделок, лучше открыть 1 позицию лото 0.1 одновременно, чем 10 позиций лотом 0.01 с потерей спреда.
ошибка 4012, 4013
zero devide
Остаток от деления на ноль
- Вы пытаетесь поделить число на 0.
- Проверьте Весь код советника на наличие такой грубой ошибки, или же проверьте все значения из MarketInfo функций на момент возвращения 0, иногда при MarketInfo(Symbol(),MODE_SPREAD) возвращается не спред а 0 (у брокеров с плавающим спредом)
ошибка 4017
Вызовы DLL не разрешены
- В Вашем терминале запрещен вызов DLL
- Разрешите вызов DLL через Меню – сервис – Настройки – Советник – Разрешить вызов DLL, но помните, разрешайте данную опцию только для советников, в которых Вы уверены, и уверены что в ДЛЛ не сидит какой-нибудь троян. Проверьте ДЛЛ на наличие троянов с помощью антивируса.
Ошибка 4018 , 4019
Невозможно загрузить библиотеку
- Библиотека повреждена
- Вызов библиотеки осуществляется с ошибкой
- Проверьте библиотеку DLL
- Обратитесь к разработчику данной библиотеки
Ошибка 4020
Вызовы внешних библиотечных функций не разрешены
- В Вашем терминале запрещен вызов функций из внешних экспертов
- Разрешите вызов функций через Меню – сервис – Настройки – Советник – Разрешить вызов внешних экспертов,
Ошибка 4103
Невозможно открыть файл
- Данный файл не существует
- Данный файл заблокирован
- Проверьте наличие указанного файла в папке experts – files
Tester – files
- Проверьте не заблокирован ли файл системой антивируса. Разрешен ли режим записичтения файла
Ошибка 4106
Неизвестный символ
- Символа нет в обзоре рынка
- В обзоре рынка – правой кнопкой мыши – показать все символы
- Проверить названия символа в советнике и наличие его в обзоре рынка
- Некоторые советники используют четкие названия без суфиксов, а брокеры намеренно ставят суфиксы, например EURUSDx где х – суфикс.
Ошибка 4108
Неверный номер тикета
- Тикет ордера, который выбирает эксперт – не существует
- Эксперт пытается выбрать тикет, но данный ордер был закрыт другим советником или руками.
- При попытке осуществления приказа над ордером, тикет был исполнен и закрыт брокером.
- Если данная ошибка появляется очень часто, 100-1000 раз за минуту, проверьте функции Вашего советника
- Отключите другие советники, или настройте их так, чтобы они не конфликтовали, не закрывайте ордер руками, когда эксперт выполняет операцию
Ошибка 4109
Торговля не разрешена
- Советнику запрещено торговать, на графике грустный смайл или крестик
- Включите галочку «Разрешить советнику торговать» в вкладе при установке советника, либо в меню- сервис – настройки – советники.
Ошибка 4110, 4111
Длинные позиции не разрешены
Короткие позиции не разрешены
- В настройках советника, в вкладке Общие не разрешен тип позиций
- В Вкладке Общие, при установке советника есть выбор позиций:
Long Short – Разрешены BUY SELL
Only Long– Разрешен BUY
Only Short – Разрешен SELL
НЕ ЗАБЫВАЕМ ГОВОРИТЬ СПАСИБО И НАЖИМАТЬ КНОПКУ

Компилятор оказывает некоторую помощь при написании корректных экспертов. После начала компиляции MetaEditor сообщит обо всех синтаксических ошибках в вашем коде. Но, к сожалению, помимо синтаксических ошибок ваш советник может содержать еще и логические ошибки, которые компилятор выловить не может. Поэтому этим нам придется заняться самим. Как это сделать — в нашем сегодняшнем материале.
MQL4 — Ошибки и как их исправить
Самые распространенные ошибки компиляции
При наличии ошибок в коде программа не может быть скомпилирована. Для полного контроля всех ошибок рекомендуется использовать строгий режим компиляции, который устанавливается директивой:
Этот режим значительно упрощает поиск ошибок. Теперь перейдем к самым распространенным ошибкам при компиляции.
Идентификатор совпадает с зарезервированным словом
Если наименование переменной или функции совпадает с одним из зарезервированных слов:
int char[]; // неправильно
int char1[]; // правильно
int char() // неправильно
{
return(0);
}
то компилятор выводит сообщения об ошибках:

Все функции должны обозначать действие. То есть это должен быть глагол. Например, OpenLongPosition() или ModifyStopLoss(). Ведь функции всегда именно что-то делают, верно?
Кроме того, функции желательно называть в так называемом CamelCase стиле. А переменные в cebab_case стиле. Это общепринятая практика.
Кстати, об именах переменных. Переменные — это существительные. Например, my_stop_loss, day_of_week, current_month. Не так страшно назвать переменную длинным именем, гораздо страшнее назвать ее непонятно. Что такое dow, индекс Dow Jones? Нет, это, оказывается, день недели. Конечно, сегодня вам и так понятно, что это за переменная. Но когда вы откроете код советника месяц спустя, все будет уже не так явно. А это время, упущенное на расшифровку посланий из прошлого – оно вам надо?
Специальные символы в наименованиях переменных и функций
Идем дальше. Если наименования переменных или функций содержат специальные символы ($, @, точка):
int $var1; // неправильно
int @var2; // неправильно
int var.3; // неправильно
void f@() // неправильно
{
return;
}
то компилятор выводит сообщения об ошибках:

Ошибки использования оператора switch
Старая версия компилятора позволяла использовать любые значения в выражениях и константах оператора switch:
void start()
{
double n=3.14;
switch(n)
{
case 3.14:
Print("Pi");
break;
case 2.7:
Print("E");
break;
}
}
В новом компиляторе выражения и константы оператора switch должны быть целыми числами, поэтому при использовании подобных конструкций возникают ошибки:

switch(MathMod(day_48, 10))
Вот так можно запросто решить проблему:
switch((int)MathMod(day_48, 10))
Возвращаемые значений функций
Все функции, кроме void, должны возвращать значение объявленного типа. Например:
При строгом режиме компиляции (strict) возникает ошибка:


Тогда при строгом режиме компиляции возникает ошибка:


Массивы в аргументах функций
Массивы в аргументах функций передаются только по ссылке. Раньше это было не так, поэтому в старых советниках можно встретить эту ошибку. Вот пример:
double ArrayAverage(double a[])
{
return(0);
}
Данный код при строгом режиме компиляции (strict) приведет к ошибке:


double ArrayAverage(double &a[])
{
return(0);
}
Кстати, константные массивы (Time[], Open[], High[], Low[], Close[], Volume[]) не могут быть переданы по ссылке. Например, вызов:
вне зависимости от режима компиляции приводит к ошибке:

//--- массив для хранения значений цен открытия double OpenPrices[]; //--- копируем значения цен открытия в массив OpenPrices[] ArrayCopy(OpenPrices,Open,0,0,WHOLE_ARRAY); //--- вызываем функцию ArrayAverage(OpenPrices);
Одна из самых распространенных ошибок – потеря советником индикатора. В таких случаях обычно пользователи эксперта на форумах гневно пишут: «Советник не работает!» или «Ставлю советник на график и ничего не происходит!». Решение этого вопроса на самом деле очень простое. Как всегда, достаточно просто заглянуть на вкладку «Журнал» терминала и обнаружить там запись вроде:
2018.07.08 09:15:44.957 2016.01.04 00:51 cannot open file 'C:Users1AppDataRoamingMetaQuotesTerminal MQL4indicatorsKELTNER_F12.ex4' [2]
Говорит это нам о том, что индикатор в папку положить забыли, или же он назван по-другому. Если индикатор отсутствует, нужно добавить его в папку с индикаторами. Если он есть, стоит проверить его название в коде советника – скорее всего там он называется по-другому.
Предупреждения компилятора
Предупреждения компилятора носят информационный характер и не являются сообщениями об ошибках, однако они указывают на возможные источники ошибок и лучше их скорректировать. Чистый код не должен содержать предупреждений.
Пересечения имен глобальных и локальных переменных
Если на глобальном и локальном уровнях присутствуют переменные с одинаковыми именами:
int i; // глобальная переменная
void OnStart()
{
int i=0,j=0; // локальные переменные
for (i=0; i<5; i++) {
j+=i;
}
PrintFormat("i=%d, j=%d",i,j);
}
то компилятор выводит предупреждение и укажет номер строки, на которой объявлена глобальная переменная:

Несоответствие типов
В следующем примере:
#property strict
void OnStart()
{
double a=7;
float b=a;
int c=b;
string str=c;
Print(c);
}
при строгом режиме компиляции при несоответствии типов компилятор выводит предупреждения:

Для исправления нужно использовать явное приведение типов:
#property strict
void OnStart()
{
double a=7;
float b=(float)a;
int c=(int)b;
string str=(string)c;
Print(c);
}
Неиспользуемые переменные
Наличие переменных, которые не используются в коде программы (лишние сущности) не является хорошим тоном.
void OnStart()
{
int i,j=10,k,l,m,n2=1;
for(i=0; i<5; i++) {j+=i;}
}
Сообщения о таких переменных выводятся вне зависимости от режима компиляции:

Диагностика ошибок при компиляции
Часто после написания программы возникают проблемы при компиляции, вызванные ошибками в коде. Это могут быть самые различные ошибки, но в любом случае возникает необходимость оперативного обнаружения участка кода, где допущена ошибка.
Нередко у людей уходит немало времени и масса нервов на поиски какой-нибудь лишней скобки. Однако, есть способ быстрого обнаружения ошибок, который основан на использовании комментирования.
Написать достаточно большой код без единой ошибки – очень приятно. Но, к сожалению, так получается не часто. Я не рассматриваю здесь ошибки, которые приводят к неверному исполнению кода. Здесь пойдёт речь об ошибках, из-за которых становится невозможной компиляция.
Весьма распространённые ошибки – вставка лишней скобки в сложном условии, нехватка скобки, не выставление двоеточия, запятой при объявлении переменных, опечатка в названии переменной и так далее. Часто при компиляции можно сразу увидеть, в какой строке допущена подобная ошибка. Но бывают и случаи, когда найти такую ошибку не так просто. Ни компилятор, ни зоркий глаз нам не могут помочь сразу найти ошибку. В таких случаях, как правило, начинающие программисты начинают «обходить» весь код, пытаясь визуально определить ошибку. И снова, и снова, пока выдерживают нервы.
Однако MQL, как и другие языки программирования, предлагает отличный инструмент – комментирование. Используя его, можно отключать какие-то участки кода. Обычно комментирование используют именно для вставки каких-то комментариев, или же отключения неиспользуемых участков кода. Комментирование можно также успешно применять и при поиске ошибок.
Поиск ошибок обычно сводится к определению участка кода, где допущена ошибка, а затем, в этом участке, визуально находится ошибка. Думаю, вряд ли кто-то будет сомневаться в том, что исследовать «на глаз» 5-10 строчек кода проще и быстрей, чем 100-500, а то и несколько тысяч.
При использовании комментирования задача предельно проста. Сначала нужно закомментировать различные участки кода (иногда чуть ли не весь код), тем самым «отключив» его. Затем, по очереди, комментирование снимается с этих участков кода. После очередного снятия комментирования совершается попытка компиляции. Если компиляция прошла успешно – ошибка не в этом участке кода. Затем открывается следующий участок кода и так далее. Когда находится проблемный участок кода, визуально ищется ошибка, затем устраняется. Опять происходит попытка компиляции. Если всё прошло успешно, ошибка устранена.
Важно правильно определять участки кода, которые необходимо комментировать. Если это условие (или иная логическая конструкция), то оно должно комментироваться полностью. Если комментируется участок кода, где объявляются переменные, важно, чтобы не был открыт участок, где происходит обращение к этим переменным. Иначе говоря — комментирование должно применяться по логике программирования. Несоблюдения такого подхода приводит к возникновению новых, вводящих в заблуждение, ошибок при компиляции.

Ошибки времени выполнения
Ошибки, возникающие в процессе исполнения кода программы, принято называть ошибками времени выполнения (runtime errors). Такие ошибки обычно зависят от состояния программы и связаны с некорректными значениями переменных.
Например, если переменная используется в качестве индекса элементов массива, то ее отрицательные значения неизбежно приведут к выходу за пределы массива.
Выход за пределы массива (Array out of range)
Эта ошибка часто возникает в индикаторах при обращении к индикаторным буферам. Функция IndicatorCounted() возвращает количество баров, не изменившихся после последнего вызова индикатора. Значения индикаторов на уже рассчитанных ранее барах не нуждаются в пересчете, поэтому для ускорения расчетов достаточно обрабатывать только несколько последних баров.
Большинство индикаторов, в которых используется данный способ оптимизации вычислений, имеют такой вид:
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//--- иногда для расчета требуется не менее N баров (например, 100)
// если на графике нет такого количества баров (например, на таймфрейме MN)
if (Bars<100) {
return(-1); // прекращаем расчет и выходим досрочно
}
//--- количество баров, не изменившихся с момента последнего вызова индикатора
int counted_bars=IndicatorCounted();
//--- в случае ошибки выходим
if (counted_bars<0) {
return(-1);
}
//--- позиция бара, с которого начинается расчет в цикле
int limit=Bars-counted_bars;
//--- если counted_bars=0, то начальную позицию в цикле нужно уменьшить на 1,
if (counted_bars==0) {
limit--; // чтобы не выйти за пределы массива при counted_bars==0
//--- в расчетах используется смещение на 10 баров вглубь
//--- истории, поэтому добавим это смещение при первом расчете
limit-=10;
} else {
//--- индикатор уже рассчитывался ранее, counted_bars>0
//--- при повторных вызовах увеличим limit на 1, чтобы
//--- гарантированно обновлять значения индикатора для последнего бара
limit++;
}
//--- основной цикл расчета
for (int i=limit; i>0; i--) {
// используются значения баров, уходящих вглубь истории на 5 и 10
Buff1[i]=0.5*(Open[i+5]+Close[i+10])
}
}
Часто встречается некорректная обработка случая counted_bars==0 (начальную позицию limit нужно уменьшить на значение, равное 1 + максимальный индекс относительно переменной цикла).
Также следует помнить о том, что в момент исполнения функции start() мы можем обращаться к элементам массивов индикаторных буферов от 0 до Bars()-1. Если есть необходимость работы с массивами, которые не являются индикаторными буферами, то их размер следует увеличить при помощи функции ArrayResize() в соответствии с текущим размером индикаторных буферов. Максимальный индекс элемента для адресации также можно получить вызовом ArraySize() с одним из индикаторных буферов в качестве аргумента.
Деление на ноль (Zero divide)
Ошибка «Zero divide» возникает в случае, если при выполнении операции деления делитель оказывается равен нулю:
void OnStart()
{
int a=0, b=0,c;
c=a/b;
Print("c=",c);
}
При выполнении данного скрипта во вкладке «Эксперты» возникает сообщение об ошибке и завершении работы программы:

Самый простой способ — проверять делитель перед операцией деления и выводить сообщение о некорректном значении параметра:
void OnStart()
{
int a=0, b=0,c;
if (b!=0) {
c=a/b; Print(c);
} else {
Print("Error: b=0");
return;
}
}
В результате критической ошибки не возникает, но выводится сообщение о некорректном значении параметра и работа завершается:

В старой версии компилятора допускалось использование 0 (нуля) в качестве аргумента в функциях, требующих указания финансового инструмента.
Например, значение технического индикатора Moving Average для текущего символа можно было запрашивать следующим образом:
AlligatorJawsBuffer[i]=iMA(0,0,13,8,MODE_SMMA,PRICE_MEDIAN,i); // неправильно
В новом компиляторе для указания текущего символа нужно явно указывать NULL:
AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i); // правильно
Кроме того, текущий символ и период графика можно указать при помощи функций Symbol() и Period().
AlligatorJawsBuffer[i]=iMA(Symbol(),Period(),13,8,MODE_SMMA,PRICE_MEDIAN,i); // правильно
Еще лучше, если вы будете использовать предопределенные переменные _Symbol и _Period – они обрабатываются быстрее:
AlligatorJawsBuffer[i]=iMA(_Symbol,_Period,13,8,MODE_SMMA,PRICE_MEDIAN,i); // правильно
Строки в формате Unicodе и их использование в DLL
Строки представляют собой последовательность символов Unicode. Следует учитывать этот факт и использовать соответствующие функции Windows. Например, при использовании функций библиотеки wininet.dll вместо InternetOpenA() и InternetOpenUrlA() следует вызывать InternetOpenW() и InternetOpenUrlW(). При передаче строк в DLL следует использовать структуру MqlString:
#pragma pack(push,1)
struct MqlString
{
int size; // 32-битное целое, содержит размер распределенного для строки буфера
LPWSTR buffer; // 32-разрядный адрес буфера, содержащего строку
int reserved; // 32-битное целое, зарезервировано, не использовать
};
#pragma pack(pop,1)
Совместное использование файлов
При открытии файлов необходимо явно указывать флаги FILE_SHARE_WRITE и FILE_SHARE_READ для совместного использования.
В случае их отсутствия, файл будет открыт в монопольном режиме, что не позволит больше никому его открывать, пока он не будет закрыт монополистом.
Например, при работе с оффлайновыми графиками требуется явно указывать флаги совместного доступа:
// 1-st change - add share flags
ExtHandle=FileOpenHistory(c_symbol+i_period+".hst",
FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
Особенность преобразования datetime
Следует иметь ввиду, что преобразование типа datetime в строку зависит от режима компиляции:
datetime date=D'2014.03.05 15:46:58'; string str="mydate="+date; //--- str="mydate=1394034418" - без директивы #property strict //--- str="mydate=2014.03.05 15:46:58" - с директивой #property strict
Например, попытка работы с файлами, имя которых содержит двоеточие, приведет к ошибке.
Обработка ошибок времени выполнения
Так как без использования встроенных пользовательских функций не сможет обойтись ни один торгующий эксперт, то в первую очередь попытаемся упростить себе жизнь при анализе ошибок, возвращаемых этими функциями.
В наборе «из коробки» доступны некоторые библиотеки для упрощения написания советников, в том числе и для работы с ошибками. Хранятся они в папке MQL4/Include:

- stderror.mqh — содержит константы для номера каждой ошибки;
- stdlib.mqh — содержит несколько вспомогательных функций, в том числе и функцию возврата описания ошибки в виде строки:
string ErrorDescription(int error_code)
Поэтому подключим в наш проект обе эти библиотеки:
#include <stderror.mqh> #include <stdlib.mqh>
Сами описания ошибок находятся в файле MQL4/Library/stdlib.mql4 и они на английском языке. Поэтому, если вы против иностранных языков, всегда можно переписать описания на свой родной.
Еще одна встроенная необходимая нам функция — GetLastError(). Именно она возвращает коды ошибок в виде целого числа (int), который мы потом будем обрабатывать. Сами коды ошибок и их описания на русском можно посмотреть в руководстве по mql4 от MetaQuotes. Оттуда же можно взять информацию для перевода файла stdlib.mql4 на русский.
Теперь, когда мы подключили необходимые библиотеки, рассмотрим результаты работы функций, непосредственно связанных с торговыми операциями, так как игнорирование сбоев в этих функциях может привести к критическим для бота последствиям.
К сожалению, средствами MQL4 нельзя написать обобщенную библиотеку для обработки всех возможных ошибочных ситуаций. В каждом отдельном случае придется обрабатывать ошибки отдельно. Но не все так плохо, – многие ошибки не нужно обрабатывать, их достаточно исключить на этапе разработки и тестирования эксперта, хотя для этого и нужно вовремя узнать об их наличии.
Рассмотрим для примера две типичные для экспертов на MQL4 ошибки:
- Ошибка 130 — ERR_INVALID_STOPS
- Ошибка 146 — ERR_TRADE_CONTEXT_BUSY
Одним из случаев, когда возникает первая ошибка, является попытка эксперта выставить отложенный ордер слишком близко к рынку. Ее наличие может серьезно ухудшить показатели эксперта в некоторых случаях. Например, допустим эксперт, открыв прибыльную позицию, поджимает прибыль каждые 150 пунктов. Если при очередной такой попытке возникнет ошибка 130, а цена безвозвратно вернется к предыдущему уровню стопа, эксперт может лишить вас законной прибыли. Несмотря на возможность таких последствий, данную ошибку можно исключить в корне, доработав код эксперта так, чтобы он учитывал минимальное допустимое расстояние между ценой и стопами.
Вторую ошибку, связанную с занятостью торгового контекста терминала, полностью исключить не получится. При работе нескольких экспертов в одном терминале всегда возможна ситуация, когда один из экспертов попытается открыть позицию, пока другой все еще делает то же самое. Следовательно, такую ошибку всегда нужно обрабатывать.
Таким образом, мы всегда должны быть в курсе, если какая-то из используемых встроенных функций возвращает ошибку во время работы эксперта. Добиться этого можно, используя следующую нехитрую вспомогательную функцию:
void logError(string functionName, string msg, int errorCode = -1)
{
Print("ERROR: in " + functionName + "()");
Print("ERROR: " + msg );
int err = GetLastError();
if (errorCode != -1) {
err = errorCode;
}
if (err != ERR_NO_ERROR) {
Print("ERROR: code=" + err + " - " + ErrorDescription( err ));
}
}
Использовать ее мы будем следующим образом:
void openLongTrade()
{
int ticket = OrderSend(Symbol(), OP_BUY, 1.0, Ask + 5, 5, 0, 0);
if (ticket == -1) {
logError("openLongTrade", "could not open order");
}
}
Конечно, это упрощенный пример. Для написания более грамотных функций открытия, закрытия и модификации ордеров смотрите этот урок.
Первым параметром в функцию logError() передается имя функции, в которой была обнаружена ошибка, в нашем примере — в функции openLongTrade(). Если наш эксперт вызывает функцию OrderSend() в нескольких местах, это позволит нам точно установить, в каком из них произошла ошибка. Вторым параметром передается описание ошибки, чтобы можно было понять, где именно внутри функции openLongTrade() была обнаружена ошибка. Это может быть как краткое описание ошибки, так и более развернутое, с перечислением значений всех параметров, переданных во встроенную функцию.
Я предпочитаю последний вариант, так как при возникновении ошибки можно сразу получить всю необходимую для анализа информацию. Для примера допустим, что до вызова OrderSend() текущая цена успела сильно отклониться от последней известной нам цены. В результате при выполнении этого примера произойдет ошибка и в протоколе работы эксперта появятся следующие строки:
ERROR: in openLongTrade() ERROR: could not open order ERROR: code=138 - requote
То есть сразу будет видно:
- в какой функции произошла ошибка;
- к чему она относится (в данном случае — к попытке открыть позицию);
- какая именно ошибка возникла (код ошибки и ее описание).
Теперь рассмотрим третий, необязательный, параметр функции logError(). Он необходим в тех случаях, когда мы хотим обработать конкретный вид ошибки, а об остальных будем отчитываться в протоколе работы эксперта, как и прежде:
void updateStopLoss(double newStopLoss)
{
bool modified = OrderModify(OrderTicket(), OrderOpenPrice(),
newStopLoss, OrderTakeProfit(), OrderExpiration());
if (!modified) {
int errorCode = GetLastError();
if (errorCode != ERR_NO_RESULT ) {
logError("updateStopLoss", "failed to modify order", errorCode);
}
}
}
Здесь в функции updateStopLoss() вызывается встроенная функция OrderModify(). Эта функция несколько отличается в плане обработки ошибок от OrderSend(). Если ни один из параметров изменяемого ордера не отличается от его текущих параметров, то функция вернет ошибку ERR_NO_RESULT. Если в нашем эксперте такая ситуация допустима, то мы должны игнорировать конкретно эту ошибку. Для этого мы анализируем значение, возвращаемое GetLastError(). Если произошла ошибка с кодом ERR_NO_RESULT, то мы ничего не выводим в протокол.
Однако если произошла другая ошибка, то необходимо полностью отрапортовать о ней, как мы делали это раньше. Именно для этого мы сохраняем результат функции GetLastError() в промежуточной переменной и передаем его третьим параметром в функцию logError(). Дело в том, что встроенная функция GetLastError() автоматически обнуляет код последней ошибки после своего вызова. Если бы мы не передали код ошибки явно в logError(), то в протоколе была бы отражена ошибка с кодом 0 и описанием «no error».
Похожие действия необходимо совершать и при обработке других ошибок, например, реквотов. Основная идея заключается в том, чтобы обрабатывать только ошибки, требующие обработки, а остальные передавать в функцию logError(). Тогда мы всегда будем в курсе, если во время работы эксперта произошла непредвиденная ошибка. Проанализировав логи, мы сможем решить, требует ли данная ошибка отдельной обработки или же ее можно исключить, доработав код эксперта. Такой подход часто заметно упрощает жизнь и сокращает время, уходящее на борьбу с ошибками.
Диагностика логических ошибок
Логические ошибки в коде эксперта могут доставить много проблем. Отсутствие возможности пошаговой отладки экспертов делают борьбу с такими ошибками не очень приятным занятием. Основным средством для диагностики этого на данный момент является встроенная функция Print(). С ее помощью можно выполнять распечатку текущих значений важных переменных, а также протоколировать ход работы эксперта прямо в терминале во время тестирования. При отладке эксперта во время тестирования с визуализацией также может помочь встроенная функция Comment(), которая выводит сообщения на график. Как правило, убедившись, что эксперт работает не так, как было задумано, приходится добавлять временные вызовы функции Print() и протоколировать внутреннее состояние эксперта в предполагаемых местах возникновения ошибки.
Однако, для обнаружения сложных ошибочных ситуаций порой приходится добавлять десятки таких вызовов функции Print(), а после обнаружения и устранения проблемы их приходится удалять или комментировать, чтобы не загромождался код эксперта и не замедлялось его тестирование. Ситуация ухудшается, если в коде эксперта функция Print() уже используется для периодического протоколирования различных состояний. Тогда удаление временных вызовов Print() не удается выполнить путем простого поиска фразы ‘Print’ в коде эксперта. Приходится задумываться, чтобы не удалить еще и полезные вызовы этой функции.
Например, при протоколировании ошибок функций OrderSend(), OrderModify() и OrderClose() полезным бывает печатать в протокол текущее значение переменных Bid и Ask. Это несколько облегчает распознавание причин таких ошибок, как ERR_INVALID_STOPS и ERR_OFF_QUOTES.
Чтобы выделить такие диагностические выводы в протокол, я рекомендую использовать такую вспомогательную функцию:
void logInfo(string msg)
{
Print("INFO: " + msg);
}
Это желательно сделать по нескольким причинам. Во-первых, теперь такие вызовы не будут попадаться при поиске ‘Print’ в коде эксперта, ведь искать мы будем logInfo. Во-вторых, у этой функции есть еще одна полезная особенность, о которой мы поговорим чуть позже.
Добавление и удаление временных диагностических вызовов функции Print() отнимает у нас драгоценное время. Поэтому я предлагаю рассмотреть еще один подход, который эффективен при обнаружении логических ошибок в коде и позволяет немного сэкономить наше время. Рассмотрим следующую несложную функцию:
void openLongTrade(double stopLoss)
{
int ticket = OrderSend(Symbol(), OP_BUY, 1.0, Ask, 5, stopLoss, 0);
if (ticket == -1) {
logError("openLongTrade", "could not open order");
}
}
В данном случае, так как мы открываем длинную позицию, совершенно очевидно, что при нормальной работе эксперта значение параметра stopLoss никогда не будет больше или равно текущей цене Bid. То есть, при вызове функции openLongTrade() всегда выполняется условие stopLoss < Bid. Так как мы знаем об этом еще на этапе написания рассматриваемой функции, то мы сразу же можем этим воспользоваться следующим образом:
void openLongTrade( double stopLoss )
{
assert("openLongTrade", stopLoss < Bid, "stopLoss < Bid");
int ticket = OrderSend(Symbol(), OP_BUY, 1.0, Ask, 5, stopLoss, 0);
if (ticket == -1) {
logError("openLongTrade", "could not open order");
}
}
То есть мы логируем наше утверждение в коде при помощи новой вспомогательной функции assert(). Сама функция выглядит довольно просто:
void assert(string functionName, bool assertion, string description = "")
{
if (!assertion) {
Print("ASSERT: in " + functionName + "() - " + description);
}
}
Первым параметром функции является ее имя, в котором проверяется наше условие (по аналогии с функцией logError()). Вторым параметром передается результат проверки этого условия. И третьим параметром передается его описание. В результате, если ожидаемое условие не выполняется, в протокол будет выведена следующая информация:
- название функции, в которой условие было нарушено;
- описание нарушенного условия.
В качестве описания можно передавать, например, само условие, а можно выводить и более подробное описание, содержащее значения контролируемых переменных на момент проверки условия, если это поможет разобраться в причинах ошибки.
Конечно же, рассмотренный пример максимально упрощен. Но, надеюсь, основную идею отражает достаточно хорошо. В процессе наращивания функциональности эксперта мы отдаем себе отчет в том, как он должен работать и какие состояния и входные параметры функций допустимы, а какие нет. Фиксируя это в коде эксперта при помощи функции assert() мы получаем ценную информацию о месте, в котором нарушается логика работы эксперта. Более того, мы частично избавляем себя от необходимости добавлять и удалять временные вызовы функции Print(), так как функция assert() выдает диагностические сообщения в протокол только в момент обнаружения несоответствий в ожидаемых нами условиях.
Еще одним полезным приемом является использование этой функции перед каждой операцией деления. Дело в том, что иногда в результате той или иной логической ошибки иногда происходит деление на ноль. Работа эксперта в этом случае прекращается, а в протоколе появляется одна лишь строка с печальным диагнозом: ‘zero divide’. Узнать, в каком именно месте произошла эта ошибка, если операция деления используется в коде неоднократно, достаточно сложно. Вот здесь и поможет функция assert(). Вставляем соответствующие проверки перед каждой операцией деления:
assert("buildChannel", distance > 0, "distance > 0");
double slope = delta / distance;
И теперь, в случае деления на ноль, достаточно будет лишь взглянуть в логи, чтобы узнать, в каком именно месте произошла ошибка.
Обработка состояний
Во время работы эксперта на вашем счете могут возникнуть некоторые ситуации, которые не являются ошибками – так называемые состояния эксперта. Такие состояния не являются ошибками, но все же их стоит логировать. В этом помогают специальные функции языка mql4.
Функция IsExpertEnabled() возвращает информацию о возможности запуска экспертов. Функция вернет true, если в клиентском терминале разрешен запуск экспертов, иначе возвращает false. В случае возврата false полезно будет известить об этом пользователя с просьбой включить соответствующую настройку. Пример:
void OnStart()
{
if (!IsExpertEnabled() {
//советникам не разрешено торговать
Alert("Attention! Please press the "Expert Advisors" button in MT4");
}
//рабочий алгоритм советника
return;
}
Если эксперт использует внешние библиотеки, пригодится функция IsLibrariesAllowed(). Она возвращает true, если эксперт может вызвать библиотечную функцию, иначе возвращает false.
Если библиотека в виде dll файла, пригодится функция IsDllsAllowed(). Также нелишним будет проверить, есть ли вообще возможность торговать при помощи экспертов с помощью функции IsTradeAllowed().
Если вы хотите узнать, является ли счет демонстрационным, или же реальным, можно использовать функцию IsDemo().
Все вышеперечисленные проверки стоит сделать в функции OnInit().
Конечно же, стоит проверять периодически связь с сервером. В этом поможет функция IsConnected().
Следующие три функции помогут определить, в каком режиме находится советник. Если IsOptimisation() возвращает true, проводится оптимизация, если IsTesting(), то тестирование, IsVisualMode() – тестирование в режиме визуализации. Под каждый из этих вариантов в советнике может быть предусмотрена своя логика. Например, для режима визуализации можно что-то выводить на график (и не выводить в других режимах ради экономии ресурсов). В режиме тестирования можно выводить отладочную информацию, в режиме оптимизации максимально облегчить код, чтобы сэкономить время.
И последняя функция – IsTradeContextBusy(). Она вернет true, если поток для выполнения торговых операций занят. Это бывает полезно при совершении экспертом торговых операций. Можно применить функцию Sleep для ожидания некоторого момента и новой попытки.
Еще одна полезная функция — UninitializeReason()
int deinit()
{
switch(UninitializeReason())
{
case REASON_CHARTCLOSE:
case REASON_REMOVE:
CleanUp();
break; // очистка и освобождение ресурсов.
case REASON_RECOMPILE:
case REASON_CHARTCHANGE:
case REASON_PARAMETERS:
case REASON_ACCOUNT:
StoreData();
break; // подготовка к рестарту.
}
//...
}
Можно также логировать причину выхода советника.
Коды самых распространенных ошибок и их вероятное решение
| № ошибки | Значение | Проблема | Решение |
| 4, 146 | Торговый сервер занят | Советник подал слишком много приказов одновременно или не дождавшись ответа от сервера, при выполнении операции — советник пытается отправить новый приказ | Перезагрузка терминала или оптимизация кода советника с помощью функций обработки ошибок |
| 8, 141 | Слишком частые запросы | Предыдущие причины ошибки, в сильно частом запросе | Аналогичное решение |
| 129 | Неправильная цена | Цена по которой Вы пытаетесь открыть позицию (BUY или SELL) неправильная | BUY нужно открывать по Ask а закрывать по BID; SELL нужно открывать по BID а закрывать по ASK |
| 130, 145 | Неправильные стопы | Стоп лосс, тейк профит или уровень открытия отложки или лимитника неверные. Стопы расположены слишком близко к цене. Ваш счет открыт в группе ECN (ЕЦН) или NDD (НДД), что не дает сразу выставлять стопы |
Проверьте значения Ваших стоп лоссов, тейк профитов, уточните минимальный стоп уровень по Вашему инструменту у брокера, при выставлении стопов — соблюдайте уровень минимальной дистанции. В хорошо написанном советнике должны быть функции работы на счетах ECN и NDD – это происходит путем модификации ордера уже после его открытия |
| 131 | Неправильный объем | Неправильный лот при открытии сделки, или меньше минимального (больше максимального). Разрядность лота тоже может отличаться от разрядности брокера | Проверьте правильность открытия лота, изучите спецификацию контракта и прочтите условия торговли в Вашем ДЦ, проверьте минимальный и максимальный лот в Вашем ДЦ и на Вашем счете |
| 132 | Рынок закрыт | Рынок закрыт на выходные дни | Пробуйте связаться с рынком после выходных |
| 133 | Торговля запрещена | В данный момент торговля запрещена | По данной валютной паре запрещено торговать – в конкретный момент времени или вообще. Часто у брокеров есть перерыв в несколько минут в полночь |
| 134 | Недостаточно денег для совершения операции | Лот, который Вы пытаетесь открыть, слишком большой, на него не хватает маржи | Проверьте уровень свободных средств и рассчитайте средства, которые Вам нужны для открытия лота, следите за уровнем Ваших свободных средств |
| 135-138 | Цена изменилась | Реквот, слишком быстрый рынок (новости), Брокер или ДЦ не дает Вам поставить позицию по заявленной цене | Не торгуйте в такие моменты, увеличьте уровень проскальзывания, но помните, что это влечет за собой открытие позиций не по заявленной Вами цене. Предусмотрите в советнике функцию обработки ошибок и количество попыток открытия позиций |
| 147 | Использование даты истечения ордера запрещено брокером | Ваш советник или Вы пытаетесь установить срок истечения отложенного ордера | В советнике, в функции OrderSend в параметре срок истечения поставьте 0 (ноль). Не устанавливайте срок истечения ордера |
| 148 | Количество открытых и отложенных ордеров достигло предела, установленного брокером | Максимальное количество открытых ордеров и позиций достигло предела, установленного брокером | Удалите или закройте часть позиций. Остановите процесс открытия новых позиций |
| 4012, 4013 | Остаток от деления на ноль | Вы пытаетесь поделить число на 0 (ноль) | Проверьте код советника на наличие ошибки, или же проверьте все значения из MarketInfo функций на момент возвращения 0, иногда при MarketInfo(Symbol(),MODE_SPREAD) возвращается не спред, а 0 (у брокеров с плавающим спредом) |
| 4017 | Вызовы DLL не разрешены | В Вашем терминале запрещен вызов DLL | Разрешите вызов DLL через Меню – сервис – Настройки – Советник – Разрешить вызов DLL |
| 4018, 4019 | Невозможно загрузить библиотеку | Библиотека повреждена или ее вызов завершается с ошибкой, возможно она вообще отсутствует | Проверьте библиотеку DLL |
| 4020 | Вызовы внешних библиотечных функций не разрешены | В Вашем терминале запрещен вызов функций из внешних экспертов | Разрешите вызов функций через Меню – сервис – Настройки – Советник – Разрешить вызов внешних экспертов |
| 4103 | Невозможно открыть файл | Данный файл не существует или заблокирован другим процессом | Проверьте наличие указанного файла. Проверьте, не заблокирован ли файл системой антивируса, разрешен ли режим записи-чтения файла |
| 4106 | Неизвестный символ | Символа нет в обзоре рынка | В обзоре рынка – правой кнопкой мыши – показать все символы. Проверить названия символа в советнике и наличие его в обзоре рынка. Некоторые советники используют четкие названия без суффиксов, а брокеры намеренно ставят суффиксы, например EURUSDx где х – суффикс |
| 4108 | Неверный номер тикета | Тикет ордера, который выбирает эксперт – не существует. Эксперт пытается выбрать тикет, но данный ордер был закрыт другим советником или руками. При попытке осуществления приказа над ордером, тикет был исполнен и закрыт брокером | Если данная ошибка появляется очень часто, 100-1000 раз за минуту, проверьте функции Вашего советника. Отключите другие советники или настройте их так, чтобы они не конфликтовали, не закрывайте ордер руками, когда эксперт выполняет операцию. Иногда такое случается, когда несколько советников используют одинаковый MagicNumber |
| 4109 | Торговля не разрешена | Советнику запрещено торговать, на графике грустный смайл или крестик | Включите галочку «Разрешить советнику торговать» во вкладе при установке советника, либо в меню — сервис – настройки – советники |
| 4110, 4111 | Длинные/короткие позиции не разрешены | В настройках советника, во вкладке Общие не разрешен тип позиций | Во вкладке Общие, при установке советника, есть выбор позиций, разрешенных к открытию |
Заключение
Рассмотренные вспомогательные функции и несложные приемы позволяют заметно упростить и ускорить процесс обнаружения и исправления ошибок в коде торговых экспертов, написанных на языке программирования MQL4. Грамотное написание кода и функций для логирования и сопровождения работы советника существенно ускоряют процесс его разработки.
Тема на форуме
С уважением, Дмитрий аkа Silentspec
TradeLikeaPro.ru
Содержание
- 1 Коды ошибок:
- 1.1 Коды ошибок выполнения MQL4 программы:
- 1.2 Похожие статьи:
Очень часто в торговом терминале возникают ошибки при тестировании или оптимизации советников форекс, все ошибки можно увидеть в лог-файлах МТ4, а вот что означают коды ошибок, мы рассмотрим в этой статье:
Ниже представлена таблица кодов ошибок и их описание, поэтому просмотрев таблицу вы сразу поймете что не так с советником или его параметрами и на какой параметр нужно обратить внимание при тестировании, чтоб исправить ошибку.
Так, например, если при тесте возникает ошибка error 130, то становится понятно, что функция советника пытается изменить или установить стоп-лосс или тейк-профит слишком близко к текущей цене на рынке, ближе чем разрешает ваш БРОКЕР ФОРЕКС.
Коды ошибок:
GetLastError() — функция, возвращающая коды ошибок при тесте. Кодовые константы ошибок определены в файле stderror.mqh. Для вывода текстовых сообщений следует использовать функцию ErrorDescription(), определенную в файле stdlib.mqh.
Коды ошибок, возвращаемые торговым сервером или клиентским терминалом MetaTrader 4:
| Значение | Описание |
|---|---|
| 0 | Нет ошибки |
| 1 | Нет ошибки, но результат неизвестен |
| 2 | Общая ошибка |
| 3 | Неправильные параметры |
| 4 | Торговый сервер занят |
| 5 | Старая версия клиентского терминала |
| 6 | Нет связи с торговым сервером |
| 7 | Недостаточно прав |
| 8 | Слишком частые запросы |
| 9 | Недопустимая операция нарушающая функционирование сервера |
| 64 | Счет заблокирован |
| 65 | Неправильный номер счета |
| 128 | Истек срок ожидания совершения сделки |
| 129 | Неправильная цена |
| 130 | Неправильные стопы |
| 131 | Неправильный объем |
| 132 | Рынок закрыт |
| 133 | Торговля запрещена |
| 134 | Недостаточно денег для совершения операции |
| 135 | Цена изменилась |
| 136 | Нет цен |
| 137 | Брокер занят |
| 138 | Новые цены |
| 139 | Ордер заблокирован и уже обрабатывается |
| 140 | Разрешена только покупка |
| 141 | Слишком много запросов |
| 145 | Модификация запрещена, так как ордер слишком близок к рынку |
| 146 | Подсистема торговли занята |
| 147 | Использование даты истечения ордера запрещено брокером |
| 148 | Количество открытых и отложенных ордеров достигло предела, установленного брокером. |
Коды ошибок выполнения MQL4 программы:
| Значение | Описание |
|---|---|
| 4000 | Нет ошибки |
| 4001 | Неправильный указатель функции |
| 4002 | Индекс массива — вне диапазона |
| 4003 | Нет памяти для стека функций |
| 4004 | Переполнение стека после рекурсивного вызова |
| 4005 | На стеке нет памяти для передачи параметров |
| 4006 | Нет памяти для строкового параметра |
| 4007 | Нет памяти для временной строки |
| 4008 | Неинициализированная строка |
| 4009 | Неинициализированная строка в массиве |
| 4010 | Нет памяти для строкового массива |
| 4011 | Слишком длинная строка |
| 4012 | Остаток от деления на ноль |
| 4013 | Деление на ноль |
| 4014 | Неизвестная команда |
| 4015 | Неправильный переход |
| 4016 | Неинициализированный массив |
| 4017 | Вызовы DLL не разрешены |
| 4018 | Невозможно загрузить библиотеку |
| 4019 | Невозможно вызвать функцию |
| 4020 | Вызовы внешних библиотечных функций не разрешены |
| 4021 | Недостаточно памяти для строки, возвращаемой из функции |
| 4022 | Система занята |
| 4050 | Неправильное количество параметров функции |
| 4051 | Недопустимое значение параметра функции |
| 4052 | Внутренняя ошибка строковой функции |
| 4053 | Ошибка массива |
| 4054 | Неправильное использование массива-таймсерии |
| 4055 | Ошибка пользовательского индикатора |
| 4056 | Массивы несовместимы |
| 4057 | Ошибка обработки глобальныех переменных |
| 4058 | Глобальная переменная не обнаружена |
| 4059 | Функция не разрешена в тестовом режиме |
| 4060 | Функция не подтверждена |
| 4061 | Ошибка отправки почты |
| 4062 | Ожидается параметр типа string |
| 4063 | Ожидается параметр типа integer |
| 4064 | Ожидается параметр типа double |
| 4065 | В качестве параметра ожидается массив |
| 4066 | Запрошенные исторические данные в состоянии обновления |
| 4067 | Ошибка при выполнении торговой операции |
| 4099 | Конец файла |
| 4100 | Ошибка при работе с файлом |
| 4101 | Неправильное имя файла |
| 4102 | Слишком много открытых файлов |
| 4103 | Невозможно открыть файл |
| 4104 | Несовместимый режим доступа к файлу |
| 4105 | Ни один ордер не выбран |
| 4106 | Неизвестный символ |
| 4107 | Неправильный параметр цены для торговой функции |
| 4108 | Неверный номер тикета |
| 4109 | Торговля не разрешена |
| 4110 | Длинные позиции не разрешены |
| 4111 | Короткие позиции не разрешены |
| 4200 | Объект уже существует |
| 4201 | Запрошено неизвестное свойство объекта |
| 4202 | Объект не существует |
| 4203 | Неизвестный тип объекта |
| 4204 | Нет имени объекта |
| 4205 | Ошибка координат объекта |
| 4206 | Не найдено указанное подокно |
| 4207 | Ошибка при работе с объектом |
Надеюсь данная таблица поможет вам побыстрее решить вопросы с ошибками в тестировании ПЛАТНЫХ и БЕСПЛАТНЫХ советников форекс!
Спасибо А. Парнюку за предоставление списка ошибок.
Похожие статьи:
Загрузка…
Когда Вы начинаете торговать на торговом терминале MetaTrader 4 не редко возникает ситуация, когда программа присылает Вам не описание – а код ошибки т.е. ее цифровое обозначение (некоторые торговые терминалы различных диллинговых центров присылают описание кода ошибки, но оно будет на английском языке), которое отображается во вкладках “Журнал” и “Эксперты”, думаю было бы полезно знать что они обозначают.
Коды ошибок, возвращаемые торговым сервером терминалу MetaTrader 4.
Error: 0 – Нет ошибки.
Error: 1 – Нет ошибки, но результат неизвестен.
Error: 2 – Общая ошибка.
Error: 3 – Неправильные параметры.
Error: 4 – Торговый сервер занят.
Error: 5 – Старая версия клиентского терминала.
Error: 6 – Нет связи с торговым сервером.
Error: 7 – Недостаточно прав.
Error: 8 – Слишком частые запросы.
Error: 9 – Недопустимая операция, нарушающая функционирование сервера.
Error: 64 – Счет заблокирован.
Error: 65 – Неправильный номер счета.
Error: 128 – Истек срок ожидания совершения сделки.
Error: 129 – Неправильная цена.
Error: 130 – Неправильные стопы.
Error: 131 – Неправильный объем.
Error: 132 – Рынок закрыт.
Error: 133 – Торговля запрещена.
Error: 134 – Недостаточно денег для совершения операции.
Error: 135 – Цена изменилась.
Error: 136 – Нет цен.
Error: 137 – Брокер занят.
Error: 138 – Новые цены.
Error: 139 – Ордер заблокирован и уже обрабатывается.
Error: 140 – Разрешена только покупка.
Error: 145 – Модификация запрещена, так как ордер слишком близок к рынку.
Error: 146 – Подсистема торговли занята.
Error: 147 – Использование даты истечения ордера запрещено брокером.
Error: 148 – Количество открытых и отложенных ордеров достигло предела, установленного брокером.
Error: 149 – Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.
Error: 150 – Попытка закрыть позицию по инструменту в противоречии с правилом FIFO.
Коды ошибок выполнения MQL4-программы (советника):
Error: 4000 – Нет ошибки.
Error: 4001 – Неправильный указатель функции.
Error: 4002 – Индекс массива – вне диапазона.
Error: 4003 – Нет памяти для стека функций.
Error: 4004 – Переполнение стека после рекурсивного вызова.
Error: 4005 – На стеке нет памяти для передачи параметров.
Error: 4006 – Нет памяти для строкового параметра.
Error: 4007 – Нет памяти для временной строки.
Error: 4008 – Неинициализированная строка.
Error: 4009 – Неинициализированная строка в массиве.
Error: 4010 – Нет памяти для строкового массива.
Error: 4011 – Слишком длинная строка.
Error: 4012 – Остаток от деления на ноль.
Error: 4013 – Деление на ноль.
Error: 4014 – Неизвестная команда.
Error: 4015 – Неправильный переход.
Error: 4016 – Неинициализированный массив.
Error: 4017 – Вызовы DLL не разрешены.
Error: 4018 – Невозможно загрузить библиотеку.
Error: 4019 – Невозможно вызвать функцию.
Error: 4020 – Вызовы внешних библиотечных функций не разрешены.
Error: 4021 – Недостаточно памяти для строки, возвращаемой из функции.
Error: 4022 – Система занята.
Error: 4050 – Неправильное количество параметров функции.
Error: 4051 – Недопустимое значение параметра функции.
Error: 4052 – Внутренняя ошибка строковой функции.
Error: 4053 – Ошибка массива.
Error: 4054 – Неправильное использование массива-таймсерии.
Error: 4055 – Ошибка пользовательского индикатора.
Error: 4056 – Массивы несовместимы.
Error: 4057 – Ошибка обработки глобальныех переменных.
Error: 4058 – Глобальная переменная не обнаружена.
Error: 4059 – Функция не разрешена в тестовом режиме.
Error: 4060 – Функция не разрешена.
Error: 4061 – Ошибка отправки почты.
Error: 4062 – Ожидается параметр типа string.
Error: 4063 – Ожидается параметр типа integer.
Error: 4064 – Ожидается параметр типа double.
Error: 4065 – В качестве параметра ожидается массив.
Error: 4066 – Запрошенные исторические данные в состоянии обновления.
Error: 4067 – Ошибка при выполнении торговой операции.
Error: 4099 – Конец файла.
Error: 4100 – Ошибка при работе с файлом.
Error: 4101 – Неправильное имя файла.
Error: 4102 – Слишком много открытых файлов.
Error: 4103 – Невозможно открыть файл.
Error: 4104 – Несовместимый режим доступа к файлу.
Error: 4105 – Ни один ордер не выбран.
Error: 4106 – Неизвестный символ.
Error: 4107 – Неправильный параметр цены для торговой функции.
Error: 4108 – Неверный номер тикета.
Error: 4109 – Торговля не разрешена. Необходимо включить опцию “Разрешить советнику торговать” в свойствах эксперта.
Error: 4110 – Длинные позиции не разрешены – необходимо проверить свойства эксперта.
Error: 4111 – Короткие позиции не разрешены – необходимо проверить свойства эксперта.
Error: 4200 – Объект уже существует.
Error: 4201 – Запрошено неизвестное свойство объекта.
Error: 4202 – Объект не существует.
Error: 4203 – Неизвестный тип объекта.
Error: 4204 – Нет имени объекта.
Error: 4205 – Ошибка координат объекта.
Error: 4206 – Не найдено указанное подокно.
Error: 4207 – Ошибка при работе с объектом.
Содержание
- Терминал MetaTrader 4 – возможные проблемы при загрузке и установке
- Проблемы с прокси-сервером
- A. Установка терминала с рабочего компьютера
- Б. Установка терминала с домашнего компьютера
- Причина №1 – установку блокирует FireWall
- Причина №2 – системная папка
- Причина №3 – старый билд
- После загрузки терминал MetaTrader 4 не реагирует и не запускается
- Не могу запустить МТ4 на windows 10
- Что делать, если не работает терминал
- Содержание статьи:
- Почему не работает MetaTrader 4: выясняем причину
- Вот наиболее распространенные причины:
- Решаем проблему на вашей стороне
- У вас уже стоит МТ4 или МТ5?
- Проблема на стороне брокера: как устранить ошибку МТ4/MT5
- Дополнительные причины отсутствия связи
- Полезные статьи:
- Возможные проблемы с терминалом МТ4 и их решения
- 1.Терминал МТ4 показывает ошибку «Неверный счет».
- 2. Терминал МТ4 не может подключиться к торговому счету. Ошибка «Нет соединения».
- 3. Не открылся ордер, ошибка «Торговый поток занят».
- 4. Не могу открыть график финансового инструмента, он отсутствует в окне «Обзор рынка».
- 5. Можно ли изменить цвет рыночных и отложенных ордеров?
- 6. Можно ли открыть ордер произвольным лотом?
- 7. Как посмотреть график валютной пары на истории, он постоянно перемещается назад?
- 8. Как можно узнать спрэд валютной пары?
- 9. Как посмотреть всю историю совершенных сделок?
- 10. Как сделать, чтобы в терминале отображались сделки, открытые вручную так же, как у торговых советников?
- 11. При тестировании советника появляется надпись «Недостаточно места на диске С». Какой объем занимает терминал МТ4 на диске компьютера?
- 12. Не могу открыть ордер в терминале МТ4. Кнопка «Новый ордер» неактивна, серого цвета.
- 13. Можно ли открыть несколько счетов в одном клиентском терминале МТ4?
- 14. Я случайно удалил нужный объект. Можно ли его восстановить?
- 15. Есть ли возможность заходить в свой торговый терминал с любого компьютера?
- Не запускается MetaTrader 4
Терминал MetaTrader 4 – первый шаг на пути к торговле на рынке Forex. Он открывает доступ к рынку и дает инструменты для работы. В МТ4, как и в других программах, иногда возникают проблемы. Особенно неприятно столкнуться с проблемой в самом начале – во время загрузки и установки платформы на компьютер. В этой статье мы перечислим возможные причины проблем и способы их решения.
Проблемы с прокси-сервером
Множество компаний и организаций используют прокси-сервер на рабочих компьютерах. Прокси-сервер выступает посредником между Интернетом и компьютерами организации. Он защищает компьютеры сети от внешнего доступа, повышает производительность и предоставляет пользователям анонимный выход в Интернет. На домашнем компьютере прокси-сервер, как правило, не используется. Поэтому, если при установке терминала МТ4 на рабочий компьютер установщик требует данные прокси-сервера – нужно их ввести.
A. Установка терминала с рабочего компьютера
Если вы не знаете адрес прокси-сервера, обратитесь к сисадмину вашей компании или интернет провайдеру. Часто логин и пароль к прокси совпадают с параметрами для входа в систему. Если вы верно указали данные для прокси-сервера, установка продолжится и завершится успешно.
СОВЕТ: Вы можете самостоятельно проверить или настроить прокси через браузер, которым вы пользуетесь. Как это сделать с помощью Google Chrome:
Как проверить настройки прокси в Mozilla Firefox или Internet-Explorer:
Б. Установка терминала с домашнего компьютера
Проблема с прокси-сервером становится гораздо интереснее, когда прокси-сервер отсутствует. Следовательно, никаких данных для ввода не существует. Почему же установщик требует их от вас и как решить эту проблему?
Причина №1 – установку блокирует FireWall
На компьютере используется Firewall и антивирус, которые блокируют установку МТ4. Как результат, появляется окно для ввода прокси-сервера. Firewall – специальная программа, которая не допускает к компьютеру интернет-мошенников, вирусы, спам и т. д. Он контролирует входящий и исходящий трафик и скрывает рекламу.
Чтобы решить проблему, отключите Firewall или антивирус на время установки терминала.
Чтоб отключить Firewall, сделайте следущее:
Антивирус отключается в его настройках. Иногда убрать окно ввода данных прокси-сервера помогает переустановка антивируса и перезагрузка компьютера.
Причина №2 – системная папка
Проблема появляется из-за того, что установочный файл по умолчанию загружен в системную папку. Из-за настроек безопасности он не может “подтянуть” остальные файлы терминала. Попробуйте заново загрузить терминал, но уже в любую другую папку.
Причина №3 – старый билд
Если вы только что скачали терминал с сайта брокера, то эта проблема вас вряд ли касается. Но некоторые старые версии MetaTrader действительно вызывали проблему с прокси. Если у вашего терминала оказался устаревший билд (т. е. версия обновления), обновите его до последней версии через систему автоматического обновления «LiveUpdate». Билд указывается в меню терминала «Справка»/«О программе». Или же удалите устаревший терминал и установите МТ4 последней версии.
“Пациент скорее мертв, чем жив..”: терминал не запускается и не реагирует на ваши действия. Тогда попробуйте следующее:
Если устранить проблемы с установкой и запуском все же не удалось, а воспользоваться платформой срочно нужно – торгуйте через браузерную версию МеtaTrader 4.
Также обсудить проблему или найти дополнительную информацию можно на форуме Mql4.
Источник
Не могу запустить МТ4 на windows 10
Немного предыстории: стоял у меня дома ноут с виндой 8. Установил несколько терминалов, все работало. На работе установлен линукс и там тоже работало несколько терминалов (конечно через вайн). Дома терминалы открывал очень редко. Потом пришло обновление винды до 10. Само все установилось. Терминалы тоже работали нормально. Тут наверное с пол года (может даже с год) я совсем не запускал терминал дома.
И вот решил я запустить свой любимый МТ4, а не тут то было. Просто не запускается и все. Я уже привыкший к линуксу давай искать как можно посмотреть ошибки в командной строке, но тут же вспомнил, что это виндовс, здесь все сделано через одно место.
Что я только не делал. Я скачал терминалы с разных брокеров. Я устанавливал их в разные места (даже на флешку). Я останавливал работу антивирусника (аваст у меня стоит) и брендмаузера, плюс останавливал UAC (кажется так пишется). Я удалял все терминалы, устанавливал их заново. Устанавливал/запускал от администратора. Удалял все из папки ..AppDataRoamingMetaQuotes + еще кое какие данные в программ дата были, там тоже чистил.
Когда запускаю установленный терминал (любого брокера), то он в AppDataRoamingMetaQuotes создает 2 папки Crashes и WebInstall, а вот папку Terminal почему то не создает. Облазил весь яндекс и гугол. Везде предлагается заменять старым билдом (но все эти советы они были в 2015г, т.е. когда винда 10 только появилась). Хорошо. Достал я 2 файла старых билдов. Один 600 какой то, при замене он тоже не открывается. Другой 769 билд. Вот он при замене открывается, но валют нет ни одной, и внизу в правом углу написано общая ошибка. Причем демо счет делается, серваки видят, пинг есть, и больше ничего нет. Причем интересно предлагали (на форумах) запускать старый билд из под администратора, но у меня как раз из под админа он не запускается. Почему папка терминал не создается кажется нашел объяснение, так как она создается при первом запуске самой программы, а так как моя программа не запускается, то и папка не образуется. Причем если мы заменяем сам файл старым билдом, то эта папка появляется.
На компе не так уж много программ, офис, читалки разные, да несколько прог для работы. Переустанавливать винду это не вариант. Самое интересное, что когда запускаю терминал, то он в диспетчере задач появляется на секунду-две и пропадает. И ничего, ни ошибок, вообще ничего.
Еще был скачан МТ4 с этого сайта. Причем установка его сильно отличалась, так как к названию терминала добавились циферки 64. Почитав форум пришел к выводу, что метаквокеры под МТ4 выдают МТ5. Да, и он тоже не запускался. Но вот в папке c:Users. AppDataRoamingMetaQuotesWebInstall есть терминал МТ5 и причем он рабочий, но через несколько минут он сам обновляется и уже не запускается.
Так же скачивал с разных брокеров уже МТ5 (уже думал если такое дело то придется переучиваться прогить на МТ5), но и у них таже самая проблема. Они просто не запускаются.
Источник
Что делать, если не работает терминал
Для того, чтобы зарабатывать на финансовых рынках, трейдеру нужно держать в фокусе внимания многие факторы: четко считывать сигналы торговой системы, просчитывать риски, следить за собственными эмоциями.
Однако иногда сложности приходят с неожиданной стороны — перестает работать MetaTrader 4 или MetaTrader 5. Открывая торговый терминал, трейдер в правом нижнем углу видит надпись «Нет связи» и слышит характерный разочаровывающий звук, подтверждающий невозможность установить соединение.
Сегодня мы рассмотрим, как преодолеть эту проблему и вернуть себе доступ к рынку.
Содержание статьи:
Итак, вы обнаружили, что торговый терминал не работает. Что делать? Столкнувшись с отсутствием связи, необходимо выяснить причину этой неполадки. От нее будет зависеть способ решения проблемы.
Вот наиболее распространенные причины:
Рассмотрим, что делать в каждой из этих ситуаций.
Решаем проблему на вашей стороне
Часть причин обрыва связи в MetaTrader 4 (5) может быть на вашей стороне. Поэтому необходимо проверить свое оборудование.
Если пропал доступ к интернету, вы не только не сможете подключить терминал, но и зайти на другие сайты.
1. Откройте браузер и попробуйте зайти на любой сайт. Если не получилось, скорее всего, проблема в интернет-доступе.
2. Проверьте интернет-соединение, перезагрузите WI-FI роутер, при необходимости проведите перезагрузку компьютера.
3. Если это не сработало, свяжитесь со своим провайдером и выясните причину.
Отсутствие связи в MetaTrader 4 (5) может быть связано с проблемами взаимодействия программного обеспечения на вашем компьютере:
1. У вас установлена устаревшая версия Windows. Если версия ниже Windows 7, у платформы нет шансов подключиться, необходимо обновить операционную систему. Альтернативным вариантом будет переход на веб-версию терминала.
2. Возник конфликт с антивирусом или нет прав администратора. В этом случае нужно найти значок торгового терминала MetaTrader 4 (5) и, кликнув по нему правой кнопкой мыши, выбрать «Запуск от имени администратора». Если соединение не восстановилось, а проблема в конфликте с антивирусом, необходимо найти инструкцию разработчика и изучить, как ввести терминал в список исключений антивируса.
Есть еще один способ решить проблему конфликта с программным обеспечение на вашем компьютере в Windows OC:
1. Необходимо перейти в брандмауэр Windows.
2. Выбрать пункт «Разрешить взаимодействие с приложением или компонентом в брандмауэре Windows».
3. Определить путь доступа к дистрибутиву terminal.exe. Для этого из опции обзора нужно войти в Program Files и там найти дистрибутив MT4/MT5.
4. Нажать кнопку «Добавить», чтобы файл был занесен в список исключений.
У вас уже стоит МТ4 или МТ5?
Если нет, установите его прямо сейчас!
Проблема на стороне брокера: как устранить ошибку МТ4/MT5
В результате технического обслуживания на стороне брокера у клиента может пропасть связь с MetaTrader 4 (5). Для восстановления доступа необходимо пересканировать серверы.
1. В правом нижнем углу платформы найдите значок подключения и кликните по нему левой кнопкой мыши.
2. Выберите пункт «Пересканировать серверы».
3. В появившемся окне появится несколько серверов. Подключиться лучше к тому, у которого скорость соединения выше.
4. Если этот способ не решил проблему, откройте новый демо-счет, перейдя в пункт меню «Файл». Просканировав серверы, выберите в таблице «Новый демо-счет».
5. После этого потребуется перезапуск терминала, и вы сможете зайти под логином и паролем своего реального аккаунта.
Дополнительные причины отсутствия связи
Если после всех перечисленных выше манипуляций терминал MТ4 не работает, что делать? Проблема может быть на стороне интернет-провайдера или настроек интернет-сети. Если ваш провайдер использует прокси-серверы, чтобы ограничить доступ к определенным ресурсам, в их список может попасть и ваш брокер.
Для решения этой проблемы необходимо настраивать терминал таким образом, чтобы он не отправлял непосредственный запрос на IP брокерской компании, а обращался к частному прокси-серверу.
Если же вы открываете MetaTrader 4 (5), например, на работе или в какой-то корпоративной сети, администраторы могут изначально заблокировать там доступ к сторонним интернет-ресурсам. Из-за заблокированного порта 443 вы не сможете подключиться, если в настройки сети не внести соответствующие изменения.
СОВЕТЫ ОТ НАШИХ КЛИЕНТОВ
Иногда виснет от большого количества окон открытых. Нужно тогда закрывать терминал и очищать кэш с помощью программы Clear.
Как видите, большинство проблем со связью в торговой платформе можно решить самостоятельно. Главное, определить причину, а дальше следовать предложенным алгоритмам или обратиться за помощью к IT-специалисту.
Полезные статьи:
ПРЕДУПРЕЖДЕНИЕ О РИСКАХ
Компания Gerchik & Co предупреждает: проведение торговых операций на
финансовых рынках с маржинальными финансовыми инструментами имеет
высокий уровень риска и может привести к получению убытков и потере
инвестиционных средств. Начиная торговлю,убедитесь что вы в полной
мере осознаете все риски, а также обладаете соответствующими знаниями
и опытом для торговли на Форексе.
УСЛОВИЯ ПЕРЕПЕЧАТКИ МАТЕРИАЛОВ
При полном или частичном использовании информации и материалов данного сайта, указание источника информации (ссылка на сайт gerchik.co) является обязательным.
Компания Gerchik & Co LTD сертифицирована через сервис Verify My Trade и предоставляет ежемесячно 5000 сделок для сравнения со всеми базисными показателями других брокеров и поставщиков ликвидности. Результаты аудита доступны по ссылке.
Источник
В этой статье рассмотрим некоторые проблемы, связанные с работой торгового терминала MetaTrader 4 и возможные варианты их решения.
1.Терминал МТ4 показывает ошибку «Неверный счет».
Вы ввели неверный логин (логином является номер торгового счета) или пароль. Если вы забыли ваши учетные данные, проверьте электронную почту. При регистрации торгового счета на ваш e-mail приходит письмо с регистрационными данными.
Убедитесь, что пароль введен правильно: все буквы написаны на латинице и с учетом регистра. Также проверьте, что ваш логин или пароль не имеет пробелов, либо пробелы перед или после них.
Также необходимо выбрать правильное имя сервера. Оно также содержится в электронном письме.
2. Терминал МТ4 не может подключиться к торговому счету. Ошибка «Нет соединения».
1. Проверьте подключение к интернету, возможно, это проблема вашего интернет-провайдера. Попробуйте открыть любые страницы в веб-браузере. Если они не открываются, обратитесь в тех. поддержку вашего провайдера.
2. Возможно, ваш антивирус блокирует соединение с терминалом МТ4. Попробуйте отключить антивирус и заново запустить торговый терминал. Если проблема в антивирусе, необходимо добавить в исключения соединение с терминалом МТ4 в настройках антивирусной программы.
3. Если подключение вашего компьютера идет через прокси-сервер, то информационные данные прокси-сервера необходимо ввести в терминале МТ4. Для этого в меню выбираем «Сервис», далее «Настройки», в открывшемся окне выбираем вкладку «Сервер», здесь ставим галочку в пункте «Использовать прокси-сервер».
4. Проблемы на сервере ДЦ: перегруженность или сбои в работе его дата-центров.
3. Не открылся ордер, ошибка «Торговый поток занят».
4. Не могу открыть график финансового инструмента, он отсутствует в окне «Обзор рынка».
Вариант 1. Щелкните правой кнопкой мыши по окну «Обзор рынка», выберите пункт «Показать все символы». Теперь вы сможете видеть все финансовые инструменты, которые предлагает ваш брокер. Однако по всем открытым символам будет идти поток информации, а это может тормозить работу терминала.
Вариант 2. В главном меню выбираем «Вид» → «Символы» и здесь ищем требуемый символ, затем нажмите на кнопку «Показать». После этого он появится в окне «Обзор рынка» и в меню для создания нового графика.
5. Можно ли изменить цвет рыночных и отложенных ордеров?
6. Можно ли открыть ордер произвольным лотом?
7. Как посмотреть график валютной пары на истории, он постоянно перемещается назад?
8. Как можно узнать спрэд валютной пары?
9. Как посмотреть всю историю совершенных сделок?
10. Как сделать, чтобы в терминале отображались сделки, открытые вручную так же, как у торговых советников?
На графике можно визуализировать только закрытые ордера. Для этого зажмите левой кнопкой мыши закрытый ордер во вкладке «История счета» и перетащите его на график. Он отобразится также как при работе торговых советников, то есть можно будет увидеть направление ордера, точку входа и точку выхода. Если сделать то же самое, удерживая клавишу Shift, то отобразятся все закрытые ордера по выбранной валютной паре.
Вы можете использовать индикатор, который показывает все сделки и еще прибыль или убыток в пунктах и в валюте.
Индикатор VisualOrders.mq4.
11. При тестировании советника появляется надпись «Недостаточно места на диске С». Какой объем занимает терминал МТ4 на диске компьютера?
12. Не могу открыть ордер в терминале МТ4. Кнопка «Новый ордер» неактивна, серого цвета.
Возможно, вы не выбрали размер лота.
При регистрации счета вы ввели пароль инвестора, а не пароль трейдера. В этом случае вы сможете только смотреть, но не сможете открывать и закрывать сделки.
13. Можно ли открыть несколько счетов в одном клиентском терминале МТ4?
14. Я случайно удалил нужный объект. Можно ли его восстановить?
15. Есть ли возможность заходить в свой торговый терминал с любого компьютера?
Надеюсь эти советы помогут вам решить ваши проблемы с терминалом МТ4 и быстрее освоить его в работе.
Источник
Третью неделю пытаюсь запустить MetaTrader 4.
Уже во время установки программы появляется сообщение:
Программа устанавливается, но при запуске появляется это же
сообщение и программа не запускается.
Запись на компьютере из журнала событий:
Источник: Application Error
Тип: Ошибка Код(ID) 1000
Описание: Ошибка приложения terminal.exe. версия 4.0.0.610.
модуль terminal.exe. версия 4.0.0.610. адрес 0х001a9018
Иногда появляется такое описание:
Ошибка приложения mt4setup.exe. версия 5.0.0.883. модуль mt4setup.exe.
версия 5.0.0.883. адрес 0х0001ec1a.
Как только появилась эта проблема, появлялось сообщение
об ошибке, но программа запускалась. Я заподозрил вирусную
активность на компьютере, потому что уже продолжительное
время не пользовался антивирусными программами. Мое
предположение подтвердилось. После значительных усилий
вирусы были обнаружены там, где их не должно было быть:
на установочном диске CD-R.
Я десять лет интенсивно пользуюсь компьютером
и десять лет регулярно борюсь с вирусами.
Обычно, в самых тяжелых случаях переустановка операционной
системы снимала проблему. Но не в этот раз!
Уже многократно была переустановлена операционная система.
В последний раз во время установки я удалил разделы диска,
создал новые, отформатировал, установил систему с диска,
проверенного антивирусом. MetaTrader 4 не запускается!
Проверяю компьютер программой DrWeb, вирусов нет,
компьютер работает отлично, запускается любая программа,
кроме MetaTrader 4.
Технические характеристики компьютера:
AMD Athlon(tm)XP 2500 1,83 ГГц. 1.00 ГБ ОЗУ
Windows XP Professional версия 2002 Service Pack 3
Источник


















