Erros, bugs, perguntas - página 1988

 
Andrey Dik:


É verdade, há, aqui estão eles:

2017.09.05
2017.09.05 11:42:04:04 O diário de bordo foi limpo
2017.09.05 2017.09.05 00:00:00.000 Server MetaTester 5 parado

Não há mais nada lá fora.

Então porque não existe informação completa de impressão() nos registos do testador?

Espaço livre no disco. Os registos são apagados se restarem menos de 500 megas no disco
 
Slava:
Libertar espaço em disco. Os registos são apagados se o espaço em disco for inferior a 500 megabytes

Como são limpas? Onde posso obter informações sobre o algoritmo de limpeza? Onde está a mensagem de que os registos foram limpos?

Como trabalhar com o programa se ele não faz o que se espera dele? - Estamos também a falar de MT5, e não apenas de Expert Advisor.

No meu exemplo específico, podemos ver nos registos que as carraças são ignoradas. O que é que um utilizador deve pensar neste caso? Que pensamentos puros e brilhantes podem surgir sem ser encobertos por uma linguagem grosseira?

 

No modo visual do testador, a posição do controlo de velocidade é memorizada. Uma vez, fixei-o no máximo. Depois, tenho um EA pesado - o visualizador fica pendurado.

Tenho de fazer um EA fictício e pô-lo a funcionar no visualizador e mover o selector um pouco para trás. Uma pesada EA não é pendurada depois disso.

É possível definir a posição do cursor com antecedência (como é no MT4)?

 

Durante uma única execução sem visualização, eu dirijo o Expert Advisor, que executa muitas operações, preenchendo o registo com mensagens apropriadas (o próprio testador gosta de as emitir). Após o backtest (ou imediatamente após premir Parar), mudo para o separador Registo e vejo os registos continuarem a ser exibidos. Este é o primeiro disparate, uma vez que o backtest acabou, porque não mostrar o fim dos troncos?

Não estou interessado nos registos e clicar em "Eliminar registos". Depois disso, o tronco é limpo e... continua a encher-se de registos antigos!

 
Andrey Dik:

Como são limpas? Onde posso obter informações sobre o algoritmo de limpeza? Onde está a mensagem de que os registos foram limpos?

Como trabalhar com o programa se ele não faz o que se espera dele? - Estamos também a falar de MT5, e não apenas de Expert Advisor.

No meu exemplo particular, é possível ver nos registos que os carrapatos são saltados. O que é que um utilizador deve pensar neste caso? Que pensamentos puros e brilhantes podem surgir sem ser encobertos por uma linguagem grosseira?

Nunca tinha olhado para os registos do agente testador antes.

A mensagem sobre a limpeza do registo que você mesmo mostrou.

Se analisar os registos do testador, então é a priori considerado um utilizador experiente. Um feiticeiro deve estar sempre de olho na sua ferramenta. O Windows Explorer mostra sempre uma unidade com pouco espaço livre a vermelho

BTW mesmo que tenha um indicador de pressão dos pneus no painel de instrumentos, este não cancela de forma alguma uma inspecção visual do veículo antes de conduzir

 
fxsaber:

Durante uma única execução sem visualização, dirijo um Expert Advisor que executa muitas operações, entupindo o registo com mensagens apropriadas (o próprio testador gosta de as emitir). Após o backtest (ou imediatamente após premir Parar), mudo para o separador Registo e vejo os registos continuarem a ser exibidos. Este é o primeiro disparate, uma vez que o backtest acabou, porque não mostrar o fim dos troncos?

Não estou interessado nos registos e clicar em "Eliminar registos". Depois disso, o tronco é limpo e... continua a encher-se de registos antigos!

Sim, é uma boa ideia desactivar a saída para o registo durante um teste sem visualização. Mais frequentemente só se quer ver o resultado final (lucro, tempo de teste, etc.), que é exibido logo no final.

Os detalhes durante o teste podem ser visualizados no modo de visualização. Não vale a pena despejar reactivamente esta "pilha" sem visualização.

 
Alexey Kozitsyn:

Aqui está o código de teste, se estiver interessado.

Penso ter encontrado a causa e uma solução temporária para este problema. É difícil para mim explicar como acontece, mas parece que o tampão de cor interfere e estraga tudo.


Eis o que eu mudei no código fonte e o problema desapareceu

#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. Colocar índice DRAW_COLOR_HISTOGRAM "no fim" para que INDICADOR_COLOR_INDEX fosse o último.
  2. Se o tampão não deve ser preenchido com um valor, deve ser preenchido com PLOT_EMPTY_VALUE
 

Porque é que o provador faz isto?

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 tinha olhado para os registos do agente testador antes.

A mensagem sobre a limpeza do registo foi mostrada por si mesmo.

2. Se estiver a analisar os registos do testador, é, a priori, considerado um utilizador qualificado. Um feiticeiro deve estar sempre de olho na sua ferramenta. O Windows Explorer mostra sempre uma unidade com pouco espaço livre a vermelho

BTW mesmo que o seu painel de instrumentos tenha um indicador de pressão dos pneus, não cancela de forma alguma uma inspecção visual do veículo antes de conduzir

1. Nunca tive de fazer isto porque não era necessário - os registos dos testadores mostravam sempre o que era esperado.

2. Quem se importa com o que o explorador de janelas mostra? Trabalhamos em MT5 e só tem de dizer ao utilizador que não há memória suficiente (ou qualquer outra razão que não permita trabalhar normalmente).

Sim, a razão era que o espaço livre era inferior a 500mb e não só os troncos apareciam sem saltos, mas também não apareciam atrasos durante os testes (não admira que os atrasos apareçam de todo se os troncos aparecem de qualquer forma, independentemente do teste). Mas como é que o utilizador sabe que precisamos de pelo menos 500Mb? Porque não 2Mb, 100Mb, 100500Gb? - O agente/teste deve exibir mensagens sobre problemas que interferem com o funcionamento normal.

E, só precisa de haver uma escolha do que produzir para o diário de bordo.

 
Alexey Viktorov:

Penso ter encontrado a causa e uma solução temporária para este problema. É difícil para mim explicar como isto acontece, mas parece que o tampão de cor está a interferir e a estragar tudo.


Eis o que eu mudei no código fonte e o problema desapareceu

  1. Colocar índice DRAW_COLOR_HISTOGRAM "no fim" para que INDICADOR_COLOR_INDEX fosse o último.
  2. Se o tampão não deve ser preenchido com um valor, deve ser preenchido com PLOT_EMPTY_VALUE
Não funcionou:) Ok, não há necessidade de adivinhar, precisamos de obter uma resposta do SD. Tais muletas não deveriam ser aceitáveis de qualquer forma!