Error en MQL5 al trabajar con el acceso a series temporales iClose/iOpen, etc. - página 10

 
fxsaber:

No tiene sentido.

+1
 
fxsaber:

No tiene sentido.

Mientras "de repente" (c) no se puede hablar de un rendimiento limitado del sistema (no importa cuál).

 

Estos días he estado observando más de cerca el manejo de datos de OnCalculate y de los ticks. Anteriormente se escribió que todo se hace para evitar la "congelación" de los indicadores incorrectamente escritos, pero si realmente queremos procesar todo el flujo de datos de los ticks desde la anterior llamada de OnCalculate, entonces en el movimiento rápido del precio (y el retroceso) deberíamos obtener un array bastante "profundo", ¿hay alguna limitación en la profundidad del array de ticks?

No me gustaría escuchar una respuesta como "OnCalculate recibirá un tick(s) acumulativo..., para optimizar...".

¿Quién está analizando ya los datos de las garrapatas, hay algún motivo de preocupación?

 
Farkhat Guzairov:

Estos días he estado observando más de cerca el manejo de datos de OnCalculate y de los ticks. Anteriormente se escribió que todo se hace para evitar la "congelación" de los indicadores incorrectamente escritos, pero si realmente queremos procesar todo el flujo de datos de los ticks desde la anterior llamada de OnCalculate, entonces en el movimiento rápido del precio (y el retroceso) deberíamos obtener un array bastante "profundo", ¿hay alguna limitación en la profundidad del array de ticks?

No me gustaría escuchar una respuesta como "OnCalculate recibirá un tick(s) acumulativo..., para optimizar...".

¿Quién analiza ya los datos de las garrapatas, hay razones para esos temores?

En 2008-2009 Renat escribió una vez que no hay felicidad en las garrapatas, dio un ejemplo de un experto. Las garrapatas se saltan de todos modos. Si lo necesita, obtengahttps://www.mql5.com/ru/docs/series/copyticks en cada llamada, pero aún así se pierde el deseado 50/50 arriba/abajo para entrar.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 

Sólo voy a aparecer aquí por el bien de la publicidad. Llevo un mes intentando averiguar por qué ha dejado de funcionar:

long lastbardaytime=0;

int OnInit(){ 
}

bool isNewBar(string symbol_,ENUM_TIMEFRAMES period_){
    long curbar = SeriesInfoInteger(symbol_,period_,SERIES_LASTBAR_DATE)%86400;
    if(lastbardaytime == 0){
        lastbardaytime = curbar;
    }
    if(lastbardaytime != curbar){
        lastbardaytime = curbar;
        return(true);
    }
    return(false);
}


void OnTick(){
    if(isNewBar(MIX-12.18,PERIOD_M1)){ 
        Print("New bar");
///....
    }
} 


A la espera de la nueva publicación en Opening.

 

Reanudar las cuestiones relacionadas con la optimización y la carga de datos históricos.

1. El problema del correcto funcionamiento de las funciones iClose/iOpen, y en este caso iTime, existe y creo que no tiene sentido esperar que todo sea perfecto. ¿Quizás deban ser simplemente eliminados de MQL5 para no volver a cometer los mismos errores? (Tengo un problema, pero no tengo tiempo para describirlo, porque he encontrado una solución, otro "giro")

Quizás haya una solución, pero me gustaría que estuviera documentada y no fuera otra vuelta de tuerca de la comunidad MQL5. Estamos hablando de cómo tratar las peticiones asíncronas, que a su vez sincronizan las bases de datos locales, por ejemplo:

En los indicadores la función CopyTicks() devuelve el resultado inmediatamente: Cuando se llama desde un indicador, CopyTick() devolverá inmediatamente los ticks disponibles por símbolo, y también comenzará a sincronizar la base de datos de ticks si no hay suficientes datos. Todos los indicadores de un símbolo trabajan en un hilo común, por lo que el indicador no tiene derecho a esperar a que se complete la sincronización. Una vez completada la sincronización, la siguiente llamada a CopyTicks() devolverá todos los ticks solicitados. La función OnCalculate() en los indicadores se llama después de cada tick entrante.


La frase clave es"Tras finalizar la sincronización, la siguiente llamada a CopyTicks() devolverá todos los ticks solicitados". ", señores ¿cómo se sabe cuando la sincronización ha terminado? Está escrito como si antes del final de la sincronización CopyTicks() devolviera por ejemplo -1, pero no es así.Como resultado después de unas cuantas recargas la DB del indicador se sincroniza y realmente estamos obteniendo todo el conjunto de datos, pero si no estoy recargando el indicador no estoy obteniendo este conjunto de datos, porque no sé el resultado de terminar esta maldita sincronización.

Un ejemplo llamativo fueron los últimos golpes, hubo un movimiento brusco en el EURUSD, aunque el indicador estuvo encendido todo ese tiempo y más o menos representó este periodo con normalidad, pero después de que lo recargara (cambié los parámetros de entrada), el indicador empezó a reflejar la información de forma incorrecta, respectivamente se iniciaron búsquedas de errores en el indicador (se recompiló y se recargó varias veces) pero nada ayudó, y entonces ocurrió ese "milagro", "Cuando sellama a CopyTick() desde un indicador, éste devuelve inmediatamente los ticks disponibles para el símbolo, y además inicia la sincronización de la base de ticks", tal vez habría que crear (o tener) una función que nos diga que en ese momento no se ha completado la sincronización de la base de datos local, esta función nos facilitaría la tarea y nos permitiría escribir un mejor producto final para el Mercado.

P.D.: La función SymbolInfoTick lamentablemente no tiene esta funcionalidad.

 

Por desgracia, este ejemplo no siempre funciona:

//--- запросим тиковую историю с момента 1970.01.01 00:00.001 (параметр from=1 ms) 
      int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks); 
      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); 
        } 

Para ser exactos, funciona 1-2 veces de cada 10.

Pero en la situación descrita anteriormente, no funcionó ni una sola vez.

 

De nuevo una pregunta, ¿se actualiza la base de datos en tiempo real?

Como escribí anteriormente, todo el período que fue problemático, el indicador funcionó, es decir, la función CopyTicks() fue llamada regularmente, pero resulta que no tuvo ningún efecto en la base de datos local.... Esto es raro....

 
Unicornis:

En 2008-2009, Renat escribió una vez que no hay felicidad en las garrapatas, poniendo el ejemplo de un experto. Las garrapatas se saltan tal cual. Si es necesario, obtengahttps://www.mql5.com/ru/docs/series/copyticks en cada llamada, pero aún así se perderá el 50/50 de la parte superior/baja en la que desea entrar.

Quién no lo hace, y quién lo necesita :) para tener datos reales, en particular las garrapatas.
 
Farkhat Guzairov:

Reanudación de las cuestiones relacionadas con la optimización y la carga de datos históricos.

1. El problema del funcionamiento correcto de las funciones iClose/iOpen, y en este caso iTime, probablemente existe y no hay razón para esperar que todo sea perfecto. ¿Quizás se puedan eliminar simplemente de MQL5 para no repetir los mismos errores? (Tengo un problema, pero no tengo tiempo de describirlo, porque he encontrado una solución, otro "giro")

Quizás haya una solución, pero me gustaría que estuviera documentada y no fuera otra vuelta de tuerca de la comunidad MQL5. Estamos hablando de cómo tratar las peticiones asíncronas, que a su vez sincronizan las bases de datos locales, por ejemplo:

En los indicadores la función CopyTicks() devuelve el resultado inmediatamente: Cuando se llama desde un indicador, CopyTick() devolverá inmediatamente los ticks disponibles por símbolo, y también comenzará a sincronizar la base de datos de ticks si no hay suficientes datos. Todos los indicadores de un símbolo trabajan en un hilo común, por lo que el indicador no tiene derecho a esperar a que se complete la sincronización. Una vez completada la sincronización, la siguiente llamada a CopyTicks() devolverá todos los ticks solicitados. La función OnCalculate() en los indicadores se llama después de cada recepción de ticks.


La frase clave es"Tras finalizar la sincronización, la siguiente llamada a CopyTicks() devolverá todos los ticks solicitados". ", señores ¿cómo se sabe cuando la sincronización ha terminado? Está escrito como si antes del final de la sincronización CopyTicks() devolviera por ejemplo -1, pero no es así.Como resultado después de unas cuantas recargas la DB del indicador se sincroniza y realmente estamos obteniendo todo el conjunto de datos, pero si no estoy recargando el indicador no estoy obteniendo este conjunto de datos, porque no sé el resultado de terminar esta maldita sincronización.

Un ejemplo llamativo fueron los últimos golpes, hubo un movimiento brusco en el EURUSD, aunque el indicador estuvo encendido todo ese tiempo y más o menos representó este periodo con normalidad, pero después de que lo recargara (cambié los parámetros de entrada), el indicador empezó a reflejar la información de forma incorrecta, respectivamente se iniciaron búsquedas de errores en el indicador (se recompiló y se recargó varias veces) pero nada ayudó, y entonces ocurrió ese "milagro", "Cuando sellama a CopyTick() desde un indicador, éste devolverá inmediatamente los ticks disponibles para el símbolo, y además comenzará a sincronizar la base de ticks", tal vez habría que crear (o tener) una función que nos diga que en ese momento no se ha completado la sincronización de la base de datos local, esta función nos facilitaría la tarea y nos permitiría escribir un mejor producto final para el Mercado.

P.D.: La función SymbolInfoTick lamentablemente no tiene esta funcionalidad.

¿Qué devuelve SERIES_SYNCHRONIZED en estos casos?