Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1213

 

¡Salud! Ayuda :)

Desde el indicador (mt5) se copia un historial de ticks para su posterior procesamiento. He copiado el algoritmo del libro de referencia, sólo lo he cambiado un poco:

         int     attempts = 0;
         bool    success = false;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while(attempts < 3) {
            uint start = GetTickCount();
            checkPoint = TimeCurrent();
            int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_ALL, startCopyTime, ticksSizeToCopy);
            if(received != -1) {
               PrintFormat("%s: received %d ticks in %d ms", _Symbol, received, GetTickCount() - start);
               if(GetLastError() == 0) {
                  success = true;
                  break;
               } else
                  PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                              _Symbol, received, GetTickCount() - start, _LastError);
            }
            attempts++;
         }
         if(!success) {
            PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol);
            return;
         }
         copyTickTime = checkPoint;

Pero tengo una advertencia, el historial de garrapatas está desincronizado:

2020.07.12 10:07:12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error=4403

Y en el manual dice:

ERR_HISTORY_TIMEOUT

4403

Tiempo de espera excedido en la solicitud de historial

La intuición del capitán me dice que sincronice los ticks... ¿es este el punto que estoy tratando de hacer? ¿Cómo hacerlo? ¿O es posible trabajar sin mucho daño incluso sin sincronización, simplemente eliminando la comprobación de éxito?

 
Yevhenii Levchenko:

¡Salud! Ayuda :)

Se copia el historial de ticks de un indicador (mt5) para su posterior procesamiento.

Los indicadores tienen acceso asíncrono a los datos del historial, mientras que los Asesores Expertos y los scripts tienen acceso síncrono, o al menos así es como los desarrolladores de los programas MQL denominan el comportamiento al trabajar con los datos

en lenguaje humano, al acceder a los datos del historial en el indicador, es necesario salir del ciclo de cálculo con un error, y después de un tiempo es necesario volver a aplicar al historial

Y no tiene sentido llamar al historial del indicador varias veces en un bucle - este método sólo funciona en Asesores Expertos y scripts

 
Igor Makanu:

En los indicadores el acceso asíncrono a los datos históricos, en los Asesores Expertos y en los scripts - el acceso síncrono, o al menos así es como los desarrolladores llaman al comportamiento de los programas MQL cuando trabajan con datos

en lenguaje humano, al acceder a los datos del historial en el indicador, es necesario salir del ciclo de cálculo con un error, y después de un tiempo es necesario volver a aplicar al historial

y no tiene sentido llamar al historial varias veces en el indicador - este método sólo funciona en Asesores Expertos y scripts

Gracias.

¿Está la sincronización relacionada con el multihilo? "Las garrapatas no están sincronizadas todavía" - resulta más bien una advertencia?

 
ANDREY:

Tonterías... No eres bueno en lógica, no eres bueno en matemáticas ..... y al mismo tiempo has moderado durante mucho tiempo y con éxito un foro cuya temática está impregnada tanto de lógica como de matemáticas.

¿Dónde he dicho que no se me dé bien la lógica?

 
ANDREY:

Creo que los conocimientos que poseen un grupo de especialistas no eran los del propio Ford y nunca llegaron a serlo. Además, no necesitaba estos conocimientos, porque los consideraba innecesarios. Y si estos expertos intentaran transmitir sus conocimientos a Ford, éste no sería capaz de asimilarlos y utilizarlos con fines prácticos. Es necesario tener algo más que una idea general del tema, que se asocia a los nuevos conocimientos, para poder absorberlos. En el ejemplo anterior, los peritos no aportaron conocimientos a Ford, sino a los abogados.

Y en tu cerebro, según me parece, tienes una cantidad suficiente de conocimientos sistematizados en matemáticas y lógica y este kit te permite formular rápida y correctamente una consulta de búsqueda de información nueva y faltante e interpretarla rápida y correctamente. Estoy seguro de que en su cerebro no puede haber tal información, ya que todos los días durante muchas horas pasadas en este foro y pasó por su cerebro una gran cantidad de información asociada específicamente con las matemáticas y la lógica. Es como aprender una lengua extranjera por inmersión. Se aprende de forma automática, espontánea y quizá incluso en contra de la voluntad del alumno.

Si 100 académicos se ponen a explicarme las reglas de cálculo de las ecuaciones integrales, no aprenderé a hacerlo hasta que me llenen la cabeza con todos los libros de texto de matemáticas y álgebra, que tuve que estudiar en el colegio antes de que el profesor empezara a explicar las ecuaciones integrales.

Si no entiendes qué es una variable y para qué sirve, es difícil entender incluso saber qué es una variable, por no hablar de otros conceptos que ni siquiera son muy complicados.

Ford no dijo que se le enseñaría lo correcto en su área de interés. Dijo que estaba rodeado de tantos especialistas en diferentes campos que podía obtener respuestas a las preguntas que necesitaba en cualquier momento. ¿Por qué necesita un directivo saber lo que pueden saber 200 especialistas, cada uno de los cuales dará la respuesta correcta en su área? En principio, es imposible saberlo todo. Pero para obtener rápidamente las respuestas a los problemas que necesitas con la ayuda de especialistas, de eso hablaba Ford, de eso hablaba yo de los libros de referencia y de utilizar la información adecuada. Y eso es en algún área estrecha que este recurso proporciona en forma de CodeBase y un foro.

 
Yevhenii Levchenko:

Gracias.

¿Está la sincronización relacionada con el multithreading? "Las garrapatas aún no están sincronizadas" resulta ser más bien una advertencia?

no

Los desarrolladores dan a entender que la sincronización significa algún tipo de procesamiento garantizado de los datos históricos al llamar a las funciones del historial, pero no garantiza que los datos se devuelvan necesariamente cuando se realicen las consultas

... aquí está el lenguaje no humano ))))


asíncrono es una consulta y los datos o un error. Después de un error, la sincronización se inicia, pero el tiempo de finalización de la sincronización (o la construcción de TF) es desconocido y por el alto rendimiento de MT5 se obtiene un error cada vez en lugar de datos sincronizados

ZS: en MT5 todo es complicado allí.... hay un servidor, hay un terminal y finalmente nuestro programa MQL. Al solicitar el historial hay que sincronizar el servidor - terminal y luego el terminal - programa MQL, alguien puede no tener listos los plazos o los datos de los ticks

 
Igor Makanu:

no

Los desarrolladores dan a entender que la sincronización es una especie de procesamiento garantizado de los datos históricos al llamar a las funciones del historial, pero no garantiza necesariamente la devolución de los datos al consultarlos...

... aquí está el lenguaje no humano ))))


asíncrono es una consulta y los datos o un error. Después de un error, la sincronización se inicia, pero el tiempo de finalización de la sincronización (o la construcción de TF) es desconocido y por el alto rendimiento de MT5 se obtiene un error cada vez en lugar de datos sincronizados

ZS: en MT5 todo es complicado allí.... hay un servidor, hay un terminal y finalmente nuestro programa MQL. Al solicitar el historial hay que sincronizar el servidor - terminal y luego el terminal - programa MQL, alguien puede no tener listos los plazos o los datos de los ticks

La respuesta más fácil es algo así:

Para esperar la sincronización en el indicador, simplemente debe salir de OnCalculate() con el retorno 0 después de recibir un error;

En este caso, el primer acceso a los datos históricos inicia el proceso de sincronización de datos y sólo queda comprobar su finalización. Si hay un error en la recepción de datos, entonces devuelve cero - ya que el cero indica la cantidad de datos ya calculados en la llamada anterior (prev_calculated), y en la llamada actual y la carga exitosa de datos históricos OnCalculate() se calculará sobre toda la profundidad del historial (ya que al devolver 0 indicamos en la llamada anterior que no se ha calculado nada).

 
a.lxrn:

Buenas tardes a todos, podéis ayudarme por favor a solucionar este problema, el problema es de lógica, me he roto el cerebro hoy y he llegado al punto de estar hecho un lío.

He escrito un ejemplo de código elemental, hay una señal si el cierre de la vela es mayor que el vagón, se abre una orden.

La señal se mantendrá y se mantendrá durante mucho tiempo. Estoy seguro de que sabes lo que quiero decir,

Estoy seguro de que entiendes lo que quiero decir. En realidad, cómo debo hacer una señal de compra abrir una orden y ya está, hasta que la situación cambie y el precio de cierre sea inferior al precio de la onda.

Puedo usar banderas, pero no guardan la orden cuando se cierra y se abre o se retrasa durante 15 minutos. Es aún más genial cuando las condiciones de apertura y cierre de las órdenes se cumplen al mismo tiempo. En cada tic una orden)))) Las banderas son si la señal para abrir la orden es verdadera y la bandera de que la orden está abierta es falsa, entonces abrimos la orden. Y si la bandera de que la orden está abierta es verdadera, la orden no se abrirá). Un retraso es más fácil y eficiente. Después de cerrar la orden, establecemos un retraso.

 
Igor Makanu:

asíncrono es una consulta y los datos o un error, y después de un error de la sincronización se inicia, pero el tiempo de la finalización de la sincronización (o la construcción de TF) es desconocido y por el alto rendimiento de MT5 se obtiene un error cada vez que se llama de nuevo en lugar de los datos sincronizados

ZS: en MT5 todo es complicado allí.... Usted tiene un servidor, un terminal y finalmente nuestro programa MQL. Al solicitar el historial es necesario sincronizar servidor - terminal y luego el terminal - programa MQL, alguien puede tener plazos o datos de tick no listos


Aproximadamente lo tengo... Gracias :)

Artyom Trishkin:

Era más fácil responder aproximadamente así:

Para esperar la sincronización en un indicador, hay que salir de OnCalculate() con retorno 0 después de recibir un error;

En este caso, el primer acceso a los datos históricos inicia el proceso de sincronización de datos y sólo queda comprobar su finalización. Si hay un error en la recepción de datos, entonces devuelve cero - ya que el cero indica la cantidad de datos ya calculados en la llamada anterior (prev_calculated), y en la llamada actual y la carga exitosa de datos históricos OnCalculate() se calculará sobre toda la profundidad del historial (ya que al devolver 0 indicamos así en la llamada anterior que no se ha calculado nada).

Más simple no significa más claro :)

Cambié a los instrumentos de stock y sólo se imprimió una vez que estaban desincronizados. Las consultas posteriores no mostraron nada más parecido.

¿Puede decirme por qué el probador no muestra los volúmenes?
 
Yevhenii Levchenko:

Entendido a grandes rasgos... Gracias :)

Más simple no significa más claro :)

Cambié a los instrumentos de stock y sólo se imprimió una vez que estaban desincronizados. Las consultas posteriores no mostraron nada más parecido.

¿Puede decirme por qué el probador no muestra los volúmenes?

Para mantener los datos históricos en estado real "caliente", es necesario acceder a estos datos una vez cada dos minutos utilizando cualquiera de las funciones CopyXXX, iXXX, por ejemplo CopyTime(), iTime(), etc.

No sé qué volúmenes no se consiguen en el probador. Hay volúmenes reales y de garrapatas. Sin código es imposible responder en esencia.

Razón de la queja: