Наличие позиции по цене открытия

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

Наличие позиции по цене открытия

Сообщение Haos » 20 май 2021, 15:39

Рассмотрим такой вопрос, который может возникнуть при написании кода на MQL: "Как определить факт наличия позиции, открытой по конкретной цене?". Данная необходимость, обычно, может возникать не напрямую при решении той или иной программисткой задачи при написании советника, а косвенно, т.к. редко можно себе представить случай, когда в параметрах советника пользователю нажуно будет вводить числовой значение котировки по которой была открыта позиция.

Необходимость обнаружения позиции по определенной цене может возникнуть, когда заранее известны уровни на которых должны открываться позиции. Такое встречается, например, в сеточной торговле, когда уровни сформированы отдельным условием и, в основном, занесены в массивы данных. Вот тогда, к примеру, начальный уровень установк сетки даже может быть оформлен как внешний параметр советника, в который пользователь руками его должен вбить. Однако, все остальные уровни, обычно, вычисляются по некоему алгоритму, который и пишется разработчиком в коде. И вот иногда с вычисленного программой какого-нибудь уровня и нужно получить информацию, а есть ли там открытая позиция или её нет. Ответ на этот вопрос обусловит дальнейшие действия программы, например, установку ордера на том уровне или если это вблизи текущей цены происходит, то попытку открытия позиции.

Данная функция была в свободном доступе в интернете, потому разбирем код функции, осуществляющей поиск позиции по цене открытия.
Код: выделить все
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг существования позиций по цене открытия         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       (-1   - любая цена)                     |
//+----------------------------------------------------------------------------+
bool f_ExistPosByPrice(string sy = "", int op = -1, int mn = -1, double pp = -1)
{
   int d, i, k = OrdersTotal();

   if(sy == "0") sy = Symbol();
   for(i = 0; i < k; i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
         {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            {
               d = (int) MarketInfo(OrderSymbol(), MODE_DIGITS);
               if(pp < 0 || NormalizeDouble(pp, d) == NormalizeDouble(OrderOpenPrice(), d))
               {
                  if(mn < 0 || OrderMagicNumber() == mn) return(true);
               }
            }
         }
      }
   }

return(false);
}


Из кода видно, что функция имеет название f_ExistPosByPrice() и возвращает тип bool, т.е. является логической функцией. В функцию передаются параметры:
- sy - наименование инструмента;
- op - тип торговой операции (покупка, продажа или, если "-1", то или покупка, или продажа);
- mn - MagicNumber - "серийник" эксперта;
- pp - цена по которой была открыта позиция. При этом, автором придусмотрена ситуация, когда при вводе значения данного параметра в качестве "-1", будет происходить поиск позиции, открытой по любой цене, т.е., фактически, функция будет возвращать результат просто есть ли позиция открытая или её нет.

Как обычно, имеет место цикл перебора всех ордеров, в котором по заданным условиям поиска происходит отбор необходимой позиции. Это и определяют входные параметры функции.

Обращают на себя внимание строки,
Код: выделить все
d = (int) MarketInfo(OrderSymbol(), MODE_DIGITS);
if(pp < 0 || NormalizeDouble(pp, d) == NormalizeDouble(OrderOpenPrice(), d))

где сначала берется информация о количестве цифр после точки в котировках данного торгового инструмента, осуществляется явное преобразование из типа double в целочисленный тип int, что обусловлено оператором (int), а потом введенное значение параметра pp, отвечающее за искомую цену, нормализуется и сравнивается также с нормализуемой ценой открытия текущей позиции, найденной в цикле.

В результате функция f_ExistPosByPrice() возвращает true при успешной операции поиска открытой позиции по заданным параметрам и false в случае отсутствия такой позиции.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 20625
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 1,130.65 Доллар
Группа: Главные модераторы
Благодарил (а): 2897 раз.
Поблагодарили: 7527 раз.

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

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

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

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

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