« Предыдущий пост | На главную страницу | Следующий пост »

Как избежать ошибок, если несколько экспертов торгуют одновременно

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

« Предыдущий пост | На главную страницу | Следующий пост »

Подписаться на мою рассылку



Размещение статьи "Как избежать ошибок, если несколько экспертов торгуют одновременно" на Вашем сайте

Размещение статьи "Как избежать ошибок, если несколько экспертов торгуют одновременно" на Вашем сайте возможно при условии выполнениия следующих условий:

  • Запрещается изменение оригинального текста без согласия автора - Андрея Ведихина.
  • Должен быть указан первоисточник. В случае публикации в интернете Вы должны разместить следующий код гиперссылки без изменений:
  • Запрещается коммерческое использование материалов, взятых с блога "Интернет-трейдинг на форекс / forex". Доступ к ним должен быть свободным, без взимания какой-либо платы, без обязательной регистрации и/или заполнения опросного листа (анкеты) и т.д.

В случае выполнения данных условий не требуется согласия автора блога "Интернет-трейдинг на форекс / forex" на размещение статьи "Как избежать ошибок, если несколько экспертов торгуют одновременно" на Вашем сайте.

Журнал FOREX MAGAZINE:



Архив номеров FOREX MAGAZINE
Котировки Forex:

Счетчики:

Авторские права © 2005-2006 Андрей Ведихин

Условия использования материалов блога "Интернет-трейдинг на форекс / forex"

Контакты с автором:


Движок сайта:
Movable Type 5.04