Несколько условий на покупку в СОВЕТНИКЕ! ВОПРОС!!!

 

Здравствуйте!!! Сталкнулся с проблемой....в Советнике несколько условий на покупку...Но почему-то выполняется только условие №1, хотя если условие №2 поменять местами друг с другом, то все равно выполняется условие которое стоит выше...Я так понимаю что функция ОрдерТотал распростроняется на общее кол-во условий....Естественно будет только первое выполнятся.....А как сделать что бы оба условия выполнялись, не мешая друг другу и могли открываться одновременно 2 сделки по разным условиям???? Подскажите пожалуйста!!!

total=OrdersTotal();
   if(total<1) 
     {
      // нет ни одного открытого ордера
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
       
      

      // проверяем на возможность встать в длинную позицию (BUY)
      if ( ПРАМ-ПАМ-ПАМ) 
           {
           
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask - Point * 160,Ask + Point * 20,"My    
         order1",11111,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened 1: ",OrderOpenPrice());                      
           }
         else Print("Error opening BUY order 1: ",GetLastError()); 
         return(0); 
        }
     return(0);
     }
   

  //условие №2
   
   total2=OrdersTotal();
   if(total2<2) 
     {
      // нет ни одного открытого ордера
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // проверяем на возможность встать в короткую позицию (БАЙ)
       
    

         if (ПРАМ-ПАМ-ПАМ)
           {
           
         ticket2 = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask - Point * 200,Ask + Point * 20,"My   
         order2",11112,0,Black);
         if(ticket2>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened 2: ",OrderOpenPrice());                      
           }
         else Print("Error opening BUY order 2: ",GetLastError()); 
         return(0); 
        }
        
      return(0);
   }
 

Проверка на "нет ни одного открытого" ордера самая примитивная, а потому в реальной жизни не используется. Т.к. в реальной жизни может быть несколько ордеров открытых разными советниками, плюс руками по-балуешься откроешь что-нибудь.

У тебя не два условия на вход, а две самостоятельных подсистемы, каждая из которых может открывать сделки. Значит надо каждой подсистеме присвоить собственный мэджик нумбер (у тебя уже есть) и проверять наличие/отсутствие открытых ордеров с данным мэджиком.

 
timbo:

Проверка на "нет ни одного открытого" ордера самая примитивная, а потому в реальной жизни не используется. Т.к. в реальной жизни может быть несколько ордеров открытых разными советниками, плюс руками по-балуешься откроешь что-нибудь.

У тебя не два условия на вход, а две самостоятельных подсистемы, каждая из которых может открывать сделки. Значит надо каждой подсистеме присвоить собственный мэджик нумбер (у тебя уже есть) и проверять наличие/отсутствие открытых ордеров с данным мэджиком.

Если убрать функцию ОрдерТотал, то он начинает открывать множество сделок сразу.....МОжет как то можно заменить данную функцию и все станет на свои места???

 

Вместо OrdersTotal() вставьте вызов этой функции. В нее передаете MagicNumber она возврашает кол-во

открытых оредров с этим  MagicNumber`ом.

Например:

total1=OrdersCount(11111);

total2=OrdersCount(11112);

Сама функция:

int OrdersCount(int MN)
{
  int Orders=0;
  int total=OrdersTotal();
  for (int i=0; i<total; i++)
    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) 
      return (-1);

    
    if (OrderMagicNumber()!=MN)
      continue;
 
    Orders++;  
    }
  
  return(Orders);
}
 
slayer:

Здравствуйте!!! Сталкнулся с проблемой....в Советнике несколько условий на покупку...Но почему-то выполняется только условие №1, хотя если условие №2 поменять местами друг с другом, то все равно выполняется условие которое стоит выше...Я так понимаю что функция ОрдерТотал распростроняется на общее кол-во условий....Естественно будет только первое выполнятся.....А как сделать что бы оба условия выполнялись, не мешая друг другу и могли открываться одновременно 2 сделки по разным условиям???? Подскажите пожалуйста!!!

  //условие №2
   
   total2=OrdersTotal();
   if(total2<2) 
     {
      // нет ни одного открытого ордера
      

а почему второе условие должно выполняться? Оно и не должно!

почему у вас total2<2 ? С какой радости?

а в комментарии написано - // нет ни одного открытого ордера

Странно всё это...

 
slayer:

Если убрать функцию ОрдерТотал, то он начинает открывать множество сделок сразу.....МОжет как то можно заменить данную функцию и все станет на свои места???

Не убрать, а использовать с головой.

Сделать проверку на количество открытых ордеров с конкретным мэджиком. Если один с номером 11112 уже есть, то не разрешать второй подсистеме открывать новые ордера. А все остальные подсистемы и/или советники пусть себе торгуют.

Думай! Тебе уже дали готовую функцию, но лучше было бы для тебе придумать её самому.

 
rid:
slayer:

Здравствуйте!!! Сталкнулся с проблемой....в Советнике несколько условий на покупку...Но почему-то выполняется только условие №1, хотя если условие №2 поменять местами друг с другом, то все равно выполняется условие которое стоит выше...Я так понимаю что функция ОрдерТотал распростроняется на общее кол-во условий....Естественно будет только первое выполнятся.....А как сделать что бы оба условия выполнялись, не мешая друг другу и могли открываться одновременно 2 сделки по разным условиям???? Подскажите пожалуйста!!!

  //условие №2
   
   total2=OrdersTotal();
   if(total2<2) 
     {
      // нет ни одного открытого ордера
      

а почему второе условие должно выполняться? Оно и не должно!

почему у вас total2<2 ? С какой радости?

а в комментарии написано - // нет ни одного открытого ордера

Странно всё это...

комментрий забыл убрать!!!! Сорри!!!! Если поставить if(total2<1) то результат будет тот же, что и раньше

 

Если нет желания использовать функцию от DENISka, то вот здесь есть функция, которую тоже можно использовать вместо OrdersTotal();

'Полезные функции от KimIV'

Функция ExistPositions().

Предназначена для проверки наличия открытых покупок или продаж

Задавайте в ней магик для открытия по условию первой позиции

Потом другой магик для открытия позиции по другому условию.

Там даже есть пример применения этой фнкции для вашего случая.

 
rid:

Если нет желания использовать функцию от DENISka, то вот здесь есть функция, которую тоже можно использовать вместо OrdersTotal();

'Полезные функции от KimIV'

Функция ExistPositions().

Предназначена для проверки наличия открытых покупок или продаж

Задавайте в ней магик для открытия по условию первой позиции

Потом другой магик для открытия позиции по другому условию.

Там даже есть пример применения этой фнкции для вашего случая.

Хорошо....Спасибо!!!

 
DENISka:

Вместо OrdersTotal() вставьте вызов этой функции. В нее передаете MagicNumber она возврашает кол-во

открытых оредров с этим MagicNumber`ом.

Например:

total1=OrdersCount(11111);

total2=OrdersCount(11112);

Сама функция:

int OrdersCount(int MN)
{
  int Orders=0;
  int total=OrdersTotal();
  for (int i=0; i<total; i++)
    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) 
      return (-1);

    
    if (OrderMagicNumber()!=MN)
      continue;
 
    Orders++;  
    }
  
  return(Orders);
}


Не сомневаюсь что функция хороша....Но когда ее вставляю, почему у меня выдает такую ошибку:

'(' - function definition unexpected

При чем показывает на строчку int OrdersCount(int MN)

 
slayer:
DENISka:

Вместо OrdersTotal() вставьте вызов этой функции. В нее передаете MagicNumber она возврашает кол-во

открытых оредров с этим MagicNumber`ом.

Например:

total1=OrdersCount(11111);

total2=OrdersCount(11112);

Сама функция:

int OrdersCount(int MN)
{
  int Orders=0;
  int total=OrdersTotal();
  for (int i=0; i<total; i++)
    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) 
      return (-1);

    
    if (OrderMagicNumber()!=MN)
      continue;
 
    Orders++;  
    }
  
  return(Orders);
}


Не сомневаюсь что функция хороша....Но когда ее вставляю, почему у меня выдает такую ошибку:

'(' - function definition unexpected

При чем показывает на строчку int OrdersCount(int MN)

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