Errores, fallos, preguntas - página 3028

 
fxsaber:
Una unión con un solo campo es algo extraño.

Esto es lo mismo que la estructura - sólo que el error es más obvio. Incluso está escrito en la documentación al respecto:"De lo contrario, la unión se comporta como una estructura".

Union\char también es extraño, y también para la claridad, pero puede ser reescrito:

union X3 { //(3) Error: 'X2' - struct is too large
        char x31[INT_MAX/2+1];
        int  x32[INT_MAX/8+1];
};
Así que tampoco le parece extraño a nadie.
 
Andrey Dik:

piénsalo de nuevo.

Tienes que pensar, Andrei. Es en su código donde están las cucarachas.

Bueno, hoy estoy tan inclinado... Trataré de empujar en la dirección correcta:

Se ha abierto una nueva barra... iBars() ha aumentado en uno...... Pero el número de barras contadas no ha cambiado. Y no cambiará hasta que recalcule esta nueva barra...

¿Qué es lo siguiente?

 
Igor Makanu:

esto no debería funcionar correctamente en los indicadores:

si no me equivoco, en la ayuda hay un desglose del script para paginar los datos de todos los TFs y debería haber una advertencia de que no se pueden pedir datos históricos al indicador de esta manera, porque el indicador trabaja de forma asíncrona

y se recomienda utilizar BarsCalculated() una vez que se haya vinculado la manija


UPD: script para la paginación del historial y explicación de por qué no funciona en los indicadores:https://www.mql5.com/ru/docs/series/timeseries_access

¿está seguro de que entiende el significado del código?

 
Alexey Viktorov:

Tienes que pensar, Andrei. Es en su código donde hay cucarachas.

Bueno, hoy estoy tan inclinado... Trataré de empujar en la dirección correcta:

Se ha abierto una nueva barra... iBars() ha aumentado en one...... Pero el número de barras contadas no ha cambiado. Y no cambiará hasta que recalcule esta nueva barra...

¿Qué es lo siguiente?

mi buen hombre, por favor no me escriba, usted no está al tanto.

O demuéstralo con un código.

 
Andrey Dik:

¿está seguro de que entiende el significado del código?

Con una alta probabilidad - segura y entendida

Quiere que el indicador sincronice el "TF superior" antes de llamar a otro indicador

mi indicador funciona, ¿verdad? - puedes añadirle BarsCalculated() - pero como en los ejemplos de indicadores de la entrega, por ejemplo MACD.mql5


HH: hay muchos indicadores multitimeframe en QB. Si necesito recordar qué hacer y cómo hacerlo, suelo buscar indicadores de Mladen Rakic y revisar los suyos, el estilo de codificación es peculiar (más correctamente el formato), pero son 100% funcionales

https://www.mql5.com/ru/users/mladen

 
Andrey Dik:

Querida. Por favor, no me escribas, no estás al tanto.

O pruébalo con un código.

Bueno, entonces, ufano de ti...

Los desarrolladores no responden a esas tonterías, Igor se aburrirá pronto... Y quédate a hablar solo...

Sólo pide a Drummer que traslade tus desahogos a un hilo aparte... para no saturar el adecuado...

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Andrey Dik, 2021.05.28 05:16

Estoy tratando de comprobar la sincronización de datos en el marco de tiempo solicitado (M5) y la preparación del indicador en él, si no está listo, voy a salir.

Como resultado, el indicador funciona sólo una vez en la apertura de la barra M1, y no en cada tick:


//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

//проверка на наличие нового бара
if (rates_total == prev_calculated) return rates_total;

Espero que los desarrolladores escuchen mis ruegos.

No entiendo bien su código. ¿Qué debería ocurrir después de "return 0;" en la siguiente llamada a OnCalculate?
 
Alexey Viktorov:

Igor pronto se aburrirá también...

Sólo tengo el deseo de entender

en MT5 hay un montón de trampas con la sincronización, ahora la pregunta es sobre eso también

imho, si el indicador utiliza construcciones en cada barra (líneas, no flechas)

este ciclo es suficiente para el cálculo económico:

for(int i = prev_calculated; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }

si hay la primera llamada, entonces prev_calculado será = 0, en las siguientes llamadas se recalcularán las nuevas barras


y si ambos indicadores están escritos correctamente, no es necesario sincronizar nada adicionalmente, todo funcionará, lo único que queda es comparar CopyBuffer() con el número de valores requerido del indicador llamado

 
Igor Makanu:

Sólo quiero descubrirlo.

en MT5 hay muchas trampas con la sincronización, ahora la pregunta es sobre eso también

imho, si el indicador utiliza una construcción en cada barra (líneas, no flechas)

este ciclo es suficiente para el cálculo económico:

si hay la primera llamada, entonces prev_calculado será = 0, en las siguientes llamadas se recalcularán las nuevas barras


y si ambos indicadores están escritos correctamente, no es necesario sincronizar nada adicionalmente, todo funcionará, lo único que queda es comparar CopyBuffer() con el número de valores requerido del indicador llamado

Eso es lo que quiero decir. Estaría bien tratar de sincronizar antes de la primera ejecución, pero de esta manera............

 
Igor Makanu:

Sólo quiero descubrirlo.

en MT5 hay muchas trampas con la sincronización, ahora la pregunta es sobre eso también

imho, si el indicador utiliza una construcción en cada barra (líneas, no flechas)

este ciclo es suficiente para el cálculo económico:

si hay la primera llamada, entonces prev_calculado será = 0, en las siguientes llamadas se recalcularán las nuevas barras


y si ambos indicadores están escritos correctamente, no es necesario sincronizar nada adicionalmente, todo funcionará, lo único que queda es comparar CopyBuffer() con el número de valores requerido del indicador llamado

si quieres entender y no oponerte, deberías escribir algo como el código de abajo:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double         IBuffer[];

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   return(INIT_SUCCEEDED);
}

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[])
{
   if (rates_total == prev_calculated) return rates_total;
   
   ulong t = GetMicrosecondCount ();
   
   ArraySetAsSeries (high,        true);

   int limit = rates_total - prev_calculated - 1;

   for (int i = limit; i >= 0; i--)
   {
      IBuffer [i] = high [i];
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, рассчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

//--- plot I
#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input ENUM_TIMEFRAMES  OldTF = PERIOD_M5;

double IBuffer[];
int    Handle = 0;

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   Handle = iCustom (Symbol (), OldTF, "OldTF.ex5");
   if (Handle == INVALID_HANDLE)
   {
      Print ("Не удалось получить хендл индикатора OldTF.ex5");
      return INIT_FAILED;
   }

   return INIT_SUCCEEDED;
}

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[])
{
   if (rates_total == prev_calculated) return rates_total;

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

   ulong t = GetMicrosecondCount ();

   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);
}

compilar ambos códigos y ejecutar el segundo. obtener algo como esto en los registros cuando se ejecuta en M1 y M3 del indicador superior:

2021.05.28 19:05:01.408 OldTF (EURUSD,M3) 0.000234 seg, 50000 barras calculadas, 50000 barras en total

2021.05.28 19:05:03.860 LitTF (EURUSD,M1) 0.007452 seg, 50023 barras calculadas, 50023 barras en total

2021.05.28 19:06:00.670 OldTF (EURUSD,M3) 0.000001 seg, calculado 1 bar, total de bares 50001

2021.05.28 19:06:02.211 LitTF (EURUSD,M1) 0.008180 seg, 50024 barras calculadas, 50024 barras en total

2021.05.28 19:07:00.780 LitTF (EURUSD,M1) 0.000004 seg, calculado 1 barra, total de barras 50025

2021.05.28 19:08:01.246 LitTF (EURUSD,M1) 0.000014 seg, liquidado 1 barra, total de barras 50026

2021.05.28 19:09:00.959 OldTF (EURUSD,M3) 0.00000014 seg, calculado 1 compás, total de compases 50002

2021.05.28 19:09:01.775 LitTF (EURUSD,M1) 0.006898 seg, 50027 barras calculadas, 50027 barras totales

2021.05.28 19:10:00.830 LitTF (EURUSD,M1) 0.000004 seg, calculado 1 bar, total de bares 50028

incluso a simple vista se puede ver, en primer lugar, la forma más rápida posible de construir indicadores rápidos, y en segundo lugar, que el precalculo se pone a cero

En este ejemplo, el indicador se ve obligado a recalcularse completamente en cada nueva barra M3.

Alexey Viktorov:

Bueno, no tienes que hacerlo.

Los desarrolladores no responden a esas tonterías, Igor pronto se aburrirá también... Y quédate a hablar solo...

Sólo hay que pedirle a drubashka que traslade sus desahogos a un hilo aparte para no saturar el de la derecha...

Mira el código de arriba, cómete el pasaporte, espolvorea cenizas sobre tu cabeza y métete tu arrogancia donde nadie pueda verla.

Razón de la queja: