Как определить количество позиций с одинаковым лотом

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

Как определить количество позиций с одинаковым лотом

Сообщение Haos » 01 апр 2020, 18:33

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

Ничего сложного в алгоритме нет. Как обычно, нам нужно организовать цикл просмотра всех открытых позиций для данного торгового инструмента, а также произвести уточнение в выборе позиций для определенного торгового робота, что осуществляется через MagicNumber.

Ниже представлена реализация данной задачи в виде отдельной функции f_GetNumberOfPositionsByLot() с передачей в неё трех параметров: величины нужного лота, типа отрытой позиции (покупка, продажа или и то и другое) и мэджика.
Код: выделить все
int f_GetNumberOfPositionsByLot(double qq, int op = -1, int mn = -1)
{
/*
   Возвращает кол-во позиций с заданным лотом по текущему инструменту
   Параметры:
   qq - величина лота
   op - тип операции (OP_BUY / OP_SELL) (-1 - любая операция)
   mn - мэджик (-1 - любой мэджик)
*/
   int int_Pos = 0;
 
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol())
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(op < 0 || OrderType() == op)
               {
                  if(mn < 0 || OrderMagicNumber() == mn)
                  {
                     if(OrderLots() == qq) int_Pos++;
                  }
               }
            }
         }
      }
   }
return(int_Pos);
}

Также данная функция позволяет указать в качестве параметра для подсчета позиции только на покупку или только на продажу, а также и покупки и продажи в целом. Это второй параметр int op. Третий, как было сказано выше это MagicNumber.

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

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

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

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

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

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