Как определить существует ли ордер в MQL4

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Как определить существует ли ордер в MQL4

Сообщение Haos » 26 ноя 2021, 15:46

Рассмотрим пользовательскую функцию для определения факта существования установленного ордера. Прототип функции я когда-то нашел в интернете и с годами произвел удобные модификации для пользования.
Данная функция должна возвращать флаг существования ордера, т.е. есть он или нет. Больше нас в данном случае не интересует. Т.е. функция по смыслу должна быть логической. Назовем её f_ExistOrders.

Параметрами функции назначим:
sy - наименование торгового инструмента и предусмотрим случай "любого" инструмента;
op - тип ордера;
mn - мэджик ордера (т.е. для возможности работать с конретными экспертами);
ot - время открытия ордера.

Общее количество ордеров, как известно, опделяется функцией OrdersTotal(). Наша функция должна сразу же произвести анализ на наличие ордеров и если его нет, то сразу же вернуть "false".
Далее, мы должны в функции организовать цикл перебора имеющихся ордеров, т.е. пробежать от нуля до количества ордеров минус один.
Код: выделить все
int i,
k = OrdersTotal(),
ty;
if(k == 0) return(false); // нет ордеров вообще
if(sy == "0") sy = Symbol();
for(i = 0; i < k; i++)
{
...
}

Далее выбираем только ордера с идентификатором от 2 до 5, т.е. исключить открытые позиции, т.к. мы работаем именно с ордерами, а не с позициями.
Код: выделить все
ty = OrderType();
if(ty > 1 && ty < 6)

Далее мы должны выбрать только ордер в соответствие с заданными условиями (тип ордера, мэджик, время установки и, зачастую, конкретный торговый инструмент):
Код: выделить все
if((OrderSymbol() == sy || sy == "") && (op < 0 || ty == op))
{
   if(mn < 0 || OrderMagicNumber() == mn)
   {
       ...
   }
}

И в завершении осуществить проверку на наличие ордера по условию времени установки (выбрать только тот ордер, что удовлетворяет ему):
Код: выделить все
if(ot <= OrderOpenTime()) return(true);

Полный код функции f_ExistOrders расположен ниже:
Код: выделить все
bool f_ExistOrders(string sy = "", int op = -1, int mn = -1, datetime ot = 0)
{
/*
   Описание : Возвращает флаг существования ордеров.                         
   28/10/2015
   Параметры:                                                               
   sy - наименование инструмента   (""   - любой символ,                   
                                    "0" - текущий символ)                 
   op - операция                   (-1   - любой ордер)                   
   mn - MagicNumber                (-1   - любой магик)                   
   ot - время открытия             ( 0   - любое время установки)         
*/
  int i,
  k = OrdersTotal(),
  ty;
 
  if(k == 0) return(false); // нет ордеров вообще
  if(sy == "0") sy = Symbol();
  for(i = 0; i < k; i++)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      ty = OrderType();
      if(ty > 1 && ty < 6)
      {
        if((OrderSymbol() == sy || sy == "") && (op < 0 || ty == op))
        {
          if(mn < 0 || OrderMagicNumber() == mn)
          {
            if(ot <= OrderOpenTime()) return(true);
          }
        }
      }
    }
  }
return(false);
}

В результате мы или получим true от функции, что будет означать, что искомый ордер по заданным нами условиям найден, или получим false, означающее, что такого ордера нет.
Когда обычно может быть использована данная функция? При торговле, когда мы отслеживаем переход от ордера к сделки или когда в принципе анализируем есть ли отложенный ордер по какому-то торговому инструменту. К примеру, в гридинге это довольно частая необходимость.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения