Discusión sobre el artículo "Consejos de un programador profesional (parte II): Organizando el almacenamiento y el intercambio de parámetros entre el experto, los scripts y los programas externos" - página 2

 
El artículo está poco desarrollado.
Ejemplos de parámetros
  • Tiempo de barra cero
....
¿Dónde almacenar estos parámetros?
¿Por qué almacenar la hora de la barra cero en uno de los lugares propuestos?

De la tabla: el tiempo de vida de un archivo está limitado por el tiempo de vida del archivo. ¿Qué no te gusta "el tiempo de vida de una variable global está limitado por el tiempo de vida de una variable global" :)))?

Para empaquetar datos arbitrarios en variables globales es mejor usar union.

No se dice nada sobre archivos binarios....
 
Últimamente el nivel de los artículos ha ido bajando en el sentido de complejidad de ideas, planteamientos, pero no todos, claro.
 

...

Como usted sabe, el controlador OnInit de un Asesor Experto se activa no sólo cuando se pone en marcha, sino también cuando se cambia el marco de tiempo. De hecho, cada vez que se cambia el marco de tiempo, las variables se restablecen y se inicializan de nuevo, a excepción de los parámetros del Asesor Experto.

...

Incorrecto. Esto es lo que ocurre en el indicador. Cuando se cambian los parámetros y el símbolo/marco temporal del gráfico, el Asesor Experto no se reinicializa.

Ahora, en cuanto a la transferencia de información entre Asesores Expertos/indicadores/servicios, etc.

  1. Variable global del terminal - ajá, el robot opera con dinero real, y su trabajo se basa en los datos, a los que todo el mundo tiene acceso: indicadores, scripts, otros expertos, hijos del usuario, el propio usuario con manos traviesas....
  2. Un objeto gráfico en un gráfico es lo mismo.
  3. Comentarios a las órdenes - DC puede cambiarlos (oops).
  4. Archivo (binario es mejor) - probablemente el mejor de todos los enumerados en el artículo, pero los desarrolladores nunca respondió (o me perdí) la pregunta acerca de la sincronización de intercambio de archivos. Y es una muletilla.

Eso deja sólo EventChartCustom(...), con todas sus desventajas.

Por lo tanto, marque la casilla para permitir la importación de dll y empezar a hacer lo correcto, o, mejor, de ninguna manera.

 
Aliaksandr Hryshyn:
1) El artículo está mal desarrollado.
Ejemplos de parámetros
  • Tiempo de barra cero
2) ¿Por qué almacenar la hora de la barra cero en una de las ubicaciones sugeridas?

3) De la tabla: el tiempo de vida de un archivo está limitado por el tiempo de vida del archivo. ¿Qué hay de malo en "el tiempo de vida de una variable global está limitado por el tiempo de vida de una variable global" :)))?

4) Para empaquetar datos arbitrarios en variables globales, es mejor usar union.

5) No se dice nada de los ficheros binarios....

1) Fui elogiado por el moderador.

2) para no ejecutar el análisis de barras repetidamente

3) el tiempo de vida del archivo es mayor que el tiempo de vida de la variable global

4) Mostré una de las formas de embalaje

5) yo no los uso

 
Vladimir Simakov:

...

a) Incorrecto. Esto es lo que ocurre en el indicador. Cuando se cambian los parámetros y el símbolo/marco de tiempo del gráfico, el Asesor Experto no se reinicia.

Ahora, en cuanto a la transferencia de información entre Asesores Expertos/indicadores/servicios, etc.

  1. Variable global del terminal - ajá, el robot opera con dinero real, y su trabajo se basa en los datos, a los que todo el mundo tiene acceso: indicadores, scripts, otros expertos, los hijos del usuario, el propio usuario con las manos traviesas....
  2. Un objeto gráfico en un gráfico es lo mismo.
  3. Comentarios a las órdenes - DC puede cambiarlos (oops).
  4. Archivo (binario es mejor) - probablemente el mejor de todos los enumerados en el artículo, pero los desarrolladores nunca respondieron (o me perdí) la pregunta sobre la sincronización del intercambio de archivos. Ah, y es una muletilla.

b) Así que, marca la casilla para permitir la importación de dlls y empieza a hacerlo bien, o, mejor, no lo hagas.

a) Estoy de acuerdo en que la reinicialización de las variables del Asesor Experto no se hace

1-2) estamos hablando de intercambio entre tu EA y los scripts. Si quieres, puedes encriptar la información ;-)

3) el DC puede añadir algo al final en MT4. No hay tal cosa en MT5, al menos para mí ;-)

4) Bueno, yo suelo usar la bandera FILE_SHARE_READ.

int file = FileOpen(path, FILE_SHARE_READ|FILE_UNICODE);

b) si lo haces para ti, pues como se suele decir "bandera en tus manos....".

Si lo haces para el mercado, las DLL no pasan por ahí.

 
Malik Arykov:

(a) Acepta que no se reinicialicen las variables EA

1-2) estamos hablando del intercambio entre el Asesor Experto y los scripts. Puede cifrar la información si lo desea ;-)

3) añadir algo al final en MT4. No hay tal cosa en MT5, al menos para mí.

4) Bueno, yo suelo utilizar la bandera FILE_SHARE_READ

b) si lo haces para ti mismo, entonces como se suele decir "flag in your hands....".

Si lo haces para el mercado, las DLL no pasan por ahí.

1-2) Así que encriptar o no encriptar, pero aún puedes cambiarlo/borrarlo)))))

3) Si no se indica explícitamente que no se puede, entonces ... Personalmente, no estoy seguro de que voy a ser capaz de hacerlo.

4) No estoy hablando de eso, estoy hablando de la situación de "carreras" de datos cuando se comparte un recurso desde diferentes hilos. Ejecuta los dos scripts adjuntos en gráficas diferentes. Ejecute primero la escritura. Esta es la respuesta a mi vieja pregunta sobre las metacitas. Y, de nuevo, en el contexto del resultado de la prueba, al que finalmente llegué (gracias a TC) y la pregunta a ellos: ¿dónde están las primitivas de sincronización nativas?

Esta es también la respuesta por qué es de alguna manera mauvais para un profesional para hacer tal cosa en el mercado sin previo aviso enormes cartas a los clientes.

Archivos adjuntos:
write.mq5  2 kb
read.mq5  2 kb
 
Vladimir Simakov:

....

Todos los ejemplos de mis artículos, funcionan bien para mí (en mi EA y scripts)

 
Malik Arykov:

Todos los ejemplos de mis artículos, los tengo trabajando bien para mí (en mi EA y scripts)

Mi post no es sobre lo que no funciona, sino sobre el hecho de que la seguridad e integridad de los datos no están garantizadas. Al utilizar todos los métodos anteriores de transferencia de datos, la fiabilidad del mecanismo no está garantizada. Además, no está relacionada con posibles bugs de sistemas de terceros (Terminal, SO, bugs de hardware), sino con el propio método: colisión de nombres o acciones de usuario en caso de variables globales del terminal, las mismas + funciones de borrado para objetos gráficos, falta de sincronización para operaciones de lectura y escritura en un fichero desde diferentes hilos.

Sí, la probabilidad de esto se puede reducir a valores muy bajos, pero no a 0. Eso es lo que debes tener en cuenta)

 
Vladimir Simakov:

Mi post no trata de lo que no funciona, sino de no garantizar la seguridad e integridad de los datos. Al utilizar todos los métodos de transferencia de datos mencionados, no se garantiza la fiabilidad del mecanismo. Además, no está relacionado con posibles bugs de sistemas de terceros (Terminal, SO, bugs de hardware), sino con el propio método: colisión de nombres o acciones de usuario en caso de variables globales del terminal, las mismas funciones + borrado para objetos gráficos, falta de sincronización para operaciones de lectura y escritura en un fichero desde diferentes hilos.

Sí, la probabilidad de esto se puede reducir a valores muy bajos, pero no a 0. Eso es lo que debes tener en cuenta)

El almacenamiento de parámetros en ficheros proporciona una fiabilidad del 100%. Todas tus "colisiones" se solucionan con los prefijos de los nombres de los objetos, incluyendo las variables globales.

Por ejemplo, los parámetros de nivel se almacenan en Files\Cayman\Params\128968168864101576\exp_05_Lev607A160E_H4.txt. Donde 128968168864101576 es ChartID. Nadie conoce este archivo excepto el analizador de este nivel en particular. Coge cualquier trozo de código del artículo e intenta "romperlo" ;-) Si lo rompes, te mostraré dónde cometiste un error ;-)

 
void OnStart()
  {
   while(!IsStopped())
      for(int i=GlobalVariablesTotal();i>=0;--i)
         GlobalVariableSet(GlobalVariableName(i),MathRand());
  }

Algo como este script en cualquier EA/indicador/script/servicio ejecutado por un usuario curioso, y tienes semanas de diversión buscando un bug irreproducible que no existe)))))