Errori, bug, domande - pagina 1988

 
Andrey Dik:


Esatto, ci sono, eccoli qui:

2017.09.05
2017.09.05 11:42:04:04 Il registro dei logger è stato pulito
2017.09.05 2017.09.05 00:00:00.000 Server MetaTester 5 fermato

Non c'è altro là fuori.

Allora perché non ci sono informazioni complete di Print() nei log del tester?

Spazio libero su disco. I registri vengono cancellati se rimangono meno di 500 meg su disco
 
Slava:
Liberare spazio su disco. I registri vengono cancellati se lo spazio su disco è inferiore a 500 meg

Come vengono puliti? Dove posso trovare informazioni sull'algoritmo di pulizia? Dov'è il messaggio che i registri sono stati puliti?

Come lavorare con il programma se non fa quello che ci si aspetta da lui? - Stiamo parlando anche di MT5, non solo di Expert Advisor.

Nel mio esempio specifico possiamo vedere nei log che i tick sono saltati. Cosa deve pensare un utente in questo caso? Quali pensieri puri e brillanti possono sorgere senza essere offuscati da un linguaggio scurrile?

 

Nella modalità visiva del tester, la posizione del cursore della velocità è memorizzata. L'ho impostato al massimo una volta. Poi eseguo un EA pesante - il visualizzatore si blocca.

Devo fare un EA fittizio ed eseguirlo nel visualizzatore e spostare il cursore un po' indietro. Un EA pesante non si blocca dopo questo.

È possibile impostare la posizione del cursore in anticipo (come in MT4)?

 

Durante una singola esecuzione senza visualizzazione, eseguo un Expert Advisor che esegue molti trade, intasando il log con messaggi appropriati (il tester stesso ama emetterli). Dopo il backtest (o subito dopo aver premuto Stop) passo alla scheda Log e vedo che i log continuano ad essere visualizzati. Questa è la prima sciocchezza, dato che il backtest è finito, perché non mostrare la fine dei log?

Non sono interessato ai registri e clicco su "Cancella registri". Dopo di che il registro viene cancellato e... continua a riempirsi di vecchi dischi!

 
Andrey Dik:

Come vengono puliti? Dove posso trovare informazioni sull'algoritmo di pulizia? Dov'è il messaggio che i registri sono stati puliti?

Come lavorare con il programma se non fa quello che ci si aspetta da lui? - Stiamo parlando anche di MT5, non solo di Expert Advisor.

Nel mio particolare esempio, potete vedere nei log che i tick sono saltati. Cosa deve pensare un utente in questo caso? Quali pensieri puri e brillanti possono sorgere senza essere offuscati da un linguaggio scurrile?

Non hai mai guardato i log dell'agente tester prima d'ora.

Il messaggio sulla cancellazione dei registri è quello che hai mostrato tu stesso.

Se analizzi i log del tester, allora sei a priori considerato un utente esperto. Un mago deve sempre tenere d'occhio il suo strumento. Windows Explorer mostra sempre un'unità con poco spazio libero in rosso

BTW anche se il vostro cruscotto ha un indicatore di pressione degli pneumatici, questo non annulla in alcun modo un controllo visivo del veicolo prima della guida

 
fxsaber:

Durante una singola esecuzione senza visualizzazione, eseguo l'Expert Advisor, che esegue molti trade, riempiendo il log con messaggi appropriati (il tester stesso ama emetterli). Dopo il backtest (o subito dopo aver premuto Stop) passo alla scheda Log e vedo che i log continuano ad essere visualizzati. Questa è la prima sciocchezza, dato che il backtest è finito, perché non mostrare la fine dei log?

Non sono interessato ai registri e clicco su "Cancella registri". Dopo di che il registro viene cancellato e... continua a riempirsi di vecchi dischi!

Sì, è una buona idea disabilitare l'output al log durante un test senza visualizzazione. Più spesso si vuole solo vedere il risultato finale (profitto, tempo di prova, ecc.), che viene visualizzato alla fine.

I dettagli durante il test possono essere visualizzati nella modalità di visualizzazione. Non ha senso scaricare reattivamente questo "mucchio" senza visualizzazione.

 
Alexey Kozitsyn:

Ecco il codice di prova se siete interessati.

Penso di aver trovato la causa e una soluzione temporanea a questo problema. È difficile per me spiegare come succede, ma sembra che il buffer dei colori interferisca e incasini tutto.


Ecco cosa ho cambiato nel codice sorgente e il problema è scomparso

#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. Metti l'indice DRAW_COLOR_HISTOGRAM "alla fine" in modo che INDICATOR_COLOR_INDEX sia l'ultimo.
  2. Se il buffer non deve essere riempito con un valore, deve essere riempito con PLOT_EMPTY_VALUE
 

Perché il tester fa questo?

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. Non hai mai guardato i log dell'agente tester prima d'ora.

Il messaggio sulla cancellazione del registro è stato mostrato da te.

2. Se state analizzando i log del tester, siete a priori considerati un utente esperto. Un mago deve sempre tenere d'occhio il suo strumento. Windows Explorer mostra sempre un'unità con poco spazio libero in rosso

BTW anche se il vostro cruscotto ha un indicatore di pressione degli pneumatici, non annulla assolutamente un controllo visivo del veicolo prima della guida

1. Non ho mai dovuto farlo perché non era necessario - i log del tester hanno sempre mostrato ciò che ci si aspettava.

2. A chi importa cosa mostra windows explorer? Lavoriamo in MT5 e deve solo dire all'utente che non c'è abbastanza memoria (o qualsiasi altra ragione che non permette di lavorare normalmente).

Sì, la ragione era che lo spazio libero era meno di 500mb e non solo i log apparivano senza salti, ma anche nessun lag appariva durante il test (non c'è da chiedersi perché i lag appaiono se i log appaiono comunque indipendentemente dal test). Ma come fa l'utente a sapere che abbiamo bisogno di almeno 500Mb? Perché non 2Mb, 100Mb, 100500Gb? - L'agente/tester dovrebbe visualizzare messaggi sui problemi che interferiscono con il normale funzionamento.

E, ci deve essere solo una scelta di cosa emettere nel log.

 
Alexey Viktorov:

Penso di aver trovato la causa e una soluzione temporanea a questo problema. È difficile per me spiegare come questo accada, ma sembra che il buffer di colore stia interferendo e incasinando tutto.


Ecco cosa ho cambiato nel codice sorgente e il problema è scomparso

  1. Metti l'indice DRAW_COLOR_HISTOGRAM "alla fine" in modo che INDICATOR_COLOR_INDEX sia l'ultimo.
  2. Se il buffer non deve essere riempito con un valore, deve essere riempito con PLOT_EMPTY_VALUE
Non ha funzionato:) Ok, non c'è bisogno di indovinare, dobbiamo avere una risposta dalla SD. Queste stampelle non dovrebbero comunque essere accettabili!