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

MrSerj

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

PHP:
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)
PHP:
if  (Mag != Magic1a1 && Mag != Magic2a2)
// Если в открытых нету позиций с магическими номерами Magic1a1 и Magic2a2.


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


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



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

ale002

::: __,,,^._.^,,,__ :::
Лучше писАть, чтобы самому было всё понятно

Код:
	// Если в открытых нету позиций с магическими номерами Magic1a1 и Magic2a2
	bool УсловиеВыполнено = true;
	for(int i = 0; i < OrdersTotal(); i++)
		if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
			if(OrderMagicNumber() == Magic1a1 || OrderMagicNumber() == Magic2a2) {
				УсловиеВыполнено = false;
				break;
			}
	if(УсловиеВыполнено) {
		// сделаем что нужно, если условие выполнено
	}
	
	// Если в открытых присутствует позиция с магическим номером Magic, но нету позиции с Magic2a2
	bool ПервоеУсловиеВыполнено = false;
	bool ВтороеУсловиеВыполнено = true;
	for(int i = 0; i < OrdersTotal(); i++)
		if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
			if(OrderMagicNumber() == Magic) ПервоеУсловиеВыполнено = true;
			if(OrderMagicNumber() == Magic2a2) ВтороеУсловиеВыполнено = false;
			if(!ВтороеУсловиеВыполнено || (ПервоеУсловиеВыполнено && ВтороеУсловиеВыполнено)) break;
		}
	if(ПервоеУсловиеВыполнено && ВтороеУсловиеВыполнено) {
		// сделаем что нужно, если оба условия выполнены
	}
	
	// Если в открытых присутствуют позиции с магическими номерами Magic и Magic1a1, но при этом чтобы не было в открытых с номером Magic3a3
	bool ПервоеУсловиеВыполнено = false;
	bool ВтороеУсловиеВыполнено = false;
	bool ТретьеУсловиеВыполнено = true;
	for(int i = 0; i < OrdersTotal(); i++)
		if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
			if(OrderMagicNumber() == Magic) ПервоеУсловиеВыполнено = true;
			else if(OrderMagicNumber() == Magic1a1) ВтороеУсловиеВыполнено = true;
			else if(OrderMagicNumber() == Magic3a3) ТретьеУсловиеВыполнено = false;
			
			if(!ТретьеУсловиеВыполнено) break;
		}
	if(ПервоеУсловиеВыполнено && ВтороеУсловиеВыполнено && ТретьеУсловиеВыполнено) {
		// сделаем что нужно, если все три условия выполнены
	}

Должно быть так по идее (не проверял). Обратите внимание, что в 3ем случае в вашей формулировке есть неопределённость:
"Если в открытых присутствуют позиции с магическими номерами Magic, Magic1a1"
Запятая - это И или ИЛИ? Я сделал И, если надо ИЛИ - вы скорей всего разберётесь, что изменить :)
 

expforex

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

MrSerj

Элитный участник
ale002 Спасибо! Попробую Ваш варинант. :)
 

MrSerj

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

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

MrSerj

Элитный участник
Обратите внимание, что в 3ем случае в вашей формулировке есть неопределённость:
"Если в открытых присутствуют позиции с магическими номерами Magic, Magic1a1"
Запятая - это И или ИЛИ? Я сделал И, если надо ИЛИ - вы скорей всего разберётесь, что изменить :)


Там ИЛИ. Извиняюсь за опечатку.

У Вас так:

PHP:
if(Block3 && Block31 && Block32)

я поменял на:

PHP:
if(Block3 || Block31 && Block32)

:?:
 

ale002

::: __,,,^._.^,,,__ :::
Лучше так - не будет лишних операций и переменных

Код:
	// Если в открытых присутствуют позиции с магическими номерами Magic или Magic1a1, но при этом чтобы не было в открытых с номером Magic3a3
	bool ПервоеУсловиеВыполнено = false;
	bool ВтороеУсловиеВыполнено = true;
	for(int i = 0; i < OrdersTotal(); i++)
		if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
			if(OrderMagicNumber() == Magic || OrderMagicNumber() == Magic1a1) ПервоеУсловиеВыполнено = true;
			else if(OrderMagicNumber() == Magic3a3) ВтороеУсловиеВыполнено = false;
			
			if(!ВтороеУсловиеВыполнено) break;
		}
	if(ПервоеУсловиеВыполнено && ВтороеУсловиеВыполнено) {
		// сделаем что нужно, если все три условия выполнены
	}
 
Верх