[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 267

 
drknn:


1. ok. Se ha declarado Int start(). Siempre he devuelto el cero. He visto los comandos return(-1) e incluso return(-2) en el código también. ¿Cuál es la forma correcta de elegir este código?

2. Así que surge la pregunta natural, ¿es posible declarar start() del EA/indicador/script no de tipo int(), sino de cualquier otro tipo y entonces qué devolver al terminal? En otras palabras, ¿qué hace el terminal con el valor devuelto por return()?

1. ¿Cómo se decide lo que debe devolver una función normal?

2. Puede tener cualquier tipo, como una función normal. El terminal no hace nada con los valores devueltos. Los ignora.

Funciones especiales

 
Zhunko:

1. ¿Cómo se decide lo que debe devolver una función normal?

2. Puede tener cualquier tipo, como una función normal. El terminal no hace nada con los valores devueltos. Los ignora.


1. Para decidir qué debe devolver una función ordinaria, necesito saber por qué el código principal necesita ese valor. Por ejemplo, si quiero tomar la decisión de abrir una orden de compra cuando hay una señal, escribiré una función que devuelva el número de órdenes de compra que ya están abiertas. Dependiendo de cuántos sean, el código tomará una decisión siguiendo la lógica incorporada en el código. No sé qué lógica tiene el código de retorno. Hoy estaba mirando un artículo sobre la creación de un semáforo y me encontré con un código de retorno (-2). Sorprendido, hizo una pregunta aquí. Eso es todo. ( https://www.mql5.com/ru/articles/1412 - artículo aquí).

2. el terminal ignora los valores devueltos. ¿Es así? Si es así, de nuevo surge una pregunta legítima, ¿por qué en la creación de un EA / indicador / script, el desarrollador puso en una plantilla exactamente int, porque sería más razonable poner allí vacío - entonces el terminal no tiene que ignorar nada - ganaríamos 1 tacto de tiempo de procesador? ¿Tal vez hay alguna lógica en QUÉ devolver de las funciones int init(), int deinit() e int start()? Creo que Roche ya lo explicó a alguien en alguna parte -recordó una descripción de cuándo devolver el cero y cuándo devolver (-1). Era esta misma explicación la que buscaba. Lástima que no haya podido encontrarlo...

P.D.

El autor del artículo utiliza return(-2) para sus propios fines. Pero el hecho es que a veces la función start() termina con un código que devuelve un valor diferente de cero. Y no es sólo una persona la que lo hace. Esta es exactamente la lógica que queremos entender.

 

Parece que hay en el texto.

Las funciones predefinidas pueden tener parámetros. Sin embargo, cuando estas funciones son llamadas por el terminal cliente, no se pasarán parámetros externos, sino que se utilizarán los valores por defecto.

Se trata de los parámetros que entran en la función, no de los parámetros que devuelve.

 
Gracias por su respuesta.
drknn:
Esto es un contador de pedidos. Puede darse el caso, por ejemplo, de que quiera saber en el código si hay órdenes de compra en el mercado para un determinado par de divisas y con un determinado número mágico, por ejemplo. Si lo hay, por ejemplo, no se puede abrir otra orden de compra. Así que el contador de pedidos es necesario para tomar una decisión.
 
paladin80:

Escribí esto en mi EA justo después de la salida:

Pruébalo, puede que te resulte útil.

Gracias, he encontrado mi error. Cuando mi EA se ha atascado por la razón dada en el artículo (enlace de arriba), lo he cerrado y he empezado de nuevo, pero me olvidé de cambiar el maestro de órdenes de 123 a 124 y dos EAs de diferente dirección obtuvieron los mismos mags y empezaron a competir para ver quién abre las órdenes más rápido. Si el primer pedido se abrió primero, no fue lo mismo que, por ejemplo, la venta o viceversa. En cuanto cambié la magia del segundo EA actualizado, ambos empezaron a funcionar con normalidad. Si el error se repite, seguiré tu consejo. Gracias por las respuestas.
 

cómo se pueden entender estas líneas:

volumen de pedidos de devolución

if(compras>0) return(compras);

Si no es así, return(-sells);

} ?

 

Escribe un guión:

int start(){
  Print("Попытка ретурна 136");
  return(136);
}

tirarlo en el gráfico y ver el registro:

2012.07.20 12:04:11 111 NZDUSD,M15: removed
2012.07.20 12:04:11 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:04:11 111 NZDUSD,M15: Попытка ретурна 136
2012.07.20 12:04:11 111 NZDUSD,M15: loaded successfully

(aquí 111 es el nombre del script). Vemos la línea "uninit reason 0" - ¡aparentemente el terminal estaba esperando el cero!

Prueba lo mismo con (-1) :

int start(){
  Print("Попытка ретурна -1");
  return(-1);
}

El resultado es el mismo:

2012.07.20 12:08:19 111 NZDUSD,M15: eliminado
2012.07.20 12:08:19 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:08:19 111 NZDUSD,M15:Intento de retorno -1

2012.07.20 12:08:19 111 NZDUSD,M15: cargado con éxito

Al terminal parece importarle si se devuelve el cero o no.

P.D.

En general, en la web se encontró esta respuesta:

return 0 - el programa ha completado su trabajo sin errores
devuelve 1 - o un número superior, el programa ha terminado su trabajo con un error y devuelve el código de error para su posterior procesamiento.

En cualquier sistema operativo, cualquier programa siempre devuelve un código de error.

El único problema es que nuestro retorno no devuelve el código al sistema operativo, sino al terminal. Esto deja la pregunta abierta.

 
drknn:

Escribe un guión:

tirarlo en el gráfico y ver el registro:

(aquí 111 es el nombre del script). Vemos la línea "uninit reason 0" - ¡aparentemente el terminal estaba esperando el cero!

Prueba lo mismo con (-1) :

El resultado es el mismo:

Aparentemente, al terminal le importa si se devuelve un cero o no.


La razón de uninit es el código de la razón de la terminación del Asesor Experto

https://docs.mql4.com/ru/constants/uninit

 
Estás ligeramente confundido, UNINIT REASON no tiene nada que ver con los rendimientos relativos a las funciones estándar. Escriba un EA y llame al "init" desde el "start" con diferentes resultados de retorno y vea. En realidadhttps://docs.mql4.com/ru/basis/functions/special el doc lo dice todo perfectamente. Vuelve a leerlo con atención .
 
drknn:


1. Para poder decidir exactamente qué debe devolver una función normal, debería saber exactamente por qué el código principal necesita ese valor. Por ejemplo, si quiero tomar la decisión de abrir una orden de compra cuando hay una señal, escribiré una función que devuelva el número de órdenes de compra ya abiertas. Dependiendo de cuántos sean, el código tomará una decisión siguiendo la lógica incorporada en el código. No sé qué lógica tiene el código de retorno. Hoy estaba mirando un artículo sobre la creación de un semáforo y me encontré con un código de retorno (-2). Sorprendido, hizo una pregunta aquí. Eso es todo. ( https://www.mql5.com/ru/articles/1412 - artículo aquí).

2. el terminal ignora los valores de retorno. ¿Es esto correcto? Si es así, de nuevo surge una pregunta legítima, ¿por qué al crear un EA/indicador/script el desarrollador pone en una plantilla exactamente int, porque sería más lógico poner allí void - entonces el terminal no tendría que ignorar nada - entonces ganaríamos 1 tacto de tiempo de procesador? ¿Quizás hay alguna lógica en QUÉ devolver de las funciones int init(), int deinit() e int start()? Creo que Roche ya lo explicó a alguien en alguna parte -recordaba una descripción de cuándo devolver el cero y cuándo devolver (-1). Era esta misma explicación la que buscaba. Lástima que no haya podido encontrarlo...

P.D.

El autor del artículo utiliza return(-2) para sus propios fines. Pero el hecho es que a veces la función start() termina con un código que devuelve un valor diferente de cero. Y no es sólo una persona la que lo hace. Es exactamente esta lógica la que quiero entender.

1. No puedo añadir nada. Lo que quieras, devuélvelo.

2. El terminal lo ignora y tu código no lo ignora, si es que está construido así. La llamada al sistema ignora tanto los parámetros como el valor de retorno. Es bastante obvio. ¿A dónde vuelve en este caso?

Sólo podemos adivinar la creación del patrón. Los desarrolladores deben haber partido de la INT por defecto.

Razón de la queja: