Как уже говорилось в предыдущей статье, в каждый момент времени только один эксперт может торговать. Если в этот момент второй эксперт попытается совершить торговую операцию, то торговая функция вернет ошибку ERR_TRADE_CONTEXT_BUSY (146).
Что же делать, если у Вас торгует одновременно несколько экспертов?
Напишем функцию, которая возвращает:
Если в момент обращения к функции торговый поток был занят, то функция ждет, пока он освободится. После этого она обновляет данные о текущих котировках с помощью функции RefreshRates() и возвращает 0.
Напомню возможные причины остановки эксперта:
Исходный код функции, которая решает поставленную задачу:
//+-------------------------------------------------------------------+ //| Функция 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().
Есть что сказать? Не стесняйтесь!
Последние статьи:
Видео по теме:
УГОЛОК АДМИНИСТРАТОРА