https://www.mql5.com/ru/forum/107476
Функция NumberOfPositions(). Стр.18
Эта функция возвращает количество открытых в данный момент позиций
Функция ExistOrders(). Стр.2
Функция ExistOPNearMarket(). Стр.16
Данная функция возвращает флаг существования ордера или позиции около рынка (на заданном расстоянии в пунктах от рынка).
Функция NumberOfOrders(). Стр.12
Эта функция возвращает количество ордеров и функционально полностью перекрывает ExistOrders().
Функция DistMarketAndPos(). Стр.15
Например, такая, которая возвращает расстояние в пунктах между рынком и ближайшей позицей
и т.п. ....
Функция 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); }
Как она у вас работала? Не должна бы в таком виде она работать.
Функция выдает численное значение или "-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;
Вроде зеркальные функции, а в Селле выставляются стоп и профит а в бай нет. Посмотрите плиз
TP=(Bid-30*Point)+42*Point; - возможно здесь не соблюдены допустимые стопуровни ?
Например, в Альпари при таком тейке журнал вернет ошибку 130
Похоже, вы путаете понятия "позиция" и "ордер".
У вас в данном случае выставляются ордера. Байлимит и селлимит.
Мне непонятно, зачем вы их модифицируете.
Вставляйте 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())
как получить количество ордеров, отдельно для селл и бай
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброе время суток...
Подскажите пожалуйста, может кто то сталкивался.
Надо бы функцию, которая определяет количество открытых ордеров. А точнее:
Если открытых ордеров 10, то возвращает значение "1". Если открытых ордеров меньше 10ти, то возвращает значение 0.
Смысл в том, чтоб на каждом тике не открывались еще ордера, а вот нюанс в том, чтоб можно было ставить 2 открытых и 8 отложенных.
Заранее благодарен за любую инфу