Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1986

 
Alexey Viktorov #:

Всё что я изменил это вот эти строки

и последовательность этих

Если построение имеет несколько буферов INDICATOR_DATA и цвет, то всё что относится к построению обязательно должно быть по порядку. Буферы данных —> буфер цвета. Все дополнительные буферы должны быть в конце.

Спасибо, очень полезный урок.
 
Igor Makanu #:

должно работать по приоритету логических операций https://www.mql5.com/ru/docs/basis/operations/rules

для одинаковых операций  == приоритет будет равнозначным и будет вычисляться результат логической операции слева на право - скобок же нет?

спасиб. Скобок нет.

 
Alexey Viktorov #:

Всё что я изменил это вот эти строки

и последовательность этих

Если построение имеет несколько буферов INDICATOR_DATA и цвет, то всё что относится к построению обязательно должно быть по порядку. Буферы данных —> буфер цвета. Все дополнительные буферы должны быть в конце.

спасиб

 
Andrei Sokolov #:

спасиб. Скобок нет.

Там сравнение магика с 0 и 1 получается
 
Tretyakov Rostyslav #:
Иногда, если знаешь логику системы, проще написать новый сов.

согласен. в этом сове всё через массивы завязано. я в них не разбираюсь пока совершенно

 
Andrei Sokolov #:

Можно подробнее, пожалста.

Здесь получается так (разберём поэлементно проверки):

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_2 == 1)

можно явно заменить на

if (OrderSymbol() == Symbol() && OrderMagicNumber() == bool(MagicNumber_2 == 1)),

соответственно:

if (OrderSymbol() == Symbol() && OrderMagicNumber() == (если MagicNumber_2 равен 1, то тут true, иначе тут false))

А значит, далее уже два варианта:

if (OrderSymbol() == Symbol() && OrderMagicNumber() == true)

или

if (OrderSymbol() == Symbol() && OrderMagicNumber() == false)

Учитывая, что false - это только 0, а true - любое, отличное от нуля значение, то проверка выглядит так:

Если MagicNumber_2 равен 1, то проверка такова:

if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

Если MagicNumber_2 не равен 1, то проверка такова:

if (OrderSymbol() == Symbol() && OrderMagicNumber() == 0)

По-моему, так.

 
Artyom Trishkin #:

можно явно заменить на

if (OrderSymbol() == Symbol() && OrderMagicNumber() == bool(MagicNumber_2 == 1)),

не можно, писал же порядок по приоритету, или слева на право

Вы скобками чего натворили ? ))))


вот можно поиграться скриптом, чтобы порядок вычисления увидеть:

#property strict

void OnStart()
{
   if (f1() == f2() && f3() == f4() == f5()) Print("1.OK"); else Print("1.Not OK");

   if (f1() == f2() && f3() == bool(f4() == f5())) Print("2.OK"); else Print("2.Not OK");

}
string f1() { Print(__FUNCTION__); return("A");    }  // OrderSymbol()
string f2() { Print(__FUNCTION__); return("A");    }  // Symbol()
int f3()    { Print(__FUNCTION__); return(12345);  }  // OrderMagicNumber()
int f4()    { Print(__FUNCTION__); return(12345);  }  // MagicNumber_2
int f5()    { Print(__FUNCTION__); return(1);      }  // 1

2022.07.04 11:02:06.596 tst EURUSD,H1: 2.Not OK

2022.07.04 11:02:06.596 tst EURUSD,H1: f5

2022.07.04 11:02:06.596 tst EURUSD,H1: f4

2022.07.04 11:02:06.596 tst EURUSD,H1: f3

2022.07.04 11:02:06.596 tst EURUSD,H1: f2

2022.07.04 11:02:06.596 tst EURUSD,H1: f1

2022.07.04 11:02:06.596 tst EURUSD,H1: 1.OK

2022.07.04 11:02:06.596 tst EURUSD,H1: f5

2022.07.04 11:02:06.596 tst EURUSD,H1: f4

2022.07.04 11:02:06.596 tst EURUSD,H1: f3

2022.07.04 11:02:06.596 tst EURUSD,H1: f2

2022.07.04 11:02:06.596 tst EURUSD,H1: f1

2022.07.04 11:02:06.596 tst EURUSD,H1: initialized

 
Igor Makanu #:

не можно, писал же порядок по приоритету, или слева на право

Вы скобками чего натворили ? ))))


вот можно поиграться скриптом, чтобы порядок вычисления увидеть:

2022.07.04 11:02:06.596 tst EURUSD,H1: 2.Not OK

2022.07.04 11:02:06.596 tst EURUSD,H1: f5

2022.07.04 11:02:06.596 tst EURUSD,H1: f4

2022.07.04 11:02:06.596 tst EURUSD,H1: f3

2022.07.04 11:02:06.596 tst EURUSD,H1: f2

2022.07.04 11:02:06.596 tst EURUSD,H1: f1

2022.07.04 11:02:06.596 tst EURUSD,H1: 1.OK

2022.07.04 11:02:06.596 tst EURUSD,H1: f5

2022.07.04 11:02:06.596 tst EURUSD,H1: f4

2022.07.04 11:02:06.596 tst EURUSD,H1: f3

2022.07.04 11:02:06.596 tst EURUSD,H1: f2

2022.07.04 11:02:06.596 tst EURUSD,H1: f1

2022.07.04 11:02:06.596 tst EURUSD,H1: initialized

Разве это

if (f1() == f2() && f3() == f4() == f5())

эквивалентно этому

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_2 == 1)

???

Там, в оригинале, в конце сравнение переменной с числом, а у вас вызов функции.

Вообще, конечно, не берусь утверждать, но мне кажется (не проверял, просто почему-то кажется), что OrderMagicNumber() будет сравниваться с результатом булевого сравнения переменной MagicNumber_2 со значением 1.

Проверять времени нет никакого. Но сначала выполнится булево сравнение переменной с числом, а затем уже будет сравниваться OrderMagicNumber() с результатом сравнения (со значением 1 или 0 в зависимости от результата сравнения). Наверное просто потому, что функция, возвращающая магик, должна своё значение с чем-то сравнить. А вот с чем - это как раз булево значение.

 
Artyom Trishkin #:

Разве это

эквивалентно этому

???

да эквивалентно при выполнении логических операций

Artyom Trishkin #:

Вообще, конечно, не берусь утверждать, но мне кажется (не проверял, просто почему-то кажется), что OrderMagicNumber() будет сравниваться с результатом булевого сравнения переменной MagicNumber_2 со значением 1.

Проверять времени нет никакого. Но сначала выполнится булево сравнение переменной с числом, а затем уже будет сравниваться OrderMagicNumber() с результатом сравнения (со значением 1 или 0 в зависимости от результата сравнения). Наверное просто потому, что функция, возвращающая магик, должна своё значение с чем-то сравнить. А вот с чем - это как раз булево значение.

ВЫ чет приведение типов и выполнение логических операций пытаетесь вместе смешать, да сравнение разных типов будет произведено после приведения типов, но логические операции всегда будут выполняться в одной и той же последовательности


по сабжу, что у нас есть с точки зрения выполнения логических операций?

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_2 == 1) 

есть: == , && , == и ==

по приоритету && ниже, значит выполняем первыми ==

1.  OrderSymbol() == Symbol() - результат true

2. OrderMagicNumber() == MagicNumber_2 - результат true (пусть будут равны, для упрощения)

3. теперь последний == , от предыдущего == , т.е.  п.2 :

true == 1  - результат true 

4. и вот теперь будет выполнена "логическая И" для пп 1 и 3 : true && true = true

 

Возможно ли составить имя переменной с помощью канкатенации? 

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