Ответить
03.06.2010, 15:04
Аватар для MrSerj
MrSerj MrSerj вне форума Элитный участник
Регистрация: 04.09.2009 / Сообщений: 376
Поблагодарили 1,922 раз(а) / Репутация: 1360

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

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

PHP код:
for (int i=0i<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.



Что я сделал не правильно и как будет правильно выглядеть и выполняться как нужно?
03.06.2010, 17:30
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,509 раз(а) / Репутация: 2535
Лучше писАть, чтобы самому было всё понятно

Код:
	// Если в открытых нету позиций с магическими номерами 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"
Запятая - это И или ИЛИ? Я сделал И, если надо ИЛИ - вы скорей всего разберётесь, что изменить
MrSerj 
03.06.2010, 18:13
Аватар для expforex
expforex expforex вне форума Программиров
Регистрация: 11.01.2009 / Сообщений: 2,136
Поблагодарили 2,104 раз(а) / Репутация: 2162
странно Вы начина те перебор ордеров - позиций, если позиция не имеет магика Вашего - то открывается новая позиция? потом следующая проверяется, и так до бесконечности, у Вас никогда не выполнится условие магиков, потому что Вы проверяете первую позицию и сразу брек...
Советники на заказ! admin@expforex.com
Говорим Спасибо
03.06.2010, 18:47
Аватар для MrSerj
MrSerj MrSerj вне форума Элитный участник
Регистрация: 04.09.2009 / Сообщений: 376
Поблагодарили 1,922 раз(а) / Репутация: 1360
ale002 Спасибо! Попробую Ваш варинант.
03.06.2010, 18:49
Аватар для MrSerj
MrSerj MrSerj вне форума Элитный участник
Регистрация: 04.09.2009 / Сообщений: 376
Поблагодарили 1,922 раз(а) / Репутация: 1360
странно Вы начина те перебор ордеров - позиций, если позиция не имеет магика Вашего - то открывается новая позиция? потом следующая проверяется, и так до бесконечности, у Вас никогда не выполнится условие магиков, потому что Вы проверяете первую позицию и сразу брек...
Не спорю. По этому я здесь! Вы могли бы привести пример, в коде. То о чем Вы говорите. Как оно должно быть, с Вашего поля зрения? Спасибо.
03.06.2010, 19:09
Аватар для MrSerj
MrSerj MrSerj вне форума Элитный участник
Регистрация: 04.09.2009 / Сообщений: 376
Поблагодарили 1,922 раз(а) / Репутация: 1360
Обратите внимание, что в 3ем случае в вашей формулировке есть неопределённость:
"Если в открытых присутствуют позиции с магическими номерами Magic, Magic1a1"
Запятая - это И или ИЛИ? Я сделал И, если надо ИЛИ - вы скорей всего разберётесь, что изменить

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

У Вас так:

PHP код:
if(Block3 && Block31 && Block32
я поменял на:

PHP код:
if(Block3 || Block31 && Block32
03.06.2010, 19:26
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,509 раз(а) / Репутация: 2535
Лучше так - не будет лишних операций и переменных

Код:
	// Если в открытых присутствуют позиции с магическими номерами 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(ПервоеУсловиеВыполнено && ВтороеУсловиеВыполнено) {
		// сделаем что нужно, если все три условия выполнены
	}
MrSerj 
Ответить


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уважаемые коллеги! MrWhite Ваши вопросы об использовании ТС 1 18.07.2010 03:45


Текущее время: 15:24. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO