Обсуждение статьи "Реализация мультивалютного режима в MetaTrader 5" - страница 3

 
Lizar:

Шестнадцатиричная логика везде одна. Про системы счисления можно посмотреть здесь. Там можно почитать про позиционные системы счисления и посмотреть ссылки на 16-ю и двоичную. Там есть еще примеры перевода из системы в систему.  

Все побитовые операции предназначены для двоичной системы. Про побитовые операции в MQL5 здесь

Эти статьи хорошо читать, когда уже знаешь, о чём идёт речь :)

Вот, например, у Вас в перечислении используется префикс "0x". Насколько я понимаю, это говорит о том, что записаны шестнадцатеричные числа. В выражении же "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" используется "побитовая операция И". Вы же пишите, что побитовые операции предназначены для двоичной системы. Как тогда соотносится оператор & (для двоичной системы) с шестнадцатеричными числами?

Другой вопрос. Если я правильно понял, то выражение "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" эквивалентно выражению "flag_event != CHARTEVENT_NEWBAR_M1". Это так? И если это так, то зачем использовать побитовые операции?

 

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

а какая разница? числа внутрях проца все равно имеют двоичную систему.

поэтому даже если вы у себя в голове "видите" 255 или FF и сравните это с 8 или с 0х00000100 то разницы никакой не будет.


Yedelkin:

Другой вопрос. Если я правильно понял, то выражение "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" эквивалентно выражению "flag_event != CHARTEVENT_NEWBAR_M1". Это так? И если это так, то зачем использовать побитовые операции?

да, в данной ситуации это обозначает именно это, но битовые операции шире в применении и более общи чем просто сравнение, тем более, что при работе с константами уже стало классическим поведением использовать именно битовые операции.
 
sergeev:

а какая разница? числа внутрях проца все равно имеют двоичную систему.

поэтому даже если вы у себя в голове "видите" 255 или FF и сравните это с 8 или с 0х00000100 то разницы никакой не будет.

Разница - терминологическая. Но с Ваших слов понял, что для программистов она не имеет значения.

sergeev:

да, в данной ситуации это обозначает именно это, но битовые операции шире в применении и более общи чем просто сравнение, тем более, что при работе с константами уже стало классическим поведением использовать именно битовые операции.

 Понятно! Т.е. если для меня несколько непривычно использовать битовые операции, я могу спокойно переписать выражения с использованием операторов сравнения? Благодарю за разъяснения!

 
Yedelkin:

Эти статьи хорошо читать, когда уже знаешь, о чём идёт речь :)

Вот, например, у Вас в перечислении используется префикс "0x". Насколько я понимаю, это говорит о том, что записаны шестнадцатеричные числа. В выражении же "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" используется "побитовая операция И". Вы же пишите, что побитовые операции предназначены для двоичной системы. Как тогда соотносится оператор & (для двоичной системы) с шестнадцатеричными числами?

Все эти системы просто наглядно представляют числа не одинаково, а так если число десять, то оно везде десять. Для компа ВСЕ числа, в какой бы мы их системе ни записали, переводятся в двоичную систему. Даже эти буквы, которые, я пишу переводятся в двоичную. В других системах числа обозначают в основном для улучшения наглядности или по-привычке. Ну, некоторые это делают, чтобы выглядеть умнее.  В данном случае шестнадцатеричные числа были использованы для компактности записи, ну и для большей наглядности. Наглядность появляется, когда знаешь, как формируются шестнадцатеричные числа.

Другой вопрос. Если я правильно понял, то выражение "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" эквивалентно выражению "flag_event != CHARTEVENT_NEWBAR_M1". Это так? И если это так, то зачем использовать побитовые операции? 

Нет, это не всегда так. Это будет зависеть от того, что записано в flag_event. Если в flag_event было записано только CHARTEVENT_NEWBAR_M1, то flag_event = CHARTEVENT_NEWBAR_M1. Если в  flag_event записать CHARTEVENT_NEWBAR_M1|CHARTEVENT_NEWBAR_M5, то flag_event != CHARTEVENT_NEWBAR_M1. Но в обоих случая выполнится условие (flag_event & CHARTEVENT_NEWBAR_M1)!=0.

Если в  flag_event записать CHARTEVENT_NEWBAR_M5, то flag_event != CHARTEVENT_NEWBAR_M1. Но  (flag_event & CHARTEVENT_NEWBAR_M1)=0.

Чтобы понять эти хитрости надо разбираться с системами счисления и побитовыми операциями.  Иначе хана.

 

 

 
Yedelkin:

 Понятно! Т.е. если для меня несколько непривычно использовать битовые операции, я могу спокойно переписать выражения с использованием операторов сравнения? Благодарю за разъяснения!

Заменить всегда можно, но это может потребовать дополнительных вычислений. Будьте аккуратны с этим делом :).
 
Lizar:
Заменить всегда можно, но это может потребовать дополнительных вычислений. Будьте аккуратны с этим делом :).

Ок! И ещё вопрос. У Вас при записи шестнадцатеричных чисел используется степень двойки. В использовании именно степеней двойки есть какой-то смысл или же это тоже в силу привычки? Т.е. могли ли использоваться вот такие сочетания: 0x00000003, 0x00000009 и т.д.?

 
Yedelkin:

Ок! И ещё вопрос. У Вас при записи шестнадцатеричных чисел используется степень двойки. В использовании именно степеней двойки есть какой-то смысл или же это тоже в силу привычки? Т.е. могли ли использоваться вот такие сочетания: 0x00000003, 0x00000009 и т.д.?

Нет. Это связано с применением побитовых операций.  В шпионе в одно число (в flag_event) складываю несколько чисел (событий), а в советнике вынимаю из одного числа несколько, чтобы посмотреть какие события шпион послал. И наоборот.

О, невнимательно прочитал. Да, можно было бы, только мне, наверно, не хватило бы одного числа, чтобы уместить все события. Степень два используется, т.к. работаю с двоичным представлением числа, а записываю в шестнадцатеричном. Каждый бит означает отдельное событие.

 

По-умолчанию price[rates_total-1] равна цене close последнего незавершенного бара, которая, в свою очередь, равна поcледней цене bid. Т.е из шпиона по-умолчанию всегда получаем цену bid.

Если принудительно хотите получать цену ask, то замените эту строчку, например, на


Автор, простите, может что не дочитал, но может ли эта функция передать в советник не только ценовые события, а, например,

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

Спасибо за ответ.

 
artall:

По-умолчанию price[rates_total-1] равна цене close последнего незавершенного бара, которая, в свою очередь, равна поcледней цене bid. Т.е из шпиона по-умолчанию всегда получаем цену bid.

Если принудительно хотите получать цену ask, то замените эту строчку, например, на


Автор, простите, может что не дочитал, но может ли эта функция передать в советник не только ценовые события, а, например,

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

Спасибо за ответ.


Для этого лучше использовать сам индикатор, встроив в него в нужном месте стандартную функцию EventChartCustom.
 
Lizar:
Для этого лучше использовать сам индикатор, встроив в него в нужном месте стандартную функцию EventChartCustom.

В индикаторе всё-таки или в эксперте???

Извини, я только-только разбираюсь с МТ5