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

 
Renat Fatkhullin:

Por favor, muéstrame el código de referencia del indicador, que siempre mantiene los últimos 2000 ticks de cada símbolo de Market Watch.

De lo contrario, se obtienen conjeturas por un lado y sólo recomendaciones en forma de palabras por el otro.

 
Renat Fatkhullin:

Tengo que mirar el código.

El código anterior tiene claramente un montón de problemas lógicos y de recursos.

Estoy haciendo algo así, por favor aconsejar cómo y qué ajustar si es necesario:

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
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      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

Tengo que mirar el código.

El código anterior tiene claramente un montón de problemas lógicos y de recursos.

¿Hay algún problema lógico en este código, o me estoy perdiendo algo?

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

MQL5 Error en el acceso a las series temporales iClose/iOpen, etc.

Stanislav Dray, 2018.11.14 16:28

Su actitud ante los informes de errores es extraña. No es que me paguen para demostrar nada. He expuesto la situación lo mejor que he podido.

No soy el único con el problema, el problema apareció después de tu 30ª actualización, pero aun así insinúas que soy un tonto y culpas a unos indicadores retrasados.

¿No fueron lentos durante un año antes de eso?

Aquí hay un ejemplo de código que se cuelga 25 minutos después del inicio en M30:

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

Debe escribir el indicador teniendo claro que no lo conseguirá todo a la vez.

En OnInit se debe estimular la carga del historial de instrumentos necesarios mediante llamadas individuales de CopyXXX, pero hay que esperar a la inicialización completa en OnCalculate.

Su fase de inicialización parece tener un error - está esperando datos incorrectamente y se bloquea.

Intentaré hacerlo,

Ahora hago peticiones a OnCalculate y espero allí (no cada tick, por supuesto, sino sólo la primera vez que se calcula).

 
fxsaber:

Por favor, muéstrame el código de referencia del indicador, que siempre mantiene los últimos 2000 ticks de cada símbolo de Market Watch.

No estoy seguro de cómo utilizarlo, pero estoy seguro de que tengo derecho a utilizarlo.

¡Estoy de acuerdo! No es mejor ni para las garrapatas, sino para los bares.

Necesita un ejemplo de un Código Multidivisa Verdadero Aprobado.

De lo contrario, seguiremos en la oscuridad...

 

Intentaré localizar el error e informaré cuando lo encuentre

 
transcendreamer:

¡Estoy de acuerdo! Mejor ni garrapatas, sino barras.

Necesitamos un ejemplo de un Código Multidivisa Verdadero Aprobado.

Si no, seguiremos en la oscuridad...

Las barras y los ticks son epistasis diferentes que viven en MT5 de forma independiente.
 
Vladimir Karputov:

También se ha recomendado siempre que si se trabaja con el marco temporal de otra persona, se obtenga el OHLC de ese marco temporal una vez por minuto (cualquier función CopyXXXX). Esto siempre ha sido así.

Ya tenía ganas de escupir sobre todo lo que está pasando aquí, pero desgraciadamente me he pasado unos 10 años con el producto MQ.

Ahora es todo negocio. Vladimir su consejo sobre el uso de las funciones CopyXXXX fue utilizado por mí, porque no era ninguna dificultad desde el punto de vista de mi código escrito no profesional.

Sinceramente quería que el problema estuviera sólo en mis manos torcidas, pero no el problema no está sólo en ellas. Tengo una captura de pantalla a continuación, anticipando extrañas explicaciones del soporte técnico diciendo que he codificado mal y otros 100500 indicadores, así que qué queréis, habrá problemas. No tengo 100500 otros indicadores, no hay ningún experto, sólo tengo dos herramientas abiertas en el terminal, la prueba del indicador se ejecuta en EURUSD 1M, el indicador llama a los datos de M15 marco de tiempo de la misma herramienta, no estoy tratando de cargar otros datos de los símbolos, sólo hay unos pocos de ellos en la revisión del mercado.

Es una situación ideal para el terminal en términos de carga, que por supuesto no será el caso en condiciones de trabajo, pero incluso en este caso hay un problema y en mi opinión este problema se llama "BAG".

En el indicador las funciones iClose e iBars son llamadas sólo para reflejar el estado en Commet(). En la revisión del mercado en el momento de la creación de la captura de pantalla, el estado actual de la llamada a las funciones iClose e iBars está en la ventana del terminal, además la parte de cálculo del indicador utiliza la función CopyXXXX.

BOLSA

Como puede ver, el indicador se recargó a las 16:31 y funcionó con éxito (incluso me estaba poniendo contento), pero la actualización de datos de iClose se detuvo después de las 00:15, respectivamente la función CopyXXXX tampoco devuelve datos actualizados, es decir, el error se produce en algún lugar en las profundidades de MT.

En mi opinión, hay un fallo al leer los datos desde el servidor, las razones pueden ser masivas (no hay internet, el servidor estaba ocupado, etc.), pero por qué la reanudación del trabajo después de eliminar las causas de la comunicación no sucede, por lo que concluyo que usted puede probar el código fuente de los usuarios todo lo que quieras, pero si usted tiene un servidor de al lado, este problema nunca se identificará, y existe y no se produce sólo por la mala mano codificador.

 

También decidí probar el código de Stanislav ayer. Después de unas horas, la actualización de la hora se detuvo. No cambié de marco temporal, simplemente lo actualicé a través del menú contextual del gráfico y el tiempo siguió su curso.

Hoy he modificado un poco el código, para vigilar también el tiempo de la franja horaria actual.

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

En 15 minutos dejó de actualizarse en el marco temporal "no nativo", pero con el marco temporal actual se actualizaba normalmente. Después de refrescar el gráfico el tiempo ha vuelto a empezar.

El terminal está funcionando en modo portátil. El sistema y el propio terminal se encuentran en un disco SSD.


 

No sé qué ha pasado, pero cuando escribí el bot para el último Campeonato MQ en MQL5, era multidivisa y no noté ningún problema con la carga de datos de otros instrumentos.

Puede que consumiera muchos recursos, pero daba el resultado esperado, y no un juego de ruleta como ahora.

Este problema, por ejemplo como desarrollador de productos comerciales para MQL5, no me va a caracterizar de muy buena manera y será doblemente desagradable si una persona paga por un producto comprado en el Market y sólo se ve con fallos por culpa de esos "BOGS".