Discusión sobre el artículo "Intercambio de datos entre indicadores Es fácil"

 

Artículo publicado Intercambio de datos entre indicadores Es fácil:

Tenemos aprecio por los principiantes porque no están dispuestos a usar la búsqueda de información, y hay muchos temas como "Preguntas frecuentes" y "Para principiantes" o "El que hace una pregunta de esta lista, arderá en el infierno". Su verdadera misión es hacer preguntas del tipo "Cómo...", "Es posible...", y a menudo obtienen respuestas del tipo "En absoluto", "Es imposible".

La eterna frase "nunca digas nunca jamás" ha motivado a científicos, ingenieros y programadores a pensar y crear cosas nuevas que ya habían sido olvidadas.

Queremos crear un entorno que proporcione acceso a los datos de los indicadores adjuntos a un gráfico y que tenga las siguientes propiedades: ausencia de copiado de datos; modificación mínima del código de métodos disponibles si necesitamos usarlo; es preferible el código de MQL (por supuesto, tenemos que usar DLL pero usaremos una docena de strings de código de C++). El artículo describe un método sencillo para desarrollar un entorno de programa para el terminal de MetaTrader que proporcione medios para acceder a los buffers del indicador desde otros programas MQL.

 

Autor: Алексей

 
Hay una advertencia muy seria para aquellos que utilizan llamadas frecuentes de funciones DLL como Get/Set.


En aras de la seguridad del sistema, cada llamada DLL pasa a través de un stripper especial, que ralentiza la ejecución. La llamada a una función DLL no es una banal llamada XXXX, sino una compleja envoltura con enmascaramiento de direcciones, control de pila y bloqueos dentro de la DLL. MQL5 hace que si una función dentro de la DLL desordena la pila o se bloquea, la ejecución del script se detendrá sin bloquear el propio terminal.

Consejo general sobre el uso de funciones DLL: tratar de hacer llamadas raras con una gran cantidad de trabajo en el interior, en lugar de decenas de miles de llamadas por segundo con el paso de pequeños resultados.

 

Me pregunto. ¿Por qué no ir más allá?

Como ha señalado Renat, llamar a funciones baratas desde una dll es caro.

Entonces, ¿por qué no copiar los datos directamente en el array previsto para ello?

 
TheXpert:

Me pregunto. ¿Por qué no ir más lejos?

¿A quién va dirigida la pregunta: al autor o a los desarrolladores?

Si es a los desarrolladores, ¿qué sugiere exactamente?

 

¿Hay algún error en la función StringExplode? En su forma actual, no copia el último componente de la cadena si no hay ningún delimitador después (es decir, al final de la cadena). En mi opinión, debería tomarse el final de la cadena aunque no haya ningún delimitador al final. Ejemplo: introducimos la cadena"EURUSD,EURJPY" con el delimitador "," y la función ahora sólo selecciona EURUSD.

Aquí está la versión corregida de la función, por comodidad he devuelto el número de elementos:

int StringExplode(string s, string separator, string &result[])
{
  int i, pos;
  ArrayResize(result, 0);
   
  for(i = 0; ; i++)
  {
    ArrayResize(result, ArraySize(result) + 1);
    pos = StringFind(s, separator);
    if(pos >= 0)
    {
      result[i] = StringSubstr(s, 0, pos);
      s = StringSubstr(s, pos + StringLen(separator));
    }
    else
    {
      result[i] = s;
      i++;
      break;
    }
  }
  
  return(i);
}
 
Renat:
Hay una advertencia muy seria para aquellos que utilizan llamadas frecuentes de funciones DLL como Get/Set.


En aras de la seguridad del sistema, cada llamada DLL pasa a través de un stripper especial, que ralentiza la ejecución. La llamada a una función DLL no es una banal llamada XXXX, sino un complejo envoltorio con enmascaramiento de direcciones, control de pila y bloqueos dentro de la DLL. MQL5 hace que si una función dentro de la DLL desordena la pila o se bloquea, la ejecución del script se detendrá sin bloquear el propio terminal.

Consejo general sobre el uso de funciones DLL: tratar de hacer llamadas raras con una gran cantidad de trabajo en el interior, en lugar de decenas de miles de llamadas por segundo con la transferencia de pequeños resultados.

Por cierto, una observación más sobre las múltiples llamadas a DLL - durante las pruebas me di cuenta de que se producen fugas de memoria de varios bytes en cada llamada

marketeer:

¿No hay ningún error en la función StringExplode? En su forma actual no copia el último componente de la cadena si no hay un delimitador tras él (es decir, al final de la cadena). En mi opinión, debería tomarse el final de la cadena aunque no haya ningún delimitador al final. Ejemplo: introducimos la cadena"EURUSD,EURJPY" con el delimitador "," y la función ahora sólo selecciona EURUSD.

Aquí está la versión corregida de la función, por comodidad he devuelto el número de elementos:


Gracias, no había prestado atención. Se puede ver porque el último elemento en el descriptor es un número aleatorio, que no tiene ningún significado.

---------

Gracias. Pondré en práctica todas las sugerencias de mejora en la medida de lo posible. La idea en sí es buena, me gustaría que no se estancara.

 
Renat:

¿A quién va dirigida la pregunta: al autor o a los desarrolladores?

Si es a los desarrolladores, ¿qué sugiere exactamente?

Autor. Usted puede pasar el tamaño de la matriz junto con él, entonces usted puede organizar una sola vez la copia de la matriz directamente de la memoria a la memoria - muy barato y pasa por alto los problemas en MQL4 con referencias elemento por elemento. Tengo un montón de cosas que hacer ahora, de lo contrario habría escrito un ejemplo.... Espero que entiendas lo esencial.

De antemano... -- si usas bloqueos e implementas la transferencia correctamente, este enfoque debería ser seguro.

 

Que complicado es...

Con la ayuda de Ilnur hace un año escribí una biblioteca en MQL4 para trabajar con la memoria. Puedes asignar memoria, mover punteros, escribir y leer, transferir el nombre del area de memoria a cualquier otro programa.

Todo se basa en la asignación. Es mucho más simple que la propuesta.

 
Zhunko:

Que complicado es...

Con la ayuda de Ilnur hace un año escribí una biblioteca en MQL4 para trabajar con la memoria. Puedes asignar memoria, mover punteros, escribir y leer, transferir el nombre del area de memoria a cualquier otro programa.

Todo se basa en la asignación. Es mucho más simple que la propuesta.

La cuestión es que en el enfoque propuesto no es necesario asignar memoria y mover punteros. Las lecturas y escrituras se organizan directamente en el buffer. Esto es mucho más simple que el mapeo.
 
Renat:
Hay una advertencia muy seria para aquellos que utilizan llamadas frecuentes de funciones DLL como Get/Set.


En aras de la seguridad del sistema, cada llamada DLL pasa a través de un stripper especial, que ralentiza la ejecución. La llamada a una función DLL no es una banal llamada XXXX, sino un complejo envoltorio con enmascaramiento de direcciones, control de pila y bloqueos dentro de la DLL. MQL5 hace que si una función dentro de la DLL desordena la pila o se bloquea, la ejecución del script se detendrá sin bloquear el propio terminal.

Consejo general sobre el uso de funciones DLL: intenta hacer pocas llamadas con una gran cantidad de trabajo en su interior, no decenas de miles de llamadas por segundo con pequeños resultados pasajeros.

Corrección: desde la build 240 se han eliminado los retardos en las llamadas a DLL. Ahora van prácticamente sin retardos como en nativo.
 

Muchas gracias al autor, no es una biblioteca pequeña, con un uso adecuado y

y "cruces que no contradigan las leyes de la genética" se pueden obtener buenos resultados.

Yo, por ejemplo, al final "tiré" de datos de gráficos offline, en modo online))). MT4 plataforma.


Una cucharada de alquitrán)))

Más de una vez hubo situaciones en las que en la lista de variables globales

en la lista de variables globales eran "viejos" por alguna razón no se elimina.

Todavía no puedo averiguar la razón de esto.