Discussão do artigo "A Implementação de um Modo Multi-currency (múltiplas moedas) no MetaTrader 5" - página 3

 
Lizar:

A lógica hexadecimal é a mesma em todos os lugares. Você pode ler sobre sistemas numéricos aqui. Lá você pode ler sobre sistemas de números posicionais e ver referências a 16 e binário. Há mais exemplos de conversão de sistema para sistema.

Todas as operações bit a bit são destinadas ao sistema binário. Sobre operações bit a bit em MQL5 aqui.

Esses artigos são bons para ler quando você já sabe do que está falando :)

Por exemplo, você usa o prefixo "0x" na enumeração. Pelo que entendi, isso significa que números hexadecimais são escritos, enquanto a expressão "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" usa a "operação AND bit a bit". Você escreveu que as operações bit a bit são destinadas ao sistema binário. Então, como o operador & (para o sistema binário) se relaciona com os números hexadecimais?

Outra pergunta: se eu entendi corretamente, a expressão "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" é equivalente à expressão"flag_event !"= CHARTEVENT_NEWBAR_M1". Isso está correto? E, em caso afirmativo, por que usar operações bit a bit?

 

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

Qual é a diferença? De qualquer forma, os números dentro da CPU são binários.

Portanto, mesmo que você "veja" 255 ou FF em sua cabeça e compare-os com 8 ou com 0x00000100, não haverá diferença.


Yedelkin:

Outra pergunta: se eu entendi corretamente, a expressão "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" é equivalente à expressão"flag_event !"= CHARTEVENT_NEWBAR_M1". Isso está correto? E, em caso afirmativo, por que usar operações bit a bit?

Sim, nessa situação, significa exatamente isso, mas as operações bit a bit são mais amplas em termos de aplicação e mais gerais do que apenas comparação, especialmente porque se tornou um comportamento clássico usar operações bit a bit ao trabalhar com constantes.
 
sergeev:

Qual é a diferença? De qualquer forma, os números dentro da CPU são binários.

Portanto, mesmo que você "veja" 255 ou FF em sua cabeça e compare-os com 8 ou com 0x00000100, não haverá diferença.

A diferença é terminológica. Mas entendi por suas palavras que isso não importa para os programadores.

sergeev:

Sim, nessa situação, significa exatamente isso, mas as operações de bit são mais amplas em termos de aplicação e mais gerais do que apenas a comparação, especialmente porque já se tornou um comportamento clássico usar operações de bit ao trabalhar com constantes.

Entendo! Então, se eu não estiver familiarizado com as operações de bit, posso reescrever com segurança as expressões usando operadores de comparação? Obrigado pelo esclarecimento!

 
Yedelkin:

Esses artigos são bons para ler quando você já sabe do que se trata :)

Por exemplo, você usa o prefixo "0x" em sua enumeração. Pelo que entendi, isso significa que números hexadecimais são escritos, enquanto a expressão "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" usa a"operação AND bit a bit". Você escreveu que as operações bit a bit são destinadas ao sistema binário. Então, como o operador & (para o sistema binário) se relaciona com os números hexadecimais?

Todos esses sistemas apenas representam visualmente os números de uma maneira diferente e, portanto, se um número é dez, ele é dez em qualquer lugar. Para o computador, TODOS os números, independentemente do sistema em que os escrevemos, são convertidos para binário. Até mesmo essas letras que escrevo são convertidas em binário. Em outros sistemas, os números são rotulados principalmente para melhorar a clareza ou por hábito. Bem, algumas pessoas fazem isso para parecerem mais inteligentes. Nesse caso, os números hexadecimais foram usados para compactar a escrita, bem, e para maior clareza. A visibilidade vem quando você sabe como os números hexadecimais são formados.

Outra pergunta: se eu entendi corretamente, a expressão "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" é equivalente à expressão"flag_event !"= CHARTEVENT_NEWBAR_M1". Isso está correto? E, em caso afirmativo, por que usar operações bit a bit?

Não, esse nem sempre é o caso. Isso dependeria do que foi escrito em flag_event. Se apenas CHARTEVENT_NEWBAR_M1 foi gravado em flag_event, então flag_event = CHARTEVENT_NEWBAR_M1. SeCHARTEVENT_NEWBAR_M1|CHARTEVENT_NEWBAR_M5 forgravado emflag_event , então flag_event != CHARTEVENT_NEWBAR_M1.Mas em ambos os casos a condição (flag_event & CHARTEVENT_NEWBAR_M1)!=0será atendida .

Se vocêescrever CHARTEVENT_NEWBAR_M5 em flag_event , então flag_event != CHARTEVENT_NEWBAR_M1. Mas (flag_event & CHARTEVENT_NEWBAR_M1)=0.

Para entender esses truques, você precisa entender os sistemas numéricos e as operações bit a bit. Caso contrário, você estará morto.

 
Yedelkin:

Estou entendendo! Ou seja, se for um pouco incomum para mim usar operações bit a bit, posso reescrever com segurança as expressões usando operadores de comparação? Obrigado pelo esclarecimento!

Você sempre pode substituí-lo, mas isso pode exigir cálculos adicionais. Tenha cuidado com esse caso :).
 
Lizar:
Você sempre pode substituí-lo, mas isso pode exigir cálculos adicionais. Tenha cuidado com esse caso :).

Certo! Mais uma pergunta. Ao escrever números hexadecimais, você usa o grau de dois. Há algum sentido em usar graus de dois ou é apenas uma questão de hábito? Ou seja, poderiam ser usadas combinações como: 0x00000003, 0x00000009, etc.?

 
Yedelkin:

Certo! Mais uma pergunta. Ao escrever números hexadecimais, você usa graus de dois. Há algum sentido em usar graus de dois ou é apenas uma questão de hábito? Ou seja, poderiam ser usadas as seguintes combinações: 0x00000003, 0x00000009 etc.?

Não. Isso se deve ao uso de operações bit a bit. No espião, adiciono vários números (eventos) em um número (em flag_event) e, no EA, retiro vários números de um número para ver quais eventos o espião enviou. E vice-versa.

Ah, não li isso com atenção. Sim, você poderia, mas provavelmente não teria um número suficiente para todos os eventos. O grau dois é usado porque estou trabalhando com uma representação binária do número e escrevendo em hexadecimal. Cada bit representa um evento diferente.

 
Tiremos o chapéu, senhores :) Uma verdadeira obra-prima. Solução simples, porém elegante e poderosa. Muito obrigado, Konstantin, e parabéns :-)
 

Por padrão, price[rates_total-1] é igual ao preço de fechamento da última barra inacabada, que, por sua vez, é igual ao último preço de oferta, ou seja, sempre obtemos o preço de oferta do espião por padrão.

Se você quiser obter o preço de venda à força, substitua essa linha, por exemplo, pelo seguinte.


Autor, desculpe-me, talvez eu não tenha terminado de ler, mas essa função pode passar para o Expert Advisor não apenas eventos de preço, mas, por exemplo,

eventos de um indicador ou suas combinações/variações de outros instrumentos, ou seja, como se o sinal já tivesse sido recebido lá. Se sim, como implementá-la.

Obrigado por sua resposta.

 
artall:

Por padrão, price[rates_total-1] é igual ao preço de fechamento da última barra inacabada, que, por sua vez, é igual ao último preço de oferta.

Se você quiser obter forçosamente o preço de venda, substitua essa linha, por exemplo, pelo seguinte.


Autor, desculpe-me, talvez eu não tenha terminado de ler, mas essa função pode passar para o Expert Advisor não apenas eventos de preço, mas, por exemplo,

eventos de um indicador ou suas combinações/variações de outros instrumentos, ou seja, como se o sinal já tivesse sido recebido lá. Se sim, como implementá-la.

Obrigado pela resposta.


Para essa finalidade, é melhor usar o próprio indicador incorporando a função padrão EventChartCustom nele, no lugar certo.