Errores, fallos, preguntas - página 1988

 
Andrey Dik:


Así es, hay, aquí están:

2017.09.05
2017.09.05 11:42:04:04 Se ha limpiado el registro del registrador
2017.09.05 2017.09.05 00:00:00.000 Servidor MetaTester 5 detenido

No hay nada más allá.

Entonces, ¿por qué no hay información completa de Print() en los registros del probador?

Espacio libre en el disco. Los registros se borran si quedan menos de 500 megas en el disco
 
Slava:
Libera espacio en el disco. Los registros se borran si el espacio en disco es inferior a 500 megas

¿Cómo se limpian? ¿Dónde puedo encontrar información sobre el algoritmo de limpieza? ¿Dónde está el mensaje de que se han limpiado los registros?

¿Cómo trabajar con el programa si no hace lo que se espera de él? - Estamos hablando de MT5 también, no sólo de Expert Advisor.

En mi ejemplo concreto podemos ver en los registros que los ticks se saltan. ¿Qué debe pensar un usuario en este caso? ¿Qué pensamientos puros y brillantes pueden surgir sin que el lenguaje soez los empañe?

 

En el modo visual del comprobador, se memoriza la posición del deslizador de velocidad. Una vez lo puse al máximo. Entonces ejecuto un EA pesado - el visualizador se cuelga.

Tengo que hacer un EA ficticio y ejecutarlo en el visualizador y mover el deslizador un poco hacia atrás. Un EA pesado no se cuelga después de eso.

¿Es posible fijar la posición del deslizador por adelantado (como en MT4)?

 

Durante una única ejecución sin visualización, ejecuto un Asesor Experto que realiza muchas operaciones, obstruyendo el registro con los mensajes correspondientes (al propio probador le gusta emitirlos). Después de la prueba retrospectiva (o inmediatamente después de pulsar Stop) cambio a la pestaña Log y veo que los registros siguen apareciendo. Esta es la primera tontería, ya que el backtest ha terminado, ¿por qué no mostrar el final de los registros?

No me interesan los registros y hago clic en "Eliminar registros". Después de lo cual el registro se borra y... ¡sigue llenándose de discos viejos!

 
Andrey Dik:

¿Cómo se limpian? ¿Dónde puedo encontrar información sobre el algoritmo de limpieza? ¿Dónde está el mensaje de que se han limpiado los registros?

¿Cómo trabajar con el programa si no hace lo que se espera de él? - Estamos hablando de MT5 también, no sólo de Expert Advisor.

En mi ejemplo particular, se puede ver en los registros que los ticks se saltan. ¿Qué debe pensar un usuario en este caso? ¿Qué pensamientos puros y brillantes pueden surgir sin que el lenguaje soez los empañe?

Nunca has mirado los registros del agente probador.

El mensaje sobre la limpieza de los registros es el que tú mismo has mostrado.

Si analiza los registros del probador, entonces se le considera a priori un usuario experto. Un mago debe vigilar siempre su herramienta. El Explorador de Windows siempre muestra en rojo una unidad con poco espacio libre

Por cierto, aunque tenga un indicador de la presión de los neumáticos en el salpicadero, esto no anula en absoluto la inspección visual del vehículo antes de conducir.

 
fxsaber:

Durante una única ejecución sin visualización, ejecuto el Asesor Experto, que realiza muchas operaciones, llenando el registro con los mensajes apropiados (al propio probador le gusta emitirlos). Después de la prueba retrospectiva (o inmediatamente después de pulsar Stop) cambio a la pestaña Log y veo que los registros siguen apareciendo. Esta es la primera tontería, ya que el backtest ha terminado, ¿por qué no mostrar el final de los registros?

No me interesan los registros y hago clic en "Eliminar registros". Después de lo cual el registro se borra y... ¡sigue llenándose de discos viejos!

Sí, es una buena idea desactivar la salida al registro durante una prueba sin visualización. Lo más frecuente es que sólo quiera ver el resultado final (beneficio, tiempo de prueba, etc.), que se muestra al final.

Los detalles durante la prueba se pueden ver en el modo de visualización. No tiene sentido verter esta "pila" de forma reactiva sin visualizarla.

 
Alexey Kozitsyn:

Aquí está el código de prueba si te interesa.

Creo que he encontrado la causa y una solución temporal a este problema. Me resulta difícil explicar cómo ocurre, pero parece que el buffer de color interfiere y lo desordena todo.


Esto es lo que cambié en el código fuente y el problema desapareció

#property indicator_separate_window
#property indicator_plots 3
#property indicator_buffers 4
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input bool inpUseArrows=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double bufGisto[];
double bufGistoColor[];
double bufArrowUp[];
double bufArrowDn[];
//---
const double EMPTY=EMPTY_VALUE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Размечаем массив цветов
   color colors[2];
   colors[ 0 ]= clrLime;
   colors[ 1 ] = clrRed;
//--- Устанавливаем параметры графических серий
//   SetPlotParametersColorHistogram(0,0,bufGisto,bufGistoColor,false,"test gisto",colors,EMPTY,2);
   SetPlotParametersColorHistogram(2,2,bufGisto,bufGistoColor,false,"test gisto",colors,EMPTY,2);
//--- Проверяем, нужно ли отображать объемы
//   if(inpUseArrows) // Если отображать нужно
//     {
//      SetPlotParametersArrow(1,2,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
//      SetPlotParametersArrow(2,3,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
      SetPlotParametersArrow(0,0,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
      SetPlotParametersArrow(1,1,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
//     }
//---
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(inpUseArrows)
     {
      ArrayInitialize(bufArrowUp,EMPTY);
      ArrayInitialize(bufArrowDn,EMPTY);
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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(prev_calculated==0)
     {
      ArrayInitialize(bufGisto,EMPTY);
      //---
      if(inpUseArrows)
        {
         ArrayInitialize(bufArrowUp,EMPTY);
         ArrayInitialize(bufArrowDn,EMPTY);
        }
      //---
      for(int i=0; i<rates_total; i++)
        {
         bufGisto[i]=(open[i]-close[i])/_Point;
         bufGistoColor[i]=(bufGisto[i]<0) ? 1 : 0;
         //---
/*         if(inpUseArrows)
           {
            if(bufGisto[i]>20)
               bufArrowDn[i]=bufGisto[i];
            else if(bufGisto[i]<-20)
               bufArrowUp[i]=bufGisto[i];
           }
*/
         if(inpUseArrows)
           {
            if(bufGisto[i]>20)
               bufArrowDn[i]=bufGisto[i];
             else bufArrowDn[i] = EMPTY;
             
             if(bufGisto[i]<-20)
               bufArrowUp[i]=bufGisto[i];
             else bufArrowUp[i] = EMPTY;
           }
        }
     }
   else if(rates_total>prev_calculated)
     {
      bufGisto[rates_total-1]=EMPTY;
      //---
      if(inpUseArrows)
        {
         bufArrowUp[ rates_total-1 ] = EMPTY;
         bufArrowDn[ rates_total-1 ] = EMPTY;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Параметры графического построения: цветная гист-а от 0 линии                |
//+------------------------------------------------------------------+
void SetPlotParametersColorHistogram(const int plotIndex,// Индекс графической серии
                                     const int bufferNum,// Номер первого буфера серии
                                     double& value[],                              // Буфер значений
                                     double& clr[],                                 // Буфер цветов
                                     const bool asSeries,                           // Флаг нумерации как в таймсерии
                                     const string label,                           // Имя серии
                                     const color& colors[],                        // Цвета линии
                                     const double emptyValue = EMPTY_VALUE,         // Пустые значения серии
                                     const int width = 0,                           // Толщина линии
                                     const ENUM_LINE_STYLE style = STYLE_SOLID,      // Стиль линии
                                     const int drawBegin = 0,                        // Количество баров без отрисовки
                                     const int shift=0                           // Сдвиг построения в барах
                                     )
  {
//--- Привязываем буферы
   SetIndexBuffer(bufferNum,value,INDICATOR_DATA);
   SetIndexBuffer(bufferNum+1,clr,INDICATOR_COLOR_INDEX);
//--- Устанавливаем порядок нумерации в массивах-буферах
   ArraySetAsSeries(value,asSeries);
   ArraySetAsSeries(clr,asSeries);
//--- Устанавливаем тип графического построения
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
//--- Устанавливаем имя графической серии
   PlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферах
   PlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем количество цветов индикатора
   const int size=ArraySize(colors);
   PlotIndexSetInteger(plotIndex,PLOT_COLOR_INDEXES,size);
//--- Устанавливаем цвета индикатора
   for(int i=0; i<size; i++)
      PlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,i,colors[i]);
//--- Устанавливаем толщину линии
   PlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем стиль линии
   PlotIndexSetInteger(plotIndex,PLOT_LINE_STYLE,style);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindow
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барах
   PlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
  }
//+------------------------------------------------------------------+
//| Параметры графического построения: стрелки                                                          |
//+------------------------------------------------------------------+
void SetPlotParametersArrow(const int plotIndex,// Индекс графической серии
                            const int bufferNum,// Номер первого буфера серии
                            double &value[],// Буфер значений
                            const bool asSeries,// Флаг нумерации как в таймсерии
                            const string label,// Имя серии
                            const double emptyValue=EMPTY_VALUE,// Пустые значения серии
                            const color clr=clrRed,// Цвет стрелок
                            const int arrowCode= 159,// Код стрелок
                            const int arrowShift = 0,// Сдвиг стрелок по вертикали
                            const int width=0,// Толщина стрелок
                            const int drawBegin=0,// Количество баров без отрисовки
                            const int shift=0                     // Сдвиг построения в барах
                            )
  {
//--- Привязываем буферы
   SetIndexBuffer(bufferNum,value,INDICATOR_DATA);
//--- Устанавливаем порядок нумерации в массивах-буферах
   ArraySetAsSeries(value,asSeries);
//--- Устанавливаем тип графического построения
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_ARROW);
//--- Устанавливаем имя графической серии
   PlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферах
   PlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем цвет индикатора
   PlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,0,clr);
//--- Устанавливаем код стрелок
   PlotIndexSetInteger(plotIndex,PLOT_ARROW,arrowCode);
//--- Устанавливаем смещение стрелок по вертикали
   PlotIndexSetInteger(plotIndex,PLOT_ARROW_SHIFT,arrowShift);
//--- Устанавливаем толщину стрелок
   PlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindow
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барах
   PlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
  }
//+------------------------------------------------------------------+
  1. Poner el índice DRAW_COLOR_HISTOGRAM "al final" para que INDICATOR_COLOR_INDEX sea el último.
  2. Si el búfer no se va a rellenar con un valor, debe rellenarse con PLOT_EMPTY_VALUE
 

¿Por qué hace esto el probador?

2017.09.05 10:42:53.349 Tester  Experts\fxsaber\TesterBenchmark_Example.ex5 on EURUSD,M1 from 2017.08.01 00:00 to 2017.09.05 00:00
2017.09.05 10:42:53.349 Tester  EURUSD: history data begins from 1981.01.02 00:00
2017.09.05 10:42:53.349 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2017.09.05 10:42:53.349 Tester  EURUSD: "bases\MetaQuotes-Demo\ticks\EURUSD\201709.tkc" download
2017.09.05 10:42:59.389 Tester  EURUSD: "bases\MetaQuotes-Demo\ticks\EURUSD\201708.tkc" download (370.48 Kb/sec)
2017.09.05 10:43:12.450 Tester  EURUSD: 71% ticks downloaded (356.63 Kb/sec)
2017.09.05 10:43:20.488 Tester  EURUSD: 94% ticks downloaded (338.89 Kb/sec)
2017.09.05 10:43:22.491 Tester  EURUSD: preliminary downloading of history ticks completed, 10.01 Mb in 0:29.141 (351.80 Kb/sec)
2017.09.05 10:43:22.491 Tester  EURUSD: ticks data begins from 2017.08.01 00:00
2017.09.05 10:43:22.491 Tester  complete optimization started
2017.09.05 10:43:22.491 Tester  size of initial task batch is 6
2017.09.05 10:43:22.521 Core 1  agent process started
2017.09.05 10:43:23.094 Core 1  connecting to 127.0.0.1:3000
2017.09.05 10:43:23.094 Core 1  connected
2017.09.05 10:43:23.103 Core 1  authorized (agent build 1653)
2017.09.05 10:43:23.114 Core 1  common synchronization completed
2017.09.05 10:43:23.388 Core 1  EURUSD: history for 2016 year synchronized
2017.09.05 10:43:23.388 Core 1  EURUSD: history for 2017 year synchronized
2017.09.05 10:43:23.388 Core 1  EURUSD: history synchronization completed [54 Kb]
2017.09.05 10:43:23.388 Core 1  EURUSD: 54.96 Kb of history processed in 0:00.234
2017.09.05 10:43:23.402 Core 1  pass 0 tested with error "cannot synchronize history (EURUSD)" in 0:00:00.047
2017.09.05 10:43:23.404 Core 1  pass 1 tested with error "task rejected by tester agent" in 0:00:00.000
 
Slava:

1. Nunca ha mirado los registros del agente de pruebas.

El mensaje sobre el borrado del registro es el que tú mismo has mostrado.

2. Si está analizando los registros del probador, a priori se le considera un usuario experto. Un mago debe vigilar siempre su herramienta. El Explorador de Windows siempre muestra en rojo una unidad con poco espacio libre

Por cierto, aunque el salpicadero tenga un indicador de la presión de los neumáticos, esto no anula en absoluto la inspección visual del vehículo antes de conducirlo.

1. Nunca he tenido que hacerlo porque no era necesario: los registros de los probadores siempre mostraban lo que se esperaba.

2. ¿A quién le importa lo que muestra el explorador de Windows? Trabajamos en MT5 y sólo tiene que decirle al usuario que no hay suficiente memoria (o cualquier otra razón que no permita trabajar normalmente).

Sí, la razón fue que el espacio libre era inferior a 500 mb y no sólo los registros se imprimieron completamente sin saltos, sino que los lags desaparecieron durante la prueba (no está claro por qué se producen lags si los registros se imprimen de todos modos independientemente de la prueba). Pero, ¿cómo sabe el usuario que necesitamos al menos 500Mb? ¿Por qué no 2Mb, 100Mb, 100500Gb? - El agente/probador debe mostrar mensajes sobre los problemas que interfieren con el funcionamiento normal.

Y, sólo tiene que haber una opción de lo que la salida al registro.

 
Alexey Viktorov:

Creo que he encontrado la causa y una solución temporal a este problema. Me resulta difícil explicar cómo sucede esto, pero parece que el buffer de color está interfiriendo y desordenando todo.


Esto es lo que cambié en el código fuente y el problema desapareció

  1. Poner el índice DRAW_COLOR_HISTOGRAM "al final" para que INDICATOR_COLOR_INDEX sea el último.
  2. Si el búfer no se va a rellenar con un valor, debe rellenarse con PLOT_EMPTY_VALUE
No funcionó:) Ok, no es necesario adivinar, tenemos que obtener una respuesta de la SD. De todos modos, ¡esas muletas no deberían ser aceptables!