Por favor, explique qué puede estar mal en esta función. - página 4

 
Alexey Viktorov:

Vladimir, el problema no se produce en el probador... ¿Cómo es que hay tanto problema? ¿O porque sólo hay un Asesor Experto en el probador?

También sugerí en la SD que el único cambio era poner el segundo EA en un par diferente...

Todo el entorno comercial del probador está preparado de antemano. Todo está en un plato. No te preocupes. El entorno comercial real es diferente, en caso de comportamiento no estándar (trabajando en el marco de tiempo de otra persona y/o el símbolo de otra persona) tenemos que preocuparnos por la relevancia del entorno comercial.
 
Karputov Vladimir:
En un terminal (en el marco temporal M15 había EAs) no funcionaba en un símbolo - estoy 99% seguro de que el problema es que cuando se usa el marco temporal de otro se necesita "tirar" del historial todo el tiempo. Creo que es mejor hacerlo mediante CopyTime().
Y CopyRates() se encarga de la historia. Hay tiempo en la estructura...
 
Karputov Vladimir:

Esto no es un error. Estás trabajando en el tiempo de otra persona. En tal caso, usted mismo debe ocuparse de los datos de la agenda de otra persona para asegurarse de que están actualizados.

Personalmente, no veo ninguna alternativa.

No es un hecho que no sepamos cómo funcionaSERIES_LASTBAR_DATE. Puede ser que no haya necesidad de actualizar nada porque el tiempo de la última barra puede ser calculado usando TimeCurrent() del símbolo especificado. Hay que preguntar a los promotores.

Pero hasta ahora un hecho claro e indiscutible es que si dos variables dan verdadero, entonces juntas (al comprobar &&) estas variables también darán verdadero.

 

El problema de la caída de la caché de otras herramientas/TF existe.

Comprobar los errores y esperar en el bucle para cargar no siempre ayuda. Hemos estado hablando con el Servicio de Atención al Cliente, pero MQ no ha hecho ningún progreso, sólo una pista:

Support Team 2016.02.29 11:45

La sospecha es que los datos históricos se descargan por tiempo de espera.

Hay dos soluciones:

1. acceder a los datos con más frecuencia que una vez cada 3 minutos

2. Poner algún indicador muy simple en los datos. El volumen, por ejemplo. No hay cálculo, sólo un búfer está ocupado. La disponibilidad del indicador mantendrá la caché histórica en la memoria independientemente de la frecuencia de acceso

El segundo consejo no funciona, los indicadores son llamados todo el tiempo, pero en algún momento el caché falla y se hace imposible obtener datos.

Andrey Khatimlianskii2016.03.18 13:41

Resolví el problema con esta muletilla - llamo a este código cada 150 segundos para todos los instrumentos/FTs involucrados:

bool CheckTimeSeries( string symbol, ENUM_TIMEFRAMES period )
{
   double array[];
   if ( CopyClose( symbol, period, 1, 1, array ) <= 0 )
   {
                int err = GetLastError();
                Print( " * Can't refresh timeseries (", symbol, ", ", period, ")! ERROR #", err, "!!!" );
                return(false);
   }
   return(true);
}

Funciona bastante rápido, el error 4806 parece desaparecer después de esta actualización.

 

Por favor, comente otro malentendido.

Bars

Devuelve el número de barras en el historial por el símbolo del periodo correspondiente. Hay 2 variantes de la función.


Sólo la segunda opción es interesante.

Solicitar el número de barras en un intervalo determinado
int  Bars(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time        // по какую дату
   );

Texto del Asesor Experto

/*******************Expert initialization function*******************/
int OnInit()
{
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
  datetime dtarr[], date = D'2016.06.22';
  ArraySetAsSeries(dtarr, true);
  CopyTime(_Symbol, PERIOD_D1, 0, 5, dtarr);
  Print(dtarr[0]);
  Print(" ", Bars(_Symbol, PERIOD_D1, date, dtarr[0]));
  Print(" ", Bars(_Symbol, PERIOD_D1, date+1, dtarr[0]));
   
}/*******************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
{
}/*******************************************************************/

Entiendo que la hora 00:00:00 pertenece al día, al igual que la hora 00:00:01

Pero... las impresiones propuestas no están de acuerdo con eso.

2016.06.24 22:18:56.450 TestTime (EURUSD,M15)    2
2016.06.24 22:18:56.450 TestTime (EURUSD,M15)    3
2016.06.24 22:18:56.450 TestTime (EURUSD,M15)   2016.06.24 00:00:00

Resulta que entre el 2016.06.22 00:00:00 y el 2016.06.24 00:00:00 hay tres barras diarias y entre el 2016.06.22 00:01 y el 2016.06.24 00:00:00 sólo hay dos...

¿O estoy entendiendo mal algo?

Archivos adjuntos:
TestTime.mq5  2 kb
 

Y si se añade un segundo al tiempo de la barra actual

  Print(" ", Bars(_Symbol, PERIOD_D1, date, dtarr[0]+1));
  Print(" ", Bars(_Symbol, PERIOD_D1, date+1, dtarr[0]+1));

se obtiene lo siguiente

2016.06.24 22:26:48.602 TestTime (EURUSD,M15)    3
2016.06.24 22:26:48.602 TestTime (EURUSD,M15)    4
2016.06.24 22:26:48.602 TestTime (EURUSD,M15)   2016.06.24 00:00:00

La hora 2016.06.24 00:00:01 parece pertenecer al siguiente bar o ¿qué?

 
El límite de tiempo superior no se incluye en el intervalo en el que se determina el número de barras.
 
Dmitry Fedoseev:
El límite de tiempo superior no se incluye en el intervalo en el que se determina el número de barras.

Dimitri, ¿no es extraño? Ha aparecido una nueva barra, pero no la contaremos todavía.

Escucha, ¿no es la razón de tal comportamiento de la SeriesInfoInteger(_Symbol, PERIOD_D1, SERIES_LASTBAR_DATE); ? Apareció una nueva barra, se ejecuta el código de la garrapata disponible, pero aún no se tiene en cuenta el tiempo...

 

Bueno, el baterista se ha desinflado... Y ha pasado completamente desapercibido...

Vladimir, ¿puedes al menos responder a esta pregunta?

Alexey Viktorov:
¿CopiaRates() tira de la historia? ¿Hay tiempo en la estructura...?
 
Alexey Viktorov:

Bueno, el hombre del saco se ha desinflado... Y ha sido totalmente ignorado...

Vladimir, ¿puedes al menos responder a esta pregunta?

Será mejor que nos diga qué le aconsejaron en el Servicio de Atención al Cliente: ¿no siguió hablando con ellos allí?