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

 

do { ... código de llenado del buffer

}

mientras(estos dos valores no coinciden)

en resumen, obtener los valores en el bucle hasta que coincidan, sólo entonces ejecutar el siguiente código
 
Maxim Dmitrievsky:

do { ... código de llenado del buffer

}

mientras(estos dos valores no son iguales)

En resumen, obtener los valores en el bucle, hasta que sean iguales, sólo entonces ejecutar el siguiente código

La cuestión es que hasta que no funcione un indicador, los datos (flujo) no se pasan al otro, es decir, el bucle del indicador sinOnCalculate de este indicador no servirá. Y en cuanto termina OnCalculate, los datos se pasan al Asesor Experto, y son erróneos.

O tal vez no entiendo su idea.
 
Aleksey Vyazmikin:

Así, el punto es que hasta que un indicador funcione, los datos (flujo) no se transfieren a otro, es decir, el bucle en el indicador sin la terminación de OnCalculate de este indicador no ayudará.

recibes los valores de los buffers de otros indicadores uno a uno, si su número no es el mismo, los obtienes de nuevo hasta que sea el mismo, olvídate de los flujos. Pero en general, nadie lo hace de esta manera - es muy lento

 
Aleksey Vyazmikin:

Entonces, el punto es que hasta que un indicador funcione, los datos (flujo) no se pasan a otro, es decir, el bucle en el indicador sin OnCalculate de este indicador no servirá. Pero en cuanto termina OnCalculate, los datos se pasan al Asesor Experto, y son erróneos.

O no entiendo su idea.

necesitas que se cumpla la condición, entonces sólo se llenarán los buffers, según entiendo (el número de barras en los buffers de otros indicadores será el mismo)

cumplir forzosamente todas las condiciones antes de llenar los búferes del indicador actual

o devolvérsela al programador equivocado: ¿por qué debemos resolver sus problemas en el campo equivocado?

 
Maxim Dmitrievsky:

obtienes los valores de los buffers de otros indicadores uno por uno, si su número no es el mismo, los obtienes de nuevo hasta que sea el mismo, olvídate de los flujos. pero en general, nadie lo hace así - es una perversión de los indicadores de los indicadores, muy lento

Maxim Dmitrievsky:

necesitas que se cumpla la condición, entonces sólo se llenarán los buffers, según tengo entendido (el número de barras en los buffers de otros indicadores será el mismo)

Ejecución forzada de todas las condiciones antes de que se llenen los buffers del indicador actual

o devolvérsela al programador con mala mano, ¿por qué debemos resolver sus problemas en el lugar equivocado?

Si el cálculo no está listo desde otros indicadores, los valores serán cero, por lo que no tiene sentido forzar el llenado aquí, se pueden llenar los datos pasados, pero con el mismo efecto, se pueden solicitar datos no para la barra actual del indicador, sino para la pasada y entonces el código no debe ser cambiado en absoluto.

¿Por qué estamos discutiendo aquí? Porque la situación en el probador y en la cuenta real es diferente, la simulación de Sleep funciona muy extraño, y el recálculo del indicador para 15 segundos de deslizamiento se produce sólo una vez, mientras que debe ocurrir en cada tic, o en la solicitud, y se produce no en 15 segundos, pero en 13, de acuerdo con el registro.

Además, el problema de la sincronización es relevante, y sería bueno añadir para tales situaciones la posibilidad de informar al indicador sobre la necesidad de pasar el flujo de datos a otros indicadores, sin lo cual es imposible realizar más cálculos - esto sería una solución - el comando para pasar el flujo a otro indicador sin completar el cálculo.

Respectivamente, el Asesor Experto debería esperar los datos del indicador y saltarse los ticks hasta que se realice el cálculo completo; ahora, al intentar utilizar la sentencia "while", el resultado del cálculo se cuelga/se queda parado (es decir, no pasa nada, el probador se queda parado), y eso tampoco es correcto.

Por supuesto, he informado al desarrollador, pero no he tenido noticias suyas en más de un mes: el coste de ser autónomo.

 

la situación en el probador y en la cuenta real es diferente, la simulación del sueño funciona muy extraño, y el recálculo del indicador de 15 segundos de deslizamiento se produce sólo una vez, mientras que debería ocurrir en cada garrapata, o en la demanda, pero no se produce en 15 segundos, pero en 13, de acuerdo con el registro.

Además, el problema de la sincronización es relevante, y sería bueno añadir para tales situaciones la posibilidad de informar al indicador sobre la necesidad de pasar el flujo de datos a otros indicadores, sin lo cual es imposible realizar más cálculos - esto sería una solución - el comando para pasar el flujo a otro indicador sin completar el cálculo.

Respectivamente, el Asesor Experto debería esperar los datos del indicador y saltarse los ticks hasta el final del cálculo completo, pero ahora, al intentar usarla sentencia "while" para esperar los resultados correctos del cálculo, se congela/se queda parado (es decir, no pasa nada, el probador se queda parado), y esto tampoco es correcto.

 

EstimadoArtyom Trishkin

Espero que, puesto que han determinado que las preguntas anteriores son para principiantes, ya sepan la respuesta y puedan ayudarme.

Estoy esperando la respuesta de un profesional.

 
Aleksey Vyazmikin:

EstimadoArtyom Trishkin

Espero que, puesto que han determinado que las preguntas anteriores son para principiantes, ya sepan la respuesta y puedan ayudarme.

Estoy esperando la respuesta de un profesional.

El único consejo que puedo dar es el siguiente: el indicador debería salir de OnCalculate() si no ha recibido el número de barras requerido para el cálculo: if(rates_total<number of_bars required) return 0;

El Asesor Experto debe comprobar los datos recibidos del indicador, y si no son iguales al valor vacío del indicador, sólo entonces realizar los cálculos con los datos recibidos.

  1. En el indicador, en primer lugar, los búferes se inicializan con un valor vacío (lo que es - se puede establecer en el indicador)
  2. En el indicador (los búferes ya están llenos con un valor vacío), compruebe el número de barras disponibles (que he descrito anteriormente)
  3. Si se supera la comprobación de la disponibilidad de la barra, se ejecuta el ciclo de cálculo del indicador con el llenado de los buffers con los valores necesarios.
    ... ... ...
  4. En el Asesor Experto, compruebe cuántas barras calcula el indicador (hay una función estándar BarsCalculated())
  5. Obtener datos del indicador
  6. Según lo que consigamos - depende de la lógica de su ST
    1. Si el indicador es una línea, su valor vacío indica que aún no ha sido calculado - no lo tomamos para los cálculos
    2. Si el indicador - flechas, entonces hay otra lógica (porque el valor vacío es también sus datos de trabajo), por ejemplo, si se trata de un fractal, a continuación, comprobar el número de barras 3, y de los valores obtenidos empujar hacia atrás.
  7. Bueno, incluye tu propia lógica y no culpes de todo a los bichos del terminal.
  8. En primer lugar, compruebo los errores conmigo mismo.
  9. ¿Y tú?
 
Artyom Trishkin:

Sólo puedo aconsejar: el indicador debe salir de OnCalculate() si no obtuvo el número correcto de barras para el cálculo: if(rates_total<number_of_bars required) return 0;

Gracias por el consejo, no hay problema con la salida, pero no resuelve la situación, lo he hecho como un cálculo fallido por ahora

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

Y de alguna manera llena los buffers y obtiene datos de otros indicadores y los datos no se pasan al EA hasta que se cumpla una condición. Todavía no he comprobado la exactitud de los datos, pero parece correcto. ¿O tal vez me equivoque y algo esté definitivamente mal?

Artyom Trishkin:

El Asesor Experto debe comprobar los datos recibidos del indicador y si no son iguales al valor vacío del indicador, sólo entonces realiza los cálculos con los datos recibidos.

El Asesor Experto realiza los cálculos uno a la llegada de una nueva barra, y respectivamente, el intento de esperar el valor correcto del indicador conduce a una parada del probador.

Artyom Trishkin:
  1. En el indicador de búferes se inicializan primero con un valor vacío (lo que es - se puede establecer en el indicador)
  2. En el indicador (los búferes ya están llenos con un valor vacío) compruebe el número de barras disponibles (descrito anteriormente)
  3. Si se supera la comprobación de la disponibilidad de las barras, se realiza el ciclo de cálculo del indicador llenando los buffers con los valores necesarios
    ... ... ...
  4. En el Asesor Experto, compruebe cuántas barras calcula el indicador (hay una función estándar BarsCalculated())
  5. Obtener datos del indicador
  6. Según lo que consigamos - depende de la lógica de su ST
    1. Si el indicador es una línea, su valor vacío indica que aún no ha sido calculado - no lo tomamos para los cálculos
    2. Si el indicador - flechas, entonces hay otra lógica (porque el valor vacío es también sus datos de trabajo), por ejemplo, si se trata de un fractal, a continuación, comprobar el número de barras 3, y de los valores obtenidos empujar hacia atrás.
  7. Bueno, incluye tu propia lógica y no culpes de todo a los bichos del terminal.
  8. En primer lugar, compruebo que no hay errores en mí mismo.
  9. ¿Y tú?

1. Es cierto.

2. Y así sucede. Este cálculo será correcto en el siguiente tick, pero quiero recibir el cálculo correcto en el primer tick, porque el Asesor Experto no espera en el bucle otros ticks o la expectativa no es conmensurable con mi paciencia, es decir, no es realista - hay un error.

3.

4. Por supuesto.

5. Sí, lo hacemos, pero el indicador necesita recibir datos de otros indicadores y ese es el problema.

6. 1-2. no es correcto poner deliberadamente datos falsos en el búfer del indicador, sólo complicará la detección del error del algoritmo en el código del Asesor Experto.

7. Estoy describiendo todo lógicamente, pero yo no escribí el indicador, por lo que es difícil para mí entender cuál es la razón, describí la manifestación razonable del indicador, a saber, la incapacidad de realizar un cálculo sin recibir los valores de búfer de otros indicadores, debido al monopolio del flujo de datos (los indicadores se calculan secuencialmente).

8. Ya he señalado aquí y antes que no soy el autor, que he dedicado mucho tiempo -casi un día- a identificar las razones.

9. Y estoy buscando una solución al problema, además, si alguien se ha enfrentado a esto, puede ayudarme rápidamente. Repito, en ese hilo empecé a escribir por lo del Sueño, y luego salieron las otras características del probador, que también creo el error.

Gracias por la respuesta.

 
Aleksey Vyazmikin:

Gracias por el consejo, no hay problema con la salida, pero no resuelve la situación, he hecho como un cálculo fallido hasta ahora

Y de alguna manera llena los buffers y obtiene datos de otros indicadores, los datos no se pasan al EA hasta que se cumpla la condición. Todavía no he comprobado la exactitud de los datos, pero parece correcto. ¿O tal vez me equivoque y algo esté definitivamente mal?

El Asesor Experto realiza el cálculo solo cuando llega una nueva barra y por lo tanto, al tratar de esperar el valor correcto del indicador, lleva a una detención del probador.

1. lo hace.

Y así es. 2. Este cálculo será correcto en el siguiente tick, pero necesito obtener un cálculo correcto en el primer tick, porque mi Asesor Experto no espera en el bucle otros ticks o la expectativa no es conmensurable con mi paciencia, es decir, no es realista - hay un error.

3.

4. Por supuesto.

5. Sí, lo hacemos, pero el indicador necesita recibir datos de otros indicadores y ese es el problema.

6. 1-2. no es correcto poner deliberadamente datos falsos en el búfer del indicador, sólo complicará la detección del error del algoritmo en el código del Asesor Experto.

7. Estoy describiendo todo lógicamente, pero yo no escribí el indicador, por lo que es difícil para mí entender cuál es la razón, describí la manifestación razonable del indicador, a saber, la incapacidad de realizar un cálculo sin recibir los valores del buffer de otros indicadores, debido al monopolio del flujo de datos (los indicadores se calculan secuencialmente).

8. Ya he señalado aquí y antes que no soy el autor, pasé mucho tiempo - casi un día - para identificar las causas.

9. Y estoy buscando una solución al problema, además, si alguien se ha enfrentado a esto, puede ayudarme rápidamente. Repito, en ese hilo empecé a escribir por lo del Sueño, y luego salieron las otras características del probador, que también creo el error.

Gracias por la respuesta.

En OnInit() llame a la serie temporal del símbolo: iTime(Symbol,Timeframe,1);

Al principio, en OnTick(), pida la barra requerida de la serie de tiempo requerida usando el correspondiente iFunc(), o si( iTime(Symbol,Timeframe,10)==0) retorne;

En este caso, el Asesor Experto no detectará una nueva barra y esperará al siguiente tick.

En OnInit() hemos solicitado los datos de la serie temporal, activando así la paginación de datos.

En OnTick() comprobamos si el historial mínimamente necesario está disponible para el EA y si aún no lo está, esperamos al siguiente tick.

Y hasta que se reciban todos los datos requeridos por el Asesor Experto, éste esperará al siguiente tick.

Tan pronto como se bombeen y obtengan todos los datos necesarios, el Asesor Experto comenzará a trabajar con la nueva barra y el historial requerido.

Para mantener los datos en serie actualizados, es imprescindible acceder a ellos al menos una vez cada dos minutos. Haga un segundo temporizador de aproximadamente un minuto y medio (90 segundos) y en él simplemente haga referencia a cualquier serie de tiempo del símbolo deseado, por ejemplo iTime(Symbol,Timeframe,1); Sin comprobar los datos recibidos - simplemente "mueva" la historia. Así, todos los datos del símbolo estarán siempre actualizados.