Características del lenguaje mql5, sutilezas y técnicas - página 102

 
Alexey Navoykov:

Te estás pasando ) En primer lugar, pasa por la cola de mensajes. En segundo lugar, hay que hacer algunas conversiones adicionales (de ida y vuelta). Además, hay una validación en marcha.

Por cierto, no debe especificar el tamaño de la estructura explícitamente. Hay sizeof para ello.

  • ¿Dónde has visto una cola de mensajes allí?
  • No hay conversiones de ida y vuelta. Se utiliza la misma unión que en el ejemplo de @fxsaber
  • Tampoco hay validación.
  • Por supuesto, se puede utilizar sizeof(...), pero al tratarse de una implementación de una tarea concreta y no universal, simplemente tuve que escribirla más corta como 3 dígitos.

Tal vez haya mirado algún otro código.

HH lo único que no me gusta de mi versión: he tenido que duplicar el tamaño de la línea para evitar los ceros, porque el cero se percibe como el final de la línea. Siento en mi columna vertebral que hay una solución más sencilla, pero no la he encontrado. Pero sigue funcionando más rápido.

 
Nikolai Semko:

  • ¿Dónde has visto una cola de mensajes?

¿SetWindowText/GetWindowText no se envían a través de mensajes?


No hay conversiones de ida y vuelta.

Por supuesto que sí. ¿A qué se debe todo este alboroto?

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Alexey Navoykov:

¿SetWindowText/GetWindowText no se envían a través de mensajes?

Y tú hablas de los mensajes de Windows... ¿Y qué? ¿Existe una alternativa más rápida para intercambiar datos entre diferentes programas en el windos sin dll homebrew?

Comprendo que te hayan ofendido mis palabras, que mi variante sea rápida. Bueno, en primer lugar, no lo he afirmado, sólo lo he sugerido. En segundo lugar, respaldé mi suposición con código de prueba, comparándolo con elmapeo de memoria.
Y si tratas de refutar aunque sea una suposición, por favor, no bases tu refutación sólo en afirmaciones. Estaré muy agradecido si me pueden disuadir y señalar la implementación más rápida del intercambio de datos entre terminales sin ninguna dll autoescrita.

No excluyo que la variante vía disco RAM sea mucho más rápida. Pero este es un tema un poco diferente, porque requiere la instalación del disco RAM y su configuración.

Alexey Navoykov:

Por supuesto. Pero qué es eso de bailar con panderetas:

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];

Y así, las panderetas. Es una banalidad. Y esta trivialidad, por cierto, se realiza en 50-60 ns, cuando todo el bloque de recepción de la estructura de ticks se realiza en 90 µs (90 000 ns.), es decir, estos "diamantes" ocupan sólo el 0,06 % del tiempo de recepción del bloque de datos. Además, escribí que este punto me confunde sólo en vista de la duplicación de la memoria.

Y así mi variante parece muy conveniente, simple e inteligente para el intercambio de pequeñas estructuras de datos.

 
Nikolai Semko:

  • Lo único que no me gusta de mi versión: he tenido que duplicar el tamaño de la línea para evitar los ceros, porque el cero se percibe como el final de la línea. Siento en mi espina dorsal que hay una solución más sencilla, pero no la he encontrado. Pero de todos modos funciona más rápido.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: HistoryTicks

Automated-Trading, 2018.03.29 11:09

  • Hay funciones multiplataforma en las fuentes( archivoData_String.mqh) que permiten poner/extraer cualquier dato a/de una cadena. Por ejemplo, permite intercambiar fácilmente cualquier dato entre cualquier programa MQL utilizando parámetros de cadena (sparam)de eventos de usuario;
#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    const string Str = DATA_STRING::ToString(Tick);
    
    MqlTick Ticks[1];
    
    Ticks[0] = DATA_STRING::FromString<MqlTick>(Str);
    ArrayPrint(Ticks);
  }
}
 
fxsaber:

Wow!
No conocía las funciones como CryptEncode yCryptDecode. Gracias.
Le echaré un vistazo.
Pero aunque a primera vista todo parece de alta tecnología, es increíblemente lento, ya que la función CryptEncode funciona dos órdenes de magnitud más lenta (microsegundos frente a decenas de nanosegundos) que lo que se ha denominado aquí como panderetas:

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Nikolai Semko:

Entiendo que se ha ofendido por decir que mi versión era rápida. Bueno, en primer lugar, no lo he afirmado, sólo he hecho una suposición. En segundo lugar, respaldé mi suposición con código de prueba, comparándolo con elmapeo de memoria.

No me refería a la "rapidez", sino a que"puede ser más rápido que todas las soluciones existentes", por lo que he hecho varias observaciones sin ningún tipo de ataque. Y esas observaciones eran bastante justas. Pero tú, por alguna razón, primero lo niegas insistentemente ("tal vez habrásmirado otro código") y luego entras en el "¡y qué! Así queseparemos las moscas de las chuletas.

En segundo lugar, en lo que respecta a MemoryMapping (más concretamente, a su envoltorio MQL para ser exactos), nunca he dicho nada de que sea rápido. Además, en el hilo de discusión de este proyecto aquí he señalado los errores del autor que crean lags y cómo solucionarlos. Así que si vas a probar algo, pruébalo en su forma nativa, y no en la forma de las decisiones equivocadas de otra persona.

 
Nikolai Semko:

ZZY Pero aunque a primera vista todo es alta tecnología, es increíblemente lento, porque la función CryptEncode es dos órdenes de magnitud más lenta (microsegundos frente a decenas de nanosegundos) que lo que aquí se llama pandereta:

¿Para qué sirve la velocidad?

 
Alexey Navoykov:

No estoy hablando de "rapidez", sino de que"puede ser más rápido que todas las soluciones existentes", por lo que hice algunas observaciones, sin ningún tipo de ataques. Y estas observaciones eran bastante justas. Sólo que primero te obstinas en negarlo por alguna razón ("quizás miraste otro código"), y luego te pones en la posición de "¡y qué! Así que vamos aseparar las moscas de las chuletas.

En primer lugar, mi post fue escrito antes de que usted haya citado su código de prueba. En segundo lugar, en cuanto a MemoryMapping (más precisamente, su envoltura MQL mencionada), nunca he afirmado que funcione rápido. Además, en el hilo de discusión de este proyecto aquí he señalado los errores del autor que crean lags y cómo solucionarlos. Así que si vas a probar algo, hazlo de forma nativa, no con las decisiones equivocadas de alguien.

Bien. De acuerdo. Eso fue demasiado fuerte.

Sólo quería decir, que posiblemente el uso de user32.dll en lugar de kernel32.dll puede resultar más rápido al enlazar dos terminales a través de WinAPI, ya que todas las implementaciones que he encontrado utilizan kernel32.dll.

 
fxsaber:

¿Para qué sirve la velocidad?

Lo siento, no he entendido la pregunta.
Se pregunta: ¿por qué se necesita la velocidad del puente entre terminales?

 
Nikolai Semko:

Lo siento, no he entendido la pregunta.
Te preguntarás: ¿por qué necesitas velocidad de intercambio de datos en el puente entre terminales?

Sí.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades del lenguaje mql5, consejos y trucos

Nikolai Semko, 2018.09.21 13:20

Pero hasta ahora, a primera vista, todo esto, por supuesto, de alta tecnología, pero increíblemente lento, porque la función CryptEncode se ejecuta dos órdenes de magnitud más lento(microsegundos frente a decenas de nanosegundos) que lo que se llama aquí panderetas: