Как избежать ошибок, если несколько экспертов торгуют одновременно
Как я уже говорил в прошлом выпуске, в каждый момент времени только один эксперт может торговать. Если в этот момент второй эксперт попытается совершить торговую операцию, то торговая функция вернет ошибку ERR_TRADE_CONTEXT_BUSY (146).
Что же делать, если у Вас торгует одновременно несколько экспертов?
Напишем функцию, которая возвращает:
- 0, если торговый поток свободен;
- 1, если работа эксперта была остановлена (см. причины ниже);
- 2, если торговля экспертов запрещена на уровне настроек клиентского терминала.
Если в момент обращения к функции торговый поток был занят, то функция ждет, пока он освободится. После этого она обновляет данные о текущих котировках с помощью функции RefreshRates() и возвращает 0.
Напомню возможные причины остановки эксперта:
- завершение работы MetaTrader 4,
- закрытие графика,
- удаление эксперта с графика,
- изменение инструмента или периода графика,
- удачная перекомпиляции программы в MetaEditor,
- изменение параметров эксперта,
- переключение на другой счет.
Исходный код функции, которая решает поставленную задачу:
//+-------------------------------------------------------------------+ //| Функция WaitUntilTradingIsAllowed возвращает:| //| 0 - если торговый поток свободен | //| 1 - если работа эксперта была остановлена | //| 2 - если торговля экспертов запрещена на | //| уровне настроекклиентского терминала | //+-------------------------------------------------------------------+ int WaitUntilTradingIsAllowed() { // Если торговля разрешена, то вернем 0 и выйдем if (IsTradeAllowed()) return(0);
// В цикле проверяем, как изменилась ситуация while (!IsStopped()) { // Если торговля экспертов запрещена на уровне настроек // клиентского терминала, то выйдем и вернем 2 if (!IsExpertEnabled()) return(2);
// Если торговый поток освободился, то обновим данные // о текущих курсах и вернем 0 if (!IsTradeContextBusy()) { RefreshRates(); return(0); }
// Если дошли до момента, то ситуация не изменилась // Поэтому делаем паузу в 0.1 секунду Sleep(100); }
// Т.к. вышли из цикла, то работа эксперта была остановлена // Вернем 1 return(1); }
Практически все в этом коде должно быть ясно, за исключением нескольких функций, о которых я расскажу в следующем выпуске. Также в следующем выпуске я расскажу о примере использования функции WaitUntilTradingIsAllowed().
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: