Errores, fallos, preguntas - página 3031

 
Igor Makanu:

mi código "martilleará en cada tick" sólo su indicador #1, donde ha escrito :

permitirá que el terminal construya de forma independiente el "marco temporal superior".

Para mí - es "más barato" que realizar un recálculo completo del indicador 1, que sucede en su código al sincronizar el historial en el "TF superior

Sí, pero ¿por qué el restablecimiento previo al fallo está en la TF inferior?

 
Andrey Dik:

Sí, pero, ¿por qué se restablece el kalk prev en la TF inferior?

porque devuelve 0;
 
Andrey Dik:

Sí, pero ¿por qué se restablece el kalk prev en la TF baja?

hay muchas variantes, no conocemos la aplicación


Hubo una discusión similar sobre MT4 el año pasado, uno de los desarrolladores (creo que Slava) dijo, que cada acceso al "TF más antiguo" inicia la sincronización de datos, si se requiere....

Creo, que en MT5 el terminal también construye TF por sí mismo, si es necesario, pero si hubo retrasos en la red o la implementación de ..... es desconocido... entonces el terminal, antes de dar los datos al indicador en un TF superior, sincroniza los datos históricos con el servidor, cuando sucede al instante, y cuando, tal vez, tarda mucho tiempo, es cuando probablemente será pre_calculado = 0

 
Igor Makanu:

hay muchas opciones, no sabemos la aplicación

Si la descarga cambia los datos históricos de la TF baja, el contador de la TF baja será forzado a cero por el terminal, así que no te inventes problemas de la nada

 
Andrey Dik:

estás demostrando mi punto, camarada.

No soy... camarada del codificador. No es una confirmación, es una pista, no devuelva 0. Ese es todo su problema. Tú mismo estás provocando un recálculo completo del indicador.

 


prev_calculado en realidad no aumenta; siempre será el mismo que al final del cálculo

return(rates_total);


es decir, lo que obtenemos al salir de OnCalculated() será devuelto en el siguiente tick en prev_calculated (excepto prev_calculated == 0, el terminal lo hace al lanzar el indicador o sincronizar TF......)


Andrei Trukhanovich:

si la descarga cambia los datos del historial de la TF baja, el contador de la TF baja será puesto a cero de forma forzada por el terminal, no haga problemas de la nada

Le he escrito por segundo día - tome los indicadores de Mladen y estúdielos - funcionan, y sin ninguna sincronización complicada entre TFs, y aquí ... estamos ahorrando recursos y no dejamos que el terminal forme los TFs llamados

 
Andrei Trukhanovich:

sustituir

a

y probarlo.

No lo pidas... De todas formas no se lo creerá.

 
Alexey Viktorov:

Yo... no soy amigo del codificador. Esto no es una confirmación sino una pista, no devuelvas 0. Eso es lo que causa todos tus problemas. Tú mismo estás provocando un recálculo completo del indicador.

Puedes ser un idiota para dar una pista, pero no todo el mundo puede ayudarte a entender y explicar.

 
Andrei Trukhanovich:

sustituir

a

y probarlo.

Gracias, Andrei. Usted es el único que ha penetrado plenamente en la cuestión.

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) El indicador del periodo 3 aún no se ha calculado

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) El indicador del periodo 3 aún no se ha calculado

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 sec, 50046 bars calculados, total 50046 bars

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 seg, 50000 barras calculadas, 50000 barras totales

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) Indicador en el periodo 3 aún no calculado

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 sec, 1 barra calculada, 50047 barras en total

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 seg, calculado 1 compás, total de compases 50001

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 seg, calculado 1 compás, total de compases 50002

Ahora todo funciona como estaba previsto, los indicadores se han calculado completamente sólo una vez en la primera ejecución y, además, sólo una vez por cada nueva barra.


El código final del segundo indicador, espero que le sirva a alguien:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
 
Andrey Dik:

Cualquier tonto puede darte una pista, pero no todo el mundo puede ayudarte a entender y ayudarte en detalle.

Cuenta cuántos tontos te están aconsejando... Sólo un tipo inteligente no oye a nadie y se empecina en...............

Usted ha creado su propio problema y está tratando de presentar su ...código como un error de mql.