Только одна позиция

 
До недавнего времени я пользовался такой вот функцией
//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции                            |
//+------------------------------------------------------------------+
bool ExistPosition() {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}


Сегодня обнаружил, что она работает некорректно. Т.е. не смотря на условие if (!ExistPosition()) { перед открытием позиции, тестер всё равно открывает дополнительные позиции.

Поэтому прошу совета. Каким ещё образом можно добиться открытия только одной позиции?

 
!ExistPosition() означает что открытых позиций нет - так вроде бы?
 
!ExistPosition() означает что открытых позиций нет - так вроде бы?

Да, именно, так.
И тем не менее советник открывает от 1 до 8 дополнительных позиций. Билд 186. Пробовал 185.

В реалтайме эта функция хорошо себя зарекомендовала, но вот не ожидал глюков при тестировании на истории. Сейчас пока гоняю с условием if (OrdersTotal()==0) вместо if (!ExistPosition()).
 
Доработал функцию таким образом:
//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции                            |
//+------------------------------------------------------------------+
bool ExistPosition() {
  bool Exist=False;
  if (IsTesting()) {
    if (OrdersTotal()!=0) Exist=True;
  } else {
    for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
          if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
            Exist=True; break;
          }
        }
      }
    }
  }
  return(Exist);
}


Чтобы можно было ей пользоваться и в реалтайме, и на истории. Жалко только, что на истории она теперь не отличает позиции от ордеров. Подскажите, что можно сделать?

 
До недавнего времени я пользовался такой вот функцией
//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции                            |
//+------------------------------------------------------------------+
bool ExistPosition() {
}


Сегодня обнаружил, что она работает некорректно. Т.е. не смотря на условие if (!ExistPosition()) { перед открытием позиции, тестер всё равно открывает дополнительные позиции.


в это сложно поверить. попробуйте поставить пару принтов для проверки ситуации. ну или пришлите Ваш код на stringo at metaquotes dot ru для выяснения. конфиденциальность гарантирую.
 
У меня такой код работал и работает до сих пор.
//+------------------------------------------------------------------+
//| посчитаем количество открытых ордеров                            |
//+------------------------------------------------------------------+
int TotalExpert()
   {
   int total,totalExpert;
   total=OrdersTotal();
   totalExpert=0;
   LongOrderExist=false;
   ShortOrderExist=false;
   if (OrdersTotal()>0)
      {
      for (int cnt=0;cnt<total;cnt++)
         {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if ((OrderMagicNumber()==ExpertMagicNumber)&&(Symbol()==OrderSymbol())) 
            {
            totalExpert++;
            if (OrderType()==OP_BUY) 
               {
               LongOrderExist=true;
               }
            if (OrderType()==OP_SELL) 
               {
               ShortOrderExist=true;
               }
            }
         }
      }
   return(totalExpert);      
   }
 
наверняка проблема в "OrderMagicNumber()==MAGIC" это условие не срабатывает и функция возвращает фальсе (тип переменной Magic), а if (OrderType()==OP_BUY || OrderType()==OP_SELL) я бы заменил на
if (OrderType()<2)
 
Всем огромное СПАСИБО за участие!
Ошибка была моей и заключалась она в следующем:
ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,0,0,clOpen);


а надо было так

ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen);



Slawa, Rosh, мне стыдно...

 
и не такое бывает ;)
Причина обращения: