+321 123 4567
info@test.com
My Account
Forex Lab
  • Главная
  • Софт
  • Стратегии
  • Брокер
  • Блог
  • Item A
    • Sub item A1
    • Sub item A2
  • Item B
    • Sub item B1
    • Sub item B2
  • Item C
    • Sub item C1
    • Sub item C2

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

Даже если Вы создадите идеального «эксперта», ошибок не избежать, уж очень много факторов которых Вы не можете контролировать (связь, провайдер, ДЦ, терминал и тд.). Ошибки при выполнении торговых операций (открытие, удаление или модификация ордеров) можно разделить на две группы.

Первая – это когда «советник» не верно оформляет «заказ» на торговую операцию. Такой ордер терминал не исполняет а возвращает нам код ошибки. Код ошибки это число, например ошибка номер 130 – неправильно выставлены стопы.

Вторая – это когда с нашей стороны ордер оформлен верно и терминал послал его на исполнение, возвращается ошибка обрив связи, брокер занят и тд.

Итак научим наш «советник» распознавать эти ошибки и реагировать на них.
При установке ордеров мы используем торговую функцию OrderSend, при успешном исходе она возвращает номер открытого ордера, а при неудачи (ошибке) -1.
При удалении (OrderDelete), если ордер удален получим TRUE, если нет FALSE (ошибка).
Что бы узнать код ошибки вызывается функция GetLastError(), которая возвращает номер последней ошибки.

После каждой торговой операции (открытие, модификация и удаление), проверяем на наличие ошибок, в нашем «советнике» таких блоков где нужно вставить код четыре, каждый раз после функции OrderSend и OrderDelete.

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

Если ошибка есть – вызываем функцию GetLastError. Получим номер ошибки, но этот номер нам нужен как зайцу стопсигнал, все эти номера все одно не упомнишь. Вызываем функцию inf и передаем ей номер ошибки.

inf(15, GetLastError()); // если дошли сюда значит есть ошибка... узнаем какая именно

В этой функции есть блок который распознает ошибку и уже на «человеческом» языке сообщит нам в чем проблема.

case 15: switch(Number)                 // Переход на номер ошибки
 {
  case 2: Graf_Text = "Общая ошибка.";                 break;
  case 4: Graf_Text = "Торговый сервер занят.";        break;
  case 129: Graf_Text = "Неправильная цена. ";         break;
  case 135: Graf_Text = "Цена изменилась.";            break;
  case 136: Graf_Text = "Нет цен. Ждём новый тик..";   break;
  case 137: Graf_Text = "Брокер занят.";               break;
  case 146: Graf_Text = "Подсистема торговли занята."; break;
  case 5 :  Graf_Text = "Старая версия терминала.";    break;
  case 64:  Graf_Text = "Счет заблокирован.";          break;
  case 133: Graf_Text = "Торговля запрещена";          break;
  case 134: Alert("Недостаточно денег для совершения операции.");
  return(0);                             // Выход из функции
  default:  Graf_Text = StringConcatenate("Возникла ошибка ",Number);
 }
break;

Здесь нет ничего сложного и Вы сами можете сделать так, чтобы «советник» обрабатывал те ошибки, которые Вы посчитаете наиболее важными.

То что мы знаем об ошибке – хорошо, еще лучше чтобы «эксперт» сам реагировал на конкретную ситуацию. Например, если есть ошибка 137 (Брокер занят), а «советник» будет продолжать посылать по 100 запросов в секунду, счет могут заблокировать. В этом и подобных случаях чтобы наш «эксперт» не был назойливым при подобных ошибках будем делать паузу (пережидать несколько секунд).

if(IsTesting() == false) Sleep(5000); // если это не тестирование - "засыпаем" на 5 секунд.

Sleep() – функция останавливает «эксперта» на заданное время.
IsTesting() – функция возвращает TRUE в режиме тестирования, иначе возвращает FALSE.
Если это тестирование то паузы не нужны.

Вносим изменения в блок обработки ошибок.

case 15: switch(Number)                 // Переход на номер ошибки
 {
  case 2: Graf_Text = "Общая ошибка.";
          break;
  case 4: Graf_Text = "Торговый сервер занят.";
          if(IsTesting() == false) Sleep(5000); // если это не тестирование - "засыпаем" на 5 секунд.
          break;
  case 129: Graf_Text = "Неправильная цена.";
            break;
  case 130: Graf_Text = "Неправильная дистанция.";
            break;
  case 135: Graf_Text = "Цена изменилась.";
            break;
  case 136: Graf_Text = "Нет цен. Ждём новый тик..";
            if(IsTesting() == false) Sleep(1); // если это не тестирование - "засыпаем" на 1 миллисекунду.
            break;
  case 137: Graf_Text = "Брокер занят.";
            if(IsTesting() == false)Sleep(5000); // если это не тестирование - "засыпаем" на 5 секунд.
            break;
  case 146: Graf_Text = "Подсистема торговли занята.";
            if(IsTesting() == false) Sleep(500); // если это не тестирование - "засыпаем" на пол секунды.
            break;
  case 5 :  Graf_Text = "Старая версия терминала.";
            break;
  case 64:  Graf_Text = "Счет заблокирован.";
            break;
  case 133: Graf_Text = "Торговля запрещена";
            break;
  case 134: Alert("Недостаточно денег для совершения операции.");
            return(0);                             // Выход из функции
  default:  Graf_Text = StringConcatenate("Возникла ошибка ",Number);
 }
break;

Теперь «советник» будет не только сообщать об ошибках но и реагировать на них.

Исходник: TradeOnNews-0.3

Советник «Болтун» — https://forexlab.ru/mql-talk-advisor/

Предыдущая запись
Советник «Болтун»
Следующая запись
Работа над ошибками

Свежие записи

  • Как работают биржи: классификация, виды, особенности
  • Moving Average: описание, настройка, стратегии
  • Что такое Non farm payrolls
  • HQBroker: мошенники или честный брокер
  • Торговля на бирже для начинающих: полный гайд

Рубрики

  • CFD (2)
  • FOREX (14)
  • Meta Trader 5 (6)
  • MetaTrader 4 (13)
  • Price Action (9)
  • QUIK (2)
  • Акции (9)
  • Бинарные опционы (11)
  • Биржи (1)
  • Брокеры (5)
  • Волновой анализ (7)
  • Графический анализ (28)
  • Индикаторный анализ (36)
  • Криптовалюты (2)
  • Методы управления капиталом (11)
  • Новости проекта Forex Lab (2)
  • Объемы (10)
  • Основы торговли (7)
  • Подкаст (7)
  • Полезное (3)
  • Программирование (20)
  • Психология трейдинга (25)
  • Свечной анализ (2)
  • Скальпинг (1)
  • Технический анализ (19)
  • Торговые платформы (26)
  • Торговые стратегии и системы (73)
  • Фибо (11)
  • Фондовый рынок (27)
  • Фракталы (4)
  • Фундаментальный анализ (19)
  • Фьючерсы (20)

Представленная информация не является индивидуальной инвестиционной рекомендацией, ни при каких условиях, в том числе при внешнем совпадении ее содержания с требованиями нормативно-правовых актов, предъявляемых к индивидуальной инвестиционной рекомендации. Любое сходство представленной информации с индивидуальной инвестиционной рекомендацией является случайным.
Какие либо из указанных финансовых инструментов или операций могут не соответствовать Вашему инвестиционному профилю.
Упомянутые в представленном сообщении операции и (или) финансовые инструменты ни при каких обстоятельствах не гарантируют доход, на который Вы возможно рассчитываете при условии использования предоставленной информации для принятия инвестиционных решений.
Информационный портал ForexLab не несет ответственности за возможные убытки инвестора в случае совершения операций, либо инвестирования в финансовые инструменты, упомянутые в представленной информации.
Во всех случаях определение соответствия финансового инструмента либо операции инвестиционным целям, инвестиционному горизонту и толерантности к риску является задачей инвестора.
Не является образовательной деятельностью. Не сопровождается выдачей документов об образовании и (или) квалификации. При полном или частичном использовании материалов сайта ссылка на https://forexlab.ru/ обязательна.

© 2008-2020 Forex Lab

  • Главная
  • Политика
  • Авторские права
  • Согласие
  • Риски
  • Оферта