Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1076

 

¿Cómo puedo leer un archivo grande en una sola línea?

FileReadString()

Cuando se lee de un archivo bin, se debe especificar la longitud de la cadena a leer. Cuando se lee de un archivo txt no se requiere la longitud de la cadena, y la cadena se leerá desde la posición actual hasta el carácter de avance de línea "\r\n". Cuando se lee de un archivo csv, la longitud de la cadena tampoco es necesaria, la cadena se leerá desde la posición actual hasta el delimitador más cercano o hasta el carácter final de la cadena de texto.

La única bandera para todo el archivo es FILE_BIN, pero en MQL5, a diferencia de MQL4, está limitada a 4095 bytes. ¿Cómo puedo obtener un texto grande de un archivo en una sola línea?
 
Сергей Таболин:

No me refiero a eso.

"Y con un NOT lógico para resolver - invertir los bits, pero no tengo un terminal - no puedo recordar cómo hacer un NOT a nivel de bits en MQL, y no quiero leer la ayuda en línea".

Quiero decir que o me das una prueba o no enturbias las aguas ))))

"Cualquiera puede cometer un error. Sólo los fuertes pueden admitir un error". Si nadie lo ha expresado aún, esa es mi sabiduría ))). Si alguien ya lo ha dicho - he repetido la sabiduría de un sabio ))))

Sigo sin entender sus afirmaciones. ¿Sugieres que te demuestre algo? - ¿Por qué? ))))

Aquí he reproducido mediante NOT y he comprobado todas las variantes discutidas:

void OnStart()
  {
//---
   uint TForiginal=OBJ_PERIOD_M1|OBJ_PERIOD_M2|OBJ_PERIOD_M3|OBJ_PERIOD_M4|OBJ_PERIOD_M5|OBJ_PERIOD_M6|OBJ_PERIOD_M10|
                   OBJ_PERIOD_M12|OBJ_PERIOD_M15|OBJ_PERIOD_M20|OBJ_PERIOD_M30|OBJ_PERIOD_H1;

   uint TFwithNOT=(~OBJ_PERIOD_H1&OBJ_PERIOD_H2)-1;
   uint TFwithShift=OBJ_ALL_PERIODS>>9;
   Print("TForiginal = ",TForiginal);
   Print("TFwithNOT = ",TFwithNOT);
   Print("TFwithShift = ",TFwithShift);
  }
//+------------------------------------------------------------------+

La variante NOT funciona con cualquier TF, pero se rellena en función de (~TF_ por debajo de la cual mostramos & TF_uno mayor que el TF requerido)-1;

 

¡Buenos días a todos! Una pregunta más...

Hay un programa MQL5, tiene un ajuste (mucho) de "Parámetros de entrada". El programa realiza cálculos y crea/borra y gestiona objetos gráficos según sea necesario.

Tras el cambio de los parámetros de entrada desde la ventana de configuración se genera eleventoInit, que lleva a la inicialización del programa y a "recalcular" y "redibujar" los objetos, que es, en principio, lo que se necesita, peroel eventoInittambién se genera cuando se cambia el periodo del gráfico (y otros), como resultado el proceso se repite cada vez, incluso cuando no es necesario.

Pregunta:¿Cómo puedo excluir la inicialización del programa en el eventoInit sino se cambian los parámetros de entrada pero se deja la inicialización al inicio del programa (terminal)?

Posible variante: recordar los valores establecidos y compararlos cuando se produzca el evento Init y si son diferentes permitir la inicialización, pero hay muchos parámetros de entrada...

 
Anzhela Sityaeva:

¡Buenos días a todos! Una pregunta más...

Hay un programa MQL5, tiene un ajuste (mucho) de "Parámetros de entrada". El programa realiza cálculos y crea/borra y gestiona objetos gráficos según sea necesario.

Tras el cambio de los parámetros de entrada desde la ventana de configuración se genera eleventoInit, que lleva a la inicialización del programa y a "recalcular" y "redibujar" los objetos, que es, en principio, lo que se necesita, pero el eventoInit también se genera cuando se cambia el periodo del gráfico (y otros), como resultado el proceso se repite cada vez, incluso cuando no es necesario.

Pregunta:¿Cómo puedo excluir la inicialización del programa en el eventoInit si no se cambian los parámetros de entrada pero se deja la inicialización al inicio del programa (terminal)?

Posible variante: recordar los valores establecidos y compararlos cuando se produzca el evento Init y si son diferentes permitir la inicialización, pero hay muchos parámetros de entrada...

He aquí algunos consejos para otro problema similar

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

Funciona en el EA, pero no es correcto en el indicador, la música cuando el indicador se inicia

Ihor Herasko, 2019.06.17 14:12

Sí.

  1. Cuando el indicador se inicia, crea una variable terminal global. Como... estoy arrancado.
  2. Se reproduce un saludo.
  3. En la descarga (marcada en OnDeinit) se elimina la variable global del terminal.
  4. Si durante el funcionamiento se modifica el TF o se cambian los parámetros, al salir en OnInit se comprueba la variable global del terminal. Si es así, el saludo no se reproduce. Si no, se reproduce el saludo.

 
Alexey Viktorov:

He aquí algunos consejos para otro problema similar



Gracias por la respuesta, parece que en nuestro caso tendremos que seguir el estado de un par de docenas de cambios de correspondenciasdescribiendo esto a través de un "blanco" en un gráfico para seguir sus cambios, o aguantar una inicialización innecesaria mientras no haya demasiados objetos...
 
Anzhela Sityaeva:
Gracias por la respuesta, parece que en nuestro caso tendremos que seguir el estado de un par de docenas de cambios de correspondencias describiéndolo a través de un "espacio en blanco" en el gráfico para seguir sus cambios, o aguantar una inicialización innecesaria mientras no haya tantos objetos...

Pero la pregunta que hiciste fue.

Anzhela Sityaeva:

¡Buenos días a todos! Una pregunta más...

Hay un programa MQL5, tiene ajustes (mucho) "Parámetros de entrada". El programa realiza cálculos y crea/borra y gestiona objetos gráficos según sea necesario.

Tras el cambio de los parámetros de entrada desde la ventana de configuración se genera eleventoInit, que lleva a la inicialización del programa y a "recalcular" y "redibujar" los objetos, que es, en principio, lo que se necesita, pero el eventoInittambién se genera cuando se cambia el periodo del gráfico (y otros), como resultado el proceso se repite cada vez, incluso cuando no es necesario.

Pregunta:¿Cómo puedo excluir la inicialización del programa en el eventoInit si no se cambian los parámetros de entrada pero se deja la inicialización al inicio del programa (terminal)?

Posible variante: recordar los valores establecidos y compararlos cuando se produzca el evento Init y si son diferentes permitir la inicialización, pero hay muchos parámetros de entrada...

Y en tu situación, uno de esos consejos evitará estos redibujos innecesarios de los objetos. Y si estos objetos se eliminan en OnDeinit(), debería prohibir la eliminación allí también al cambiar el gráfico.

Este es un foro para el comercio, los sistemas automatizados de comercio y las pruebas de estrategia.

¿Cómo borrar la variable global del terminal al cierre del gráfico?

Alexey Viktorov, 2019.06.29 08:40

Preste atención a esta tabla

PROGRAMA_DE_RAZONES

0

Expert ha dejado de funcionar al llamar a ExpertRemove()

REASON_REMOVE

1

Programa eliminado de la carta

REASON_RECOMPILE

2

Programa recompilado

CAMBIO_DE_CARTA_DE_RAZÓN

3

El símbolo del gráfico o el periodo se ha modificado

REASON_CHARTCLOSE

4

El gráfico está cerrado

PARÁMETROS_DE_RAZÓN

5

Los parámetros de entrada fueron modificados por el usuario

REASON_ACCOUNT

6

Se ha activado otra cuenta o se ha vuelto a conectar al servidor comercial porque se ha modificado la configuración de la cuenta

PLANTILLA_DE_RAZÓN

7

Se aplicó otro modelo de gráfico

REASON_INITFAILED

8

El controlador OnInit() devuelve un valor distinto de cero

REASON_CLOSE

9

La terminal estaba cerrada


y en esta línea de su código

   if(reason==1) GlobalVariableDel("val");

Pero si recuerdo bien el principio de tu problema, es mejor poner la condición así

   if(reason != REASON_CHARTCHANGE) GlobalVariableDel("val");

 
Alexey Viktorov:

Pero en su pregunta era

En tu situación, uno de esos consejos evitará estos redibujos innecesarios de objetos. Y si estos objetos se eliminan en OnDeinit(), entonces debería prohibir la eliminación allí también al cambiar el gráfico.


La dirección está clara, vamos a intentarlo... Gracias por su respuesta.
 
No he encontrado ningún ejemplo de EA en Codebase en el que se pueda establecer una condición de cierre, no sólo el SL/TP estándar. ¿Puede alguien darme una pista?
 
Sprut112:
No he encontrado ningún ejemplo de EA en Codebase en el que se pueda establecer una condición de cierre, no sólo el SL/TP estándar. ¿Puede alguien darme una pista?

¿Cuál es la diferencia entre la condición de apertura y la de cierre?

 
Sprut112:
No he encontrado en Codebase un ejemplo de EA donde se pueda escribir la condición de cierre de una posición, y no sólo el SL/TP estándar. ¿Puede alguien decirme?

Vladimir Karputov tenía estas condiciones en sus códigos, pero tienes que aprender a leer su código por ti mismo)