Errores, fallos, preguntas - página 1525

 
Yuri Evseenkov:

MT4. Una vez más, me gustaría llamar su atención sobre las peculiaridades de la inicialización de las variables globales del programa.

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

Bichos, errores, preguntas

Slawa, 2016.02.24 07:34

Cola. La aplicación sólo tiene dos horas.

En general, este tipo de preguntas deben hacerse en el foro. Porque muchos pueden verse afectados. Me tomaré la libertad de citarte y responderte inmediatamente

Se trata de un comportamiento planificado. De hecho, se describe explícitamente en la documentación

La carga y la descarga implican una reinicialización completa de todo.

En el cinco, como bien has notado, la situación es similar.

Es cierto, históricamente era en el cuatro, y cambiamos este comportamiento al principio al cambiar al nuevo MQL4 (para que se comporte como en los expertos, es decir, como se espera). Pero surgieron muchas dudas con los antiguos indicadores, que se basaban en esta inicialización. Nos vimos obligados a volver

En los cinco, este fue el caso inmediatamente debido a la arquitectura. Cuando se cambian los parámetros, se destruye el antiguo indicador con los antiguos parámetros y se crea el nuevo indicador con los parámetros modificados.


 
Alexey Kozitsyn:

Gracias. Conclusión - una cita de la documentación: "... función predefinida OnInit(), cuyo propósito es la correcta inicialización de todas las variables globales y estáticas del programa."

Así que pon a cero o por defecto todas las variables globales o arrays aOnInit().

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 

1. Creo un array de la forma

CArrayString list[5];

2. Intento llamar a la lista de métodos mediante <Ctrl+Espacio>.

list[0].
La lista de métodos no aparece. ¿Se supone que debe ser así?
 
Andrey Voytenko:

1. Creo un array de la forma

2. Intento llamar a la lista de métodos en el código mediante <Ctrl+Espacio>.

La lista de métodos no aparece. ¿Se supone que debe ser así?

Permítanme que intente hacer una conjetura. Si hay otros errores en el código además de que el método/miembro no está especificado, la lista no siempre aparecerá.

Lo he probado. No, suposición equivocada. Pero unas cuantas pulsaciones repetidas de la combinación ayudaron.

 

Alexey Kozitsyn:

Pero unas cuantas pulsaciones repetidas de la combinación ayudaron.

Por desgracia, su receta no me funciona.
 
Andrey Voytenko:
Lamentablemente su receta no me funciona.
No, es cierto, si hay un error en el código, la lista de miembros/métodos abiertos no aparece. Pero si no hay ningún error... y luego problemas.
 

1. Código simple:

uint a=50;
int b=-20;
Print(fmax(a,b));

resultado: 50

2. Añadir entrada de modificadores:

input uint  a=50;
int b=-20;
Print(fmax(a,b));

resultado: 4294967276

Se esperaba un resultado de 50. ¿En qué me equivoco?

 
Andrey Voytenko:

1. Código simple:

resultado: 50

2. Añadimos una entrada modificadora:

resultado: 4294967276

Esperaba un resultado de 50. ¿En qué me equivoco?

fmax compara dos números dobles. Así que es así:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.01"
#property script_show_inputs
//---
input uint a=50;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//uint a=50;
   int b=-20;
   Print("\"uint a=50\" as double:",DoubleToString((double)a,8));
   Print("\"int b=-20\" as double:",DoubleToString((double)b,8));
   Print(DoubleToString(fmax((double)b,(double)a),8));
  }
//+------------------------------------------------------------------+

y el resultado:

2016.03.03 16:00:24.821 Test (EURUSD,D1)        "uint a=50" as double:50.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        "int b=-20" as double:-20.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        50.00000000
Archivos adjuntos:
Test.mq5  2 kb
 
Karputov Vladimir:

fmax compara dos números dobles. Así que es así:

En MQL, se declara y se realiza una conversión de tipo implícita. En particular uint -> double.

La cuestión es por qué no funciona correctamente con las variables de entrada.

 
Andrey Voytenko:

1. Código simple:

resultado: 50

2. Añadir el modificador de entrada:

resultado: 4294967276.

Esperaba un resultado de 50. ¿En qué me equivoco?

Por favor, dame el código completo.

Hay dos posibilidades aquí y ambas son erróneas.

1. El código se ejecuta fuera de cualquier función.

2. la variable de entrada se declara dentro de la función