Помогите найти ошибку, - УСТАЛ!

 

Проблема в следующем: Объединяю два эксперта, т.е. абсолютно разные условия для торговли. Использую два Magic, для каждого ордера, но не могу добиться, чтобы отрывались только одна позиция, если есть сигнал из первого условия и только одна из второго. Т.е. одновременно должно быть открыто максимум два ордера из разных условий. Я уже перебрал все статьи и посты по данной теме (объединяем эксперты), но что - то у меня не получается. Пожалуйста помогите именно на моем примере!!! Действительно уже устал ((. ..

bool BYU_1()
{
  // Условия для открытия BUY из первого эксперта
 
}
 
bool BYU_2()
{
  // Условия для открытия BUY из второго эксперта
 
}
 
int start()
{
 
 
  if (BYU_1())
      {
       OpenBuyOrder();
        }
   
     if ( BYU_2())
   {
        OpenBuyOrder_2();
    }   
  
      return(0);
}
 
 
void OpenBuyOrder()
{
 
   double myStopLoss = 0, myTakeProfit = 0;
   myStopLoss = 0;
   if (!openPositions())
   {
   if ( StopLoss > 0 ) myStopLoss = Ask - StopLoss * Point ;
   myTakeProfit = 0;
   if (TakeProfit>0) myTakeProfit = Ask + TakeProfit * Point;
   OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage,myStopLoss,myTakeProfit,"",MagicNumber,0,Green); 
}
   
}
 
 
 
void OpenBuyOrder_2()
{
 
   double myStopLoss_2 = 0, myTakeProfit_2 = 0;
   myStopLoss_2 = 0;
   if (!openPositions_2())
   {
   if ( StopLoss_2 > 0 ) myStopLoss_2 = Ask - StopLoss_2 * Point ;
   myTakeProfit_2 = 0;
   if (TakeProfit_2>0) myTakeProfit_2 = Ask + TakeProfit_2 * Point;
   OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage_2,myStopLoss_2,myTakeProfit_2,"",MagicNumber_2,0,Green); 
 }
   
}
 
//+----------------------------------------------------------------------------------------------+
   
bool openPositions()
   
{
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
      if (OrderMagicNumber()!=MagicNumber) continue;
      {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol())  
         {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
 }
  return(Exist);
}
 
 
//+----------------------------------------------------------------------------------------------+
bool openPositions_2()
   
{
  bool Exist_2=False;
  for (int i_2=0; i_2<OrdersTotal(); i_2++) {
      if (OrderMagicNumber()!=MagicNumber_2) continue;
      {
      if (OrderSelect(i_2, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol())  
         {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist_2=True; break;
        }
      }
    }
  }
 }
  return(Exist_2);
}
 
в последних 2-х функциях вместо break поставь return(true)
 
Better:
в последних 2-х функциях вместо break поставь return(true)
не помогло, ничего не изменилось
 
Версия №2.
OrderMagicNumber() надо вызывать после OrderSelect(...), а не наоборот

А скобок фигурных у тебя многовато, половину можно поубирать, а то запутаться можно...
 
Better:
Тогда сдаюсь... запутался в твоих фигурных скобках :)
Может, у тебя MagicNumber==MagicNumber_2 ?


Нет, MagicNumbers разные. Сейчас эксперт (в том виде в котором выложен) выставляет несколько ордеров (пока есть сигнал) по первому условию и только один по второму, при чем одновременно не открываются, т.е. либо много первых, либо один второй.

Better, тем не менее спасибо за попытку помочь!

 
Better:
Версия №2.
OrderMagicNumber() надо вызывать после OrderSelect(...), а не наоборот

А скобок фигурных у тебя многовато, половину можно поубирать, а то запутаться можно...



РАБОТАЕТ!!!!!!!!!

Что самое, интересное, - я сегодня целый день мучаю этот код с 8:00 (утро) до теперешнего времени, а уже 2:30 (ночь), - и куда я только этот OrderMagicNumber() не сувал, казалось бы перепробавал все варианты (даже те которые не возможны), и до и после OrderSelect(...), и в OpenBuyOrder(), - АН нет, что то делал не так!!! Который раз убеждаюсь, что, если что не можешь сделать сам - спроси у народа - ОБЯЗАТЕЛЬНО ПОМОГУТ (совет всем, кто в данный момент над чем то потеет)!

Better, ОГРОМНОЕ СПАСИБО!!!

Причина обращения: