Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Александр
318
Александр  

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

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

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

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

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

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

Rid
3170
Rid  

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

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

и т.п. ....




Александр
318
Александр  
rid писал(а) >>

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

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

и т.п. ....

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

Rid
3170
Rid  

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

Но не ордера.

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

Александр
318
Александр  

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

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

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

Rid
3170
Rid  

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

Функция выдает численное значение или "-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);
}
Александр
318
Александр  
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;

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

Rid
3170
Rid  

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

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

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

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

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

Rid
3170
Rid  

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

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

Александр
318
Александр  
rid писал(а) >>

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

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

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

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

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

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

ivan
313
ivan  

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

У меня в советнике выставляются отложеные ордера 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())

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий