Discusión sobre el artículo "La implementación del modo multidivisa en MetaTrader 5" - página 3

 
Lizar:

La lógica hexadecimal es la misma en todas partes. Puedes leer sobre sistemas numéricos aquí. Allí puedes leer sobre sistemas numéricos posicionales y ver referencias a 16 y binario. Hay más ejemplos de conversión de sistema a sistema allí.

Todas las operaciones bit a bit estan pensadas para el sistema binario. Sobre las operaciones bit a bit en MQL5 aqui.

Estos articulos son buenos para leer cuando ya sabes de lo que estas hablando :)

Por ejemplo, usted utiliza el prefijo "0x" en la enumeración. Por lo que entiendo, significa que se escriben números hexadecimales, mientras que la expresión "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" utiliza la operación "bitwise AND". Escribes que las operaciones bit a bit están pensadas para el sistema binario. Entonces, ¿cómo se relaciona el operador & (para el sistema binario) con los números hexadecimales?

Otra pregunta: Si he entendido bien, la expresión "(flag_event &CHARTEVENT_NEWBAR_M1)!=0" es equivalente a la expresión"flag_event !"= CHARTEVENT_NEWBAR_M1". ¿Es correcto? Y si es así, ¿por qué utilizar operaciones bit a bit?

 

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

¿Cuál es la diferencia? Los números dentro de la CPU son binarios de todos modos.

Así que aunque "veas" 255 o FF en tu cabeza y lo compares con 8 o con 0x00000100 no habrá diferencia.


Yedelkin:

Otra pregunta. Si he entendido bien, la expresión "(flag_event &CHARTEVENT_NEWBAR_M1)!=0" es equivalente a la expresión"flag_event !"= CHARTEVENT_NEWBAR_M1". ¿Es correcto? Y si es así, ¿por qué utilizar operaciones bit a bit?

Sí, en esta situación significa exactamente eso, pero las operaciones bit a bit tienen una aplicación más amplia y general que la mera comparación, especialmente desde que se ha convertido en un comportamiento clásico utilizar operaciones bit a bit cuando se trabaja con constantes.
 
sergeev:

¿Cuál es la diferencia? Los números dentro de la CPU son binarios de todos modos.

Así que aunque "veas" 255 o FF en tu cabeza y lo compares con 8 o con 0x00000100 no habrá diferencia.

La diferencia es terminológica. Pero he entendido de tus palabras que no importa para los programadores.

sergeev:

sí, en esta situación significa exactamente eso, pero las operaciones con bits tienen una aplicación más amplia y general que la simple comparación, sobre todo porque ya se ha convertido en un comportamiento clásico usar operaciones con bits cuando se trabaja con constantes.

Entiendo. Entonces, si no estoy familiarizado con las operaciones de bits, ¿puedo reescribir expresiones utilizando operadores de comparación? Gracias por la aclaración.

 
Yedelkin:

Es bueno leer estos artículos cuando ya sabes de qué va :)

Por ejemplo, utilizas el prefijo "0x" en tu enumeración. Por lo que entiendo, significa que se escriben números hexadecimales, mientras que la expresión "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" utiliza la"operación bitwise AND". Escribes que las operaciones bit a bit están pensadas para el sistema binario. Entonces, ¿cómo se relaciona el operador & (para el sistema binario) con los números hexadecimales?

Todos estos sistemas sólo representan visualmente los números de una manera diferente, y así, si un número es diez, es diez en todas partes. Para el ordenador, TODOS los números, no importa en qué sistema los escribamos, se convierten a binario. Incluso estas letras que escribo se convierten a binario. En otros sistemas, los números se etiquetan principalmente para mejorar la claridad o por costumbre. Algunos lo hacen para parecer más listos. En este caso, los números hexadecimales se utilizaron para compactar la escritura, bueno, y para mejorar la claridad. La visibilidad viene cuando sabes cómo se forman los números hexadecimales.

Otra pregunta: Si he entendido bien, la expresión "(flag_event &CHARTEVENT_NEWBAR_M1)!=0" es equivalente a la expresión"flag_event !"= CHARTEVENT_NEWBAR_M1". ¿Es correcto? Y si es así, ¿por qué utilizar operaciones bit a bit?

No, no siempre es así. Dependería de lo que se hubiera escrito en flag_event. Si sólo se escribió CHARTEVENT_NEWBAR_M1 en flag_event, entonces flag_event = CHARTEVENT_NEWBAR_M1. SiCHARTEVENT_NEWBAR_M1|CHARTEVENT_NEWBAR_M5 se escribió enflag_event , entonces flag_event != CHARTEVENT_NEWBAR_M1. Pero en ambos casos se cumplirá la condición (flag_event & CHARTEVENT_NEWBAR_M1)!=0.

Siescribe CHARTEVENT_NEWBAR_M5 en flag_event , entonces flag_event != CHARTEVENT_NEWBAR_M1. Pero (flag_event & CHARTEVENT_NEWBAR_M1)=0.

Para entender estos trucos, necesitas entender los sistemas numéricos y las operaciones bit a bit. De lo contrario, estarás muerto.

 
Yedelkin:

Ya veo. Es decir, si me resulta un poco inusual utilizar operaciones bit a bit, ¿puedo reescribir expresiones utilizando operadores de comparación? Gracias por la aclaración.

Siempre puedes sustituirlo, pero puede requerir cálculos adicionales. Ten cuidado con este caso :).
 
Lizar:
Siempre puede sustituirlo, pero puede requerir cálculos adicionales. Tenga cuidado con este caso :).

De acuerdo. Una pregunta más. Cuando se escriben números hexadecimales, se utiliza el grado de dos. ¿Tiene algún sentido utilizar grados de dos o es también una cuestión de costumbre? Es decir, ¿se podrían utilizar combinaciones como: 0x00000003, 0x00000009, etc.?

 
Yedelkin:

¡Vale! Una pregunta más. Al escribir números hexadecimales, utilizas grados de dos. ¿Tiene algún sentido utilizar grados de dos o es también una cuestión de costumbre? Es decir, ¿se podrían utilizar combinaciones como: 0x00000003, 0x00000009, etc.?

No. Esto se debe al uso de operaciones bit a bit. En el espía sumo varios números (eventos) en un número (en flag_event), y en el EA saco varios números de un número para ver qué eventos envió el espía. Y viceversa.

Ah, no lo leí con atención. Sí, podría, excepto que probablemente no tendría suficiente un número para todos los eventos. El grado dos se usa porque estoy trabajando con una representación binaria del número, y escribiendo en hexadecimal. Cada bit representa un evento diferente.

 
Me quito el sombrero, caballeros :) Una verdadera obra maestra. Una solución sencilla pero elegante y potente. Un millón de gracias, Konstantin, y enhorabuena :-)
 

Por defecto, el precio[rates_total-1] es igual al precio de cierre de la última barra no finalizada, que a su vez es igual al último precio de oferta. es decir, siempre obtenemos el precio de oferta del espía por defecto.

Si quieres obtener el precio ask a la fuerza, sustituye esta línea, por ejemplo, por la siguiente.


Autor, lo siento, tal vez no terminé de leer, pero ¿puede esta función pasar al Asesor Experto no sólo eventos de precio, sino, por ejemplo,

eventos de un indicador o sus combinaciones/variaciones de otros instrumentos, es decir, como si la señal ya se hubiera recibido allí. En caso afirmativo, cómo implementarlo.

Gracias por su respuesta.

 
artall:

Por defecto, el precio[rates_total-1] es igual al precio de cierre de la última barra no finalizada, que, a su vez, es igual al último precio de oferta. es decir, siempre obtenemos el precio de oferta del espía por defecto.

Si desea obtener forzosamente el precio ask, sustituya esta línea, por ejemplo, por la siguiente.


Autor, lo siento, tal vez no terminé de leer, pero ¿puede esta función pasar al Asesor Experto no sólo eventos de precio, sino, por ejemplo,

eventos de un indicador o sus combinaciones/variaciones de otros instrumentos, es decir, como si la señal ya se hubiera recibido allí. En caso afirmativo, cómo implementarlo.

Gracias por la respuesta.


Para ello, es mejor utilizar el propio indicador mediante la incorporación de la función estándar EventChartCustom en él en el lugar correcto.