Запрет на открытие ордеров больше лимита одновременно открытых сделок

 
Добрый день, может кто-нибудь подсказать как правильнее всего прописать, что бы советник одновременно со всех графиков держал не более определенного количества ордеров. То есть в случае если работа идет по нескольким инструментам и одновременно поступит сигнал на открытие ордера, то робот не смог открыть одновременно больше сделок чем указано. Но тем не менее не прекращал свою работу, а по факту уменьшения количества сделок имел возможность открыть еще в пределах ограничения.Для языка МКЛ4 Подскажите пожалуйста, буду признателен)
 

дежавю ?   https://www.mql5.com/ru/forum/309394#comment_11198558



Iurii Tokman:

Функция NumberOfOrders().

Эта функция возвращает количество ордеров и функционально полностью перекрывает ExistOrders(). Для того, чтобы заменить функцию ExistOrders() функцией NumberOfOrders(), необходимо и достаточно проверять возвращаемое значение на то, чтобы оно было больше нуля. Ограничить перечень проверяемых ордеров можно параметрами функции:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой ордер.
  • mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
Ограничение одновременно открытых позиций
Ограничение одновременно открытых позиций
  • 2019.04.02
  • www.mql5.com
Добрый день, может кто-нибудь подсказать как правильнее всего прописать, что бы советник одновременно со всех графиков держал не более определенног...
 
Mikhail Vlasov:
Добрый день, может кто-нибудь подсказать как правильнее всего прописать, что бы советник одновременно со всех графиков держал не более определенного количества ордеров. То есть в случае если работа идет по нескольким инструментам и одновременно поступит сигнал на открытие ордера, то робот не смог открыть одновременно больше сделок чем указано. Но тем не менее не прекращал свою работу, а по факту уменьшения количества сделок имел возможность открыть еще в пределах ограничения.Для языка МКЛ4 Подскажите пожалуйста, буду признателен)

Функция NumberOfPositions().

Эта функция возвращает количество открытых в данный момент позиций. Более точный отбор подсчитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUYOP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=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);
}

 

Нет, модератор написал, что не по адресу, вот перенес вопрос сюда. Спасибо за подсказку

 

int OPEN=1;

if(OrdersTotal())>100) OPEN=0; //можно открыть не более 100 ордеров

if(OPEN==1)

{

   //Здесь открываем

}

 
Renat Akhtyamov:

int OPEN=1;

if(OrdersTotal())>100) OPEN=0; //можно открыть не более 100 ордеров

if(OPEN==1)

{

   //Здесь открываем

}

Ренат, как-то немодно. Нет, чтобы OPEN="Можно", или OPEN="Нельзя". 

 
Алексей Тарабанов:

Ренат, как-то немодно. Нет, чтобы OPEN="Можно", или OPEN="Нельзя". 

я не люблю портянки

честно

можно применить стринги конечно, но строки сравнивать и цифру - это почти что небо и земля

;)

хотяяяяя...

ну вот, если так угодно:

string OPEN="Можно";

if(OrdersTotal())>100) OPEN="Нельзя"; //можно открыть не более 100 ордеров

if(OPEN=="Можно")

{

   //Здесь открываем

}

 
Renat Akhtyamov:

я не люблю портянки

честно

можно применить стринги конечно, но строки сравнивать и цифру - это почти что небо и земля

;)

хотяяяяя...

ну вот, если так угодно:

string OPEN="Можно";

if(OrdersTotal())>100) OPEN="Нельзя"; //можно открыть не более 100 ордеров

if(OPEN=="Можно")

{

   //Здесь открываем

}

О. 

Можем ведь! 

 
Renat Akhtyamov:


можно применить стринги конечно, но строки сравнивать и цифру - это почти что небо и земля

Не надо никаких стрингов. Используем перечисления:

enum ENUM_PERMISSION
{
   PERMISSION_DISABLED,
   PERMISSION_ENABLED
};