Коллеги! Где я допустил ошибку или как правильно реализовать?

 

Коллеги! Помогите найти ошибку. В ниже представленном коде, прохожу по всем открытым ордерам. Далее, если из всех открытых позиций, пресутсвуют те у которых магические номера Magic1a1 и Magic2a2, то открытие ордера запрещено. То есть получается если через условие if (), то выполнение кода пропускается. Если же нету в открытых, позиций с магическими номера Magic1a1 и Magic2a2, то блок открытия нового ордера выполняется. Проблема в том, что в условиях или еще где-то я сделал что-то не правильно и получается так, первая позиция не открывается, пока в открытых ордерах, ни одного нету. А если открою рукой, то далее начинается выполняться код. В не зависимости, что в условиях указанно, при наличии каких открытых ордеров, новый открывать запрещено. За любую помощь, буду премного благодарен.

for (int i=0; i<OrdersTotal(); i++)
{
        OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        
        int Mag = OrderMagicNumber();
               
if  (Mag != Magic1a1 && Mag != Magic2a2) //---- Выполнение условий для открытия позиций.  
      {

                   // Блок кода открытия новой позиции

         break;
       }
  }

В общем итоге мне нужно сделать, чтобы выполнялись 3 подобных условия:

1) if (Mag != Magic1a1 && Mag != Magic2a2) // Если в открытых нету позиций с магическими номерами Magic1a1 и Magic2a2.

2) if (Mag == Magic && Mag != Magic2a2) // Если в открытых присутствует позиция с магическим номером Magic, но нету позиции с Magic2a2.

3) if (Mag == Magic || Mag = = Magic1a1 && Mag != Magic3a3) // Если в открытых присутствуют позиции с магическими номерами Magic, Magic1a1, но при этом чтобы не было в открытых с номером Magic3a3.

Что я сделал не правильно и как будет правильно выглядеть и выполняться как нужно?

 

А где же этот, как его, а, код "ниже представленный"

 
Vinin:

А где же этот, как его, а, код "ниже представленный"


Пардон. Отредактировал выше. :)
 
MrSerj:

Пардон. Отредактировал выше. :)

Проблема похоже в другом месте зарыта. Поставь принты во всех возможных проблемных местах и отслеживай значения.
 
Vinin:

Проблема похоже в другом месте зарыта. Поставь принты во всех возможных проблемных местах и отслеживай значения.

Хорошо. Так и сделаю.

В общем. Я сам удивлен! Подумал, может, что я в условиях не так намудрил. Буду искать причину. Спасибо за помощь! :)

 
MrSerj:

Проблема в том, что в условиях или еще где-то я сделал что-то не правильно и получается так, первая позиция не открывается, пока в открытых ордерах, ни одного нету. А если открою рукой, то далее начинается выполняться код. В не зависимости, что в условиях указанно, при наличии каких открытых ордеров, новый открывать запрещено

Что в общем-то и логично. Пока ордеров нет, TotalOrders() == 0, цикл ни разу не исполняется. Проверяй "если ордеров" нет отдельно.

А вообще получится у тебя если в цикле первый попавшийся ордер позволяет по условию открыть новый ордер - то он откроестя вне зависимости от того, что следующие ордера могут это открытие запрещать. Заведи флаг.

 
vegetate:

Что в общем-то и логично. Пока ордеров нет, TotalOrders() == 0, цикл ни разу не исполняется. Проверяй "если ордеров" нет отдельно.

А вообще получится у тебя если в цикле первый попавшийся ордер позволяет по условию открыть новый ордер - то он откроестя вне зависимости от того, что следующие ордера могут это открытие запрещать. Заведи флаг.


По поводу установления флага. А можно Ваш пример реализации данной задачи, по условиям выше описанных мной? Спасибо. :)

 

MrSerj:
В общем итоге мне нужно сделать, чтобы выполнялись 3 подобных условия:

1) if (Mag != Magic1a1 && Mag != Magic2a2) // Если в открытых нету позиций с магическими номерами Magic1a1 и Magic2a2.

2) if (Mag == Magic && Mag != Magic2a2) // Если в открытых присутствует позиция с магическим номером Magic, но нету позиции с Magic2a2.

3) if (Mag == Magic || Mag = = Magic1a1 && Mag != Magic3a3) // Если в открытых присутствуют позиции с магическими номерами Magic, Magic1a1, но при этом чтобы не было в открытых с номером Magic3a3.

По поводу установления флага. А можно Ваш пример реализации данной задачи, по условиям выше описанных мной? Спасибо. :)

По поводу поиска ордеров с заданным меджиком:

//+--------------------------------//функция поиска ордера//+
bool getOrders(int magic){
   int index = 0;
   while(OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
      if(OrderMagicNumber() == magic)return(true);
      index++;
   }
   return(false);
}
//+------------------------------------------------------------------+

По поводу выполнения 3 подобных условий:

if(!getOrders(Magic1a1) && !getOrders(Magic2a2)){
    // Если в открытых нету позиций с магическими номерами Magic1a1 и Magic2a2.
}

if(getOrders(Magic) && !getOrders(Magic2a2)){
    //Если в открытых присутствует позиция с магическим номером Magic, но нету позиции с Magic2a2.
}

if(getOrders(Magic) && getOrders(Magic1a1) && !getOrders(Magic3a3)){
   // Если в открытых присутствуют позиции с магическими номерами Magic, Magic1a1, но при этом чтобы не было в открытых с номером Magic3a3.
}

Ну как то так.

 
ToLik_SRGV:

По поводу поиска ордеров с заданным меджиком:

По поводу выполнения 3 подобных условий:

Ну как то так.


Благодарю Вас! :)
 
ToLik_SRGV:

По поводу поиска ордеров с заданным меджиком:

По поводу выполнения 3 подобных условий:

Ну как то так.


К сожалению, проблема не устранена? Советник странно себя ведет. То открывает, вроде бы по правилам. То начинает открывать все сразу? Не смотря на ограничения? Прикрепил советника. Посмотрите, пожалуйста, что в нем не так. Где ошибка? В архиве советник и функция к нему. Кода там мало. Думаю каждому будет понятно, что и где там у меня. Комментарии есть. :)

Кусок кода с условиями из советника: Условия вроде указал правильно, Но!?

//-------------------------------------------------------------------+
//------------------- Проверка условий на открытие ------------------+
//-------------------------------------------------------------------+


//--------- 1
  
// Если в открытых нету позиций с магическими номерами Magicq1 и Magicq2.   

if(OrdersTotal()==0 && !getOrders(Magicq1) && !getOrders(Magicq2)) BUY = true;

//--------- 2

// Если в открытых присутствует позиция с магическим номером Magic, но нету позиции с Magicq2 и Magicq3.  

if(getOrders(Magic) && !getOrders(Magicq2) && !getOrders(Magicq3)) SELL = true;

//--------- 3

// Если в открытых присутствуют позиции с магическими номерами Magic или Magicq1, но при этом чтобы не было в открытых с номером Magicq4.   

if(getOrders(Magic) || getOrders(Magicq1) && !getOrders(Magicq3)) BUYq1 = true;

//--------- 4

// Если в открытых нету ордера с магиком Magicq4 или Magicq5 и есть открытый ордер с магиком Magicq2

if(!getOrders(Magicq4) || !getOrders(Magicq5) && getOrders(Magicq2)) SELLq1 = true;


//-------------------------------------------------------------------+
//---------------- Конец проверки условий на открытие ---------------+
//-------------------------------------------------------------------+
Файлы:
sovetnick.rar  12 kb
 

Посмотрел код, немного не понял суть стратегии, например, зачем открывать сразу 2 ордера на покупку, практически по одной цене? Так должно быть или это ошибка?
В общем, обрисуйте суть торговой системы, так будет проще понять в чем косяк.
Из того что бросилось в глаза по условиям:

// Если в открытых нету позиций с магическими номерами Magicq1 и Magicq2.
if(OrdersTotal()==0 && !getOrders(Magicq1) && !getOrders(Magicq2)) BUY = true;

Если ордеров нет (OrdersTotal()==0), зачем проверять есть среди них ордера с заданным меджиком или нет?

И вот еще:

// Если в открытых присутствуют позиции с магическими номерами Magic или Magicq1,
но при этом чтобы не было в открытых с номером Magicq4.
if(getOrders(Magic) || getOrders(Magicq1) && !getOrders(Magicq3)) BUYq1 = true;
Про Magicq4 в условии нет ничего, там про меджик Magicq3.