Как избежать ошибок, если несколько экспертов торгуют одновременно
Как я уже говорил в прошлом выпуске, в каждый момент времени только один эксперт может торговать. Если в этот момент второй эксперт попытается совершить торговую операцию, то торговая функция вернет ошибку 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: