Подсчет ордеров

 

Доброе время суток...

Подскажите пожалуйста, может кто то сталкивался.

Надо бы функцию, которая определяет количество открытых ордеров. А точнее:

Если открытых ордеров 10, то возвращает значение "1". Если открытых ордеров меньше 10ти, то возвращает значение 0.

Смысл в том, чтоб на каждом тике не открывались еще ордера, а вот нюанс в том, чтоб можно было ставить 2 открытых и 8 отложенных.

Заранее благодарен за любую инфу

 

https://www.mql5.com/ru/forum/107476

Функция NumberOfPositions(). Стр.18
Эта функция возвращает количество открытых в данный момент позиций
Функция ExistOrders(). Стр.2
Функция ExistOPNearMarket(). Стр.16
Данная функция возвращает флаг существования ордера или позиции около рынка (на заданном расстоянии в пунктах от рынка).
Функция NumberOfOrders(). Стр.12
Эта функция возвращает количество ордеров и функционально полностью перекрывает ExistOrders(). 
Функция DistMarketAndPos(). Стр.15
Например, такая, которая возвращает расстояние в пунктах между рынком и ближайшей позицей

и т.п. ....




 
rid писал(а) >>

'Полезные функции от KimIV'

Функция NumberOfPositions(). Стр.18
Эта функция возвращает количество открытых в данный момент позиций
Функция ExistOrders(). Стр.2
Функция ExistOPNearMarket(). Стр.16
Данная функция возвращает флаг существования ордера или позиции около рынка (на заданном расстоянии в пунктах от рынка).
Функция NumberOfOrders(). Стр.12
Эта функция возвращает количество ордеров и функционально полностью перекрывает ExistOrders().
Функция DistMarketAndPos(). Стр.15
Например, такая, которая возвращает расстояние в пунктах между рынком и ближайшей позицей

и т.п. ....

rid спасибо большое, но первая функция хоть и похожа но ____LIMIT и ____STOP отдера к сожалению не учитывает...попробую ка я просто их добавить после "или"

 

Первая функция учитывает позиции (открытые позиции).

Но не ордера.

Отложенные ордера учитывает функция Функция NumberOfOrders()

 

Вот спасибо! Разобрался. Ай да Игорь. Все дороги ведут к нему в ветку :)

Вот только проблема! Сначала работала функция а потом почему то перестала о_О

int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
Alert(NumberOfOrders());
//----
return(0);
}
//+------------------------------------------------------------------+

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);
}

 

Как она у вас работала? Не должна бы в таком виде (как у вас) она работать.

Функция выдает численное значение или "-1"

Т.е. Я задействовал бы её вот так (к примеру, в самом простейшем случае):

int start()
{
//----
if (NumberOfOrders(NULL,OP_BUYLIMIT,MAGIC)>0)
//если имеются ордера BUYLIMIT по текущему символу с 
//заданным магиком, то - выводим коммент
Comment("количество ордеров байлимит=",NumberOfOrders(NULL,OP_BUYLIMIT,MAGIC) );
//----

if (NumberOfOrders(NULL,OP_SELLSTOP,MAGIC)>0)
//если имеются ордера SELLSTOP по текущему символу с 
//заданным магиком, то - выводим коммент
Comment("количество ордеров селлстоп=",NumberOfOrders(NULL,OP_SELLSTOP,MAGIC) );
//------

return(0);
}
 
rid писал(а) >>

Как она у вас работала? Не должна бы в таком виде она работать.

Функция выдает численное значение или "-1"

Т.е. Я задействовал бы её вот так (к примеру, в самом простейшем случае):

Все исправил...просто функция только отложенные ордера считает. А мне надо было открытые позиции.

Вот опять проблем:

int SellLimit1() // Функция открытия короткой позиции
{
double SL=(Ask+30*Point)+89*Point;
double TP=(Ask+30*Point)-42*Point;
double Price =OrderOpenPrice();
int Ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Ask+42*Point,3,0,0,"",0,0,CLR_NONE);
OrderModify(Ticket,Price,SL,TP,0);
Print(GetLastError());
}
return;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

int BuyLimit1() // Функция открытия длинной позиции. Проверено!
{
double SL=(Bid-30*Point)-89*Point;
double TP=(Bid-30*Point)+42*Point;
double Price =OrderOpenPrice();
int Ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Bid-42*Point,3,0,0,"",0,0,CLR_NONE);
OrderModify(Ticket,Price,SL,TP,0);
Print(GetLastError());
}
return;

Вроде зеркальные функции, а в Селле выставляются стоп и профит а в бай нет. Посмотрите плиз

 

Похоже, вы путаете понятия "позиция" и "ордер".

У вас в данном случае выставляются ордера. Байлимит и селлимит.

Мне непонятно, зачем вы их модифицируете. 

Вставляйте SL и TP  сразу в OrderSend

Даже в ДЦ с рыночным исполнением ордеров отложки можно выставлять сразу со стопами.

 

TP=(Bid-30*Point)+42*Point; - возможно здесь не соблюдены допустимые стопуровни ? 

Например, в Альпари при таком тейке журнал вернет ошибку 130

 
rid писал(а) >>

Похоже, вы путаете понятия "позиция" и "ордер".

У вас в данном случае выставляются ордера. Байлимит и селлимит.

Мне непонятно, зачем вы их модифицируете.

Вставляйте SL и TP сразу в OrderSend

Даже в ДЦ с рыночным исполнением ордеров отложки можно выставлять сразу со стопами.

И правда можно сразу выставлять. Месяцев эдак 8 назад, нельзя было в WHC Trader о_О

 

Помогите и мне пожалуйста.

У меня в советнике выставляются отложеные ордера Sell & Buy

Следующими функциями я контролирую количество ордеров отдельно для се и для бай (замысел)

int NumberOfPositionsS(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_SELLSTOP) 
        {
          if (op<0 || OrderType()==op) 
          {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}

int NumberOfPositionsB(string sy="", int op=-1, int mn=-1) 
{
  int d, k=OrdersTotal(), ks=0;

    if (sy=="0") sy=Symbol();
  for (d=0; d<k; d++) 
  {
    if (OrderSelect(d, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderSymbol()==sy || sy=="")
       {
        if (OrderType()==OP_BUYSTOP) 
        {
          if (op<0 || OrderType()==op) 
          {
            if (mn<0 || OrderMagicNumber()==mn) ks++;
          }
        }
      }
    }
  }
  return(ks);
}

но сравнивается с общим количеством ордеров ( k=OrdersTotal())

как получить количество ордеров, отдельно для селл и бай