Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Управляй агентами в профиле. Это просто!
Forex Trader
114255
Forex Trader 2005.12.02 10:23 
До недавнего времени я пользовался такой вот функцией
//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции                            |
//+------------------------------------------------------------------+
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()) { перед открытием позиции, тестер всё равно открывает дополнительные позиции.

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

Forex Trader
114255
Forex Trader 2005.12.02 10:56  
!ExistPosition() означает что открытых позиций нет - так вроде бы?
Forex Trader
114255
Forex Trader 2005.12.02 11:46  
!ExistPosition() означает что открытых позиций нет - так вроде бы?

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

В реалтайме эта функция хорошо себя зарекомендовала, но вот не ожидал глюков при тестировании на истории. Сейчас пока гоняю с условием if (OrdersTotal()==0) вместо if (!ExistPosition()).
Forex Trader
114255
Forex Trader 2005.12.02 12:07  
Доработал функцию таким образом:
//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции                            |
//+------------------------------------------------------------------+
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);
}


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

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


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


в это сложно поверить. попробуйте поставить пару принтов для проверки ситуации. ну или пришлите Ваш код на stringo at metaquotes dot ru для выяснения. конфиденциальность гарантирую.
Forex Trader
114255
Forex Trader 2005.12.02 12:24  
У меня такой код работал и работает до сих пор.
//+------------------------------------------------------------------+
//| посчитаем количество открытых ордеров                            |
//+------------------------------------------------------------------+
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);      
   }
Forex Trader
114255
Forex Trader 2005.12.02 13:22  
наверняка проблема в "OrderMagicNumber()==MAGIC" это условие не срабатывает и функция возвращает фальсе (тип переменной Magic), а if (OrderType()==OP_BUY || OrderType()==OP_SELL) я бы заменил на
if (OrderType()<2)
Forex Trader
114255
Forex Trader 2005.12.02 13:43  
Всем огромное СПАСИБО за участие!
Ошибка была моей и заключалась она в следующем:
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, мне стыдно...

Forex Trader
114255
Forex Trader 2005.12.02 13:48  
и не такое бывает ;)
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий