Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 15

 
Vitalie Postolache:
Циклы нужно в обратном порядке считать, от OrdersTotal()-1 до 0.
При закрытии в цикле.
 
Vitalie Postolache:
Циклы нужно в обратном порядке считать, от OrdersTotal()-1 до 0.
Это функции Кима, и они работают без промаха, проблема в чём-то другом
 
Значит случайно несколько советников на одном символе включил, многие так попадали.
 
Neron_76:
 Здравствуйте! Поставил своего робота на демо счет, второй месяц работает. Сегодня открываю терминал, выставлены два ордера по одному сигналу, хотя до этого выставлялся один ордер. Ограничение на количество  ордеров есть. В чем может быть причина? 

Судя по коду, у Вас вторым по счету выставляется не рыночный ордер, а отложенный.

Ограничение по количеству открытых ордеров действует только на рыночные ордера.

Поэтому ошибки и соответственно проблемы нет.

 
Renat Akhtyamov:

Судя по коду, у Вас вторым по счету выставляется не рыночный ордер, а отложенный.

Ограничение по количеству открытых ордеров действует только на рыночные ордера.

Поэтому ошибки и соответственно проблемы нет.

 Ограничение действует на открытые и отложенные ордера. За полтора месяца у меня это второй случай, во всех остальных выставляется как надо.
 
Neron_76:
 Ограничение действует на открытые и отложенные ордера. За полтора месяца у меня это второй случай, во всех остальных выставляется как надо.

Попробуйте так:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
 
Vitaly Muzichenko:

Попробуйте так:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
      Функции заменил, на тесте идет нормально. Посмотрим как будет в торговле на демо. Но почему то, мне кажется, в моем случае и те, и эти функции выполняют одну и ту же задачу, т.е. отвечают на вопрос есть       ли ордера и позиции.
 
Neron_76:
      Функции заменил, на тесте идет нормально. Посмотрим как будет в торговле на демо. Но почему то, мне кажется, в моем случае и те, и эти функции выполняют одну и ту же задачу, т.е. отвечают на вопрос есть       ли ордера и позиции.
Если повториться двойная установка ордера, тогда нужно пересматривать функцию "SetOrder", возможно она даёт два запроса, после первого запроса нет выхода с функции, и успевает посылать второй.
 
Vitaly Muzichenko:
Если повториться двойная установка ордера, тогда нужно пересматривать функцию "SetOrder", возможно она даёт два запроса, после первого запроса нет выхода с функции, и успевает посылать второй.
      Если это так почему это происходит не всегда, что то происходит между тиками? Я в этом не очень силен.
 
Neron_76:
      Если это так почему это происходит не всегда, что то происходит между тиками? Я в этом не очень силен.
Между тиками одного символа могут происходить тики другого символа. Если советник мультивалютный, то он видит тики с другого символа. Ещё между тиками могут происходить события таймера - OnTimer() и события OnChartEvent() - чуть не написал "события событий"... была бы подстава подстав...
Причина обращения: