Секреты правильной торговли


например, forex

Расскажем отрех функциях: IsExpertEnabled(), IsTradeContextBusy() иIsTradeAllowed().

Функция IsExpertEnabled()

   bool IsExpertEnabled()

Функция IsExpertEnabled() возвращает true, если экспертам разрешено совершать сделки иуправлять ордерами. Дело втом, что науровне настроек клиентского терминала можно запретить ВСЕМ экспертам торговать. Это можно сделать, например, спомощью команды главного меню: Сервис -> Настройки. Впоявившемся окне выбираем вкладку Советники, вкоторой ставим или убираем галочку напротив Включить советники ….

Более простой способ отключать/включать советников— кнопка.

Еслиже науровне настроек терминала работа экспертов запрещена, тофункция IsExpertEnabled() вернет false.

Функция IsTradeContextBusy()

В каждый момент времени только один эксперт может торговать. Если вэтот момент второй эксперт попытается совершить торговую операцию, тоторговая функция вернет ошибку ERR_TRADE_CONTEXT_BUSY (146).

   bool IsTradeContextBusy()

Функция IsTradeContextBusy() позволит Вам заблаговременно выявить ситуацию, когда другой эксперт уже пытается торговать (она вернет вэтом случае значение true), иизбежать нерезультативного вызова торговой функции (которая все равно завершиться сошибкой). Обычно втаких случаях лучше подождать немного дотого момента, когда другой эксперт закончит торговать (тогда функция IsTradeContextBusy() вернет значение false) итолько после этого вызывать Вашу торговую функцию.

Функция IsTradeAllowed()

Функция IsTradeAllowed() объединяет все обе предыдущие функции. Она вернет true только втом случае, если торговля экспертов разрешена иторговый поток свободен для торговли, т.е. никакой другой эксперт несовершает вданный момент торговых операций.

   bool IsTradeAllowed()

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

Функция IsStopped().

   bool IsStopped()

Функция возвращает true, если эксперт был остановлен, иfalse— впротивном случае.

Эксперт получает команду назавершение вследующих случаях:

  • при завершении работы клиентского терминала,
  • при закрытии графика, ккоторому прикреплен эксперт,
  • при удалении эксперта сграфика,
  • при изменении инструмента или периода графика,
  • после перекомпиляции эксперта вMetaEditor,
  • после изменения параметров советника,
  • при переключении надругой счет.

Чтобы непытаться совершить сделку постарым котировкам инеполучить сообщение обошибке, мыобновляем информацию отекущих котировках спомощью функции RefreshRates().

   bool RefreshRates()

Функция возвращает true, если информация была обновлена, иfalse, если данные неизменились ивобновлении нет нужды. Если данные были обновлены, товызов функции RefreshRates() также обновит время последней котировки, которое возвращается функцией CurTime().

Считается хорошим тоном вызывать функцию RefreshRates() перед вызовом торговой функции, если перед этим эксперт что-то очень долго или пересчитывал. Илиже если эксперт ждал, пока другой эксперт закончит торговать иторговый поток освободиться.

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


Перейти к главе «Выдерживаем паузу между сделками».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100