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

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

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

Сообщение Haos » 23 янв 2016, 14:01

В справке по MQL4 есть команда OrdersTotal, которая возвращает общее количество открытых и отложенных ордеров.
Однако, для подавляющего большинства задач этого не достаточно.
Рассмотрим, функцию для определения количества открытых позиций:
Код: выделить все
int f_GetNumberOfPositions(string sy = "", int op = -1, int mn = -1)
{
/*
   Версия   : 28.10.2015 г.                                                 
   Описание : Возвращает количество позиций (покупок или продаж или тех и других вместе)
   Сторонних ресурсов не использует           
   Параметры:                                                               
   sy - наименование инструмента   (""   - любой символ, "0"- текущий символ)             
   op - операция {-1 любая; OP_BUY; OP_SELL}
   mn - MagicNumber  (-1 - любой маджик)               
*/

  int i, k = OrdersTotal(), kp = 0;
  if(k == 0) return(0); // нет позиций вообще никаких
 
  if(sy == "0") sy = Symbol();
  for(i = 0; i < k; i++)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if(OrderSymbol() == sy || sy == "")
      {
        if(OrderType() == OP_BUY || OrderType() == OP_SELL)
        {
          if(op < 0 || OrderType() == op)
          {
            if(mn < 0 || OrderMagicNumber() == mn) kp++;
          }
        }
      }
    }
  }
return(kp);
}

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

Алгоритм действий

1. Создать новый советник
2. Скопировать код функции f_GetNumberOfPositions() и вставить после функции OnTick(), т.е. в самый конец кода.
3. Создать переменную кол-во открытых позиций в теле функции OnTick():
Код: выделить все
int intPos;

4. Присвоить этой переменной значение функции f_GetNumberOfPositions():
Код: выделить все
intPos = f_GetNumberOfPositions("0", -1, -1);

В качестве параметров функции выбраны:
"0" - для текущего инструмента (т.е. на какой валютной паре запущен советник);
-1 - любая операция;
-1 - любой мэджик.
5. Сделать возможность выводить на экран (левый верхний угол) через комментарий количество открытых позиций, написав строку кода:
Код: выделить все
Comment("\n", "Количество открытых позиций: ", intPos);

5. Откомпилировать советник.
Советник готов к использованию. Запустив его на кокой-нибудь паре, мы получим кол-во открытых позиций. Рынок при этом должен быть открыт.
Код советника:
Код: выделить все
//+------------------------------------------------------------------+
//|                                                EA-Example-01.mq4 |
//|                                                             Haos |
//|                                       http://www.investforum.ru/forum/ |
//+------------------------------------------------------------------+
#property copyright "Haos"
#property link      "http://www.investforum.ru/forum/"
#property version   "1.00"
#property strict

//******************************************************************************************

int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}

//******************************************************************************************

void OnDeinit(const int reason)
{
//---
   
}

//******************************************************************************************

void OnTick()
{
   int intPos;
   intPos = f_GetNumberOfPositions("0", -1, -1);
   Comment("\n", "Количество открытых позиций: ", intPos);
}

//******************************************************************************************

int f_GetNumberOfPositions(string sy = "", int op = -1, int mn = -1)
{
/*
   Версия   : 28.10.2015 г.                                                 
   Описание : Возвращает количество позиций (покупок или продаж или тех и других вместе)
   Сторонних ресурсов не использует           
   Параметры:                                                               
   sy - наименование инструмента   (""   - любой символ, "0"- текущий символ)             
   op - операция {-1 любая; OP_BUY; OP_SELL}
   mn - MagicNumber  (-1 - любой маджик)               
*/

  int i, k = OrdersTotal(), kp = 0;
  if(k == 0) return(0); // нет позиций вообще никаких
 
  if(sy == "0") sy = Symbol();
  for(i = 0; i < k; i++)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if(OrderSymbol() == sy || sy == "")
      {
        if(OrderType() == OP_BUY || OrderType() == OP_SELL)
        {
          if(op < 0 || OrderType() == op)
          {
            if(mn < 0 || OrderMagicNumber() == mn) kp++;
          }
        }
      }
    }
  }
return(kp);
}

//*********************************************************************************************
Вложения
01.png
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

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

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

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

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

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

cron