Сумма лотов открытых позиций

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

Сумма лотов открытых позиций

Сообщение Haos » 21 дек 2020, 08:11

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

Так, в частности, разрабатываемый нами советник Колобок (см. тему Создание советника по ТС "Колобок" (мод. трин)) нуждается в такой функции. Этот советник, как мы помним, предназначен для быстрой отработки необходимого объема сделок, что необходимо для отработки бонусов у целого ряда брокеров рынка Форекс.

Ниже приведем код рассматриваемой функции:
Код: выделить все
double f_GetPosSumLots(string sy, int op, int mn)
{
/*
Проверено! Работает правильно
Описание : Возвращает сумму лотов открытых позиций   
Если выбран тип операции "-1" (любая позиция), то функция вернет
разность лотов покупок и продаж. Если она будет положительной,
то суммарный лот больше покупок если отрицательной - суммарный лот
больше продаж.
Параметры:                                                               
sy - наименование инструмента   ("0" - текущий символ)                 
op - операция                   (-1   - любая позиция)                 
mn - MagicNumber                (-1   - любой магик)                   
*/
   double dbl_Y = 0, dbl_BuyQ = 0, dbl_SelQ = 0;

   if(sy == "0") sy = Symbol();
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == sy)
         {
            if(mn < 0 || OrderMagicNumber() == mn)
            {
               if(op < 0)
               {
                  if(OrderType() == OP_BUY)  dbl_BuyQ += OrderLots();
                  if(OrderType() == OP_SELL) dbl_SelQ += OrderLots();                 
               }
               else if(OrderType() == OP_BUY && op == OP_BUY) 
               {
                  dbl_BuyQ += OrderLots();
               }
               else if(OrderType() == OP_SELL && op == OP_SELL) 
               {
                  dbl_SelQ += OrderLots();
               }
            }
         }
      }
   }
   if(op == OP_BUY)  dbl_Y = dbl_BuyQ;
   if(op == OP_SELL) dbl_Y = dbl_SelQ;
   if(op < 0) dbl_Y = dbl_BuyQ - dbl_SelQ;

return(dbl_Y);
}   

Назовём функцию f_GetPosSumLots(). Я всегда ставлю символы "f_" перед смысловой частью в названии функции, чтобы систематизировать разрабатываемый код, чтобы было ясно, что дело имеем с функцией.
Данная функция возвращает тип double, что очевидно, т.к. сумма лотов открытых позиций, в основном, не целое число.
Параметрами функцию являются:
sy - наименование инструмента ("0" - текущий символ)
op - операция (-1 - любая позиция)
mn - MagicNumber (-1 - любой магик)
Таким образом, функция может возвращать сумму лотов открытых позиций нетолько по текущему инструменту (торговой паре), а по любому, по которому имеются открытые позиции.

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

Мэджик "mn" мы всегда указываем для спецификации эксперта с которым функция расчета суммы лотов открытых позиций f_GetPosSumLots() имеет дело. Это необходимо чтобы выделить позиции открытые конкретным экспертом и не путать их с позициями, открытыми вручную или другим экспертом.

В функции мы вводим три переменные типа double, для расчетов суммы лотов открытых позиций. Далее в цикле перебора всех ордеров, выбираем согласно спецификациям открытые позиции, далее из них ищем позиции по заданному торговому инструменту, потом выбираем позиции с заданным мэджиком.
Для покупок в переменной dbl_BuyQ агрегируем значения всех лотов покупок, а в переменной dbl_SelQ - значения всех лотов продаж.

В завершении функция расчета суммы лотов открытых позиций f_GetPosSumLots() возвращает найденное значение, присвоив его переменной dbl_Y, а при необходимости возврата суммарного лота, дополнительно считает разность между dbl_BuyQ и dbl_SelQ.

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

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

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

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

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

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