Fehler, Irrtümer, Fragen - Seite 1988

 
Andrey Dik:


Das stimmt, es gibt sie, hier sind sie:

2017.09.05
2017.09.05 11:42:04:04 Logger-Protokoll wurde bereinigt
2017.09.05 2017.09.05 00:00:00.000 Server MetaTester 5 gestoppt

Es gibt nichts anderes da draußen.

Warum gibt es dann keine vollständigen Print()-Informationen in den Testerprotokollen?

Freier Speicherplatz auf der Festplatte. Protokolle werden gelöscht, wenn weniger als 500 Megabyte auf der Festplatte vorhanden sind.
 
Slava:
Geben Sie Speicherplatz frei. Die Protokolle werden gelöscht, wenn der Speicherplatz weniger als 500 Megabyte beträgt.

Wie werden sie gereinigt? Wo kann ich mich über den Reinigungsalgorithmus informieren? Wo befindet sich die Meldung, dass die Protokolle bereinigt wurden?

Wie kann man mit dem Programm arbeiten, wenn es nicht das tut, was man von ihm erwartet? - Wir sprechen auch über MT5, nicht nur über Expert Advisor.

In meinem konkreten Beispiel können wir in den Protokollen sehen, dass die Häkchen übersprungen werden. Was soll ein Benutzer in diesem Fall denken? Welche hellen, reinen Gedanken können ungetrübt durch unflätige Sprache entstehen?

 

Im visuellen Modus des Prüfgeräts wird die Position des Geschwindigkeitsschiebers gespeichert. Ich habe ihn einmal auf Maximum gestellt. Dann lasse ich einen schweren EA laufen - der Visualizer bleibt hängen.

Ich muss einen Dummy-EA erstellen und ihn im Visualizer laufen lassen und den Schieberegler ein wenig zurückschieben. Ein schwerer EA bleibt danach nicht hängen.

Ist es möglich, die Position des Schiebereglers im Voraus festzulegen (wie in MT4)?

 

Während eines einzelnen Durchlaufs ohne Visualisierung führe ich einen Expert Advisor aus, der viele Trades durchführt und das Protokoll mit entsprechenden Meldungen verstopft (der Tester selbst gibt sie gerne aus). Nach dem Backtest (oder unmittelbar nach dem Drücken von Stop) wechsle ich zur Registerkarte Log und sehe, dass die Logs weiterhin angezeigt werden. Das ist der erste Unsinn, denn der Backtest ist vorbei, warum nicht das Ende der Protokolle anzeigen?

Ich interessiere mich nicht für die Protokolle und klicke auf "Protokolle löschen". Danach wird das Protokoll geleert und... füllt sich weiter mit alten Platten!

 
Andrey Dik:

Wie werden sie gereinigt? Wo kann ich mich über den Reinigungsalgorithmus informieren? Wo befindet sich die Meldung, dass die Protokolle bereinigt wurden?

Wie kann man mit dem Programm arbeiten, wenn es nicht das tut, was man von ihm erwartet? - Wir sprechen auch über MT5, nicht nur über Expert Advisor.

In meinem speziellen Beispiel können Sie in den Protokollen sehen, dass Ticks übersprungen werden. Was soll ein Benutzer in diesem Fall denken? Welche hellen, reinen Gedanken können ungetrübt durch unflätige Sprache entstehen?

Sie haben sich die Protokolle des Prüfers noch nie angesehen.

Die Meldung über das Löschen der Protokolle ist die, die Sie selbst angezeigt haben.

Wenn Sie die Protokolle des Prüfers analysieren, gelten Sie a priori als erfahrener Benutzer. Ein Zauberer muss immer ein Auge auf sein Werkzeug haben. Windows Explorer zeigt ein Laufwerk mit wenig freiem Speicherplatz immer in rot an

Übrigens: Auch wenn Sie eine Reifendruckanzeige auf Ihrem Armaturenbrett haben, macht sie eine Sichtprüfung des Fahrzeugs vor der Fahrt keineswegs überflüssig.

 
fxsaber:

Während eines einzelnen Durchlaufs ohne Visualisierung führe ich einen Expert Advisor aus, der viele Trades durchführt und das Protokoll mit entsprechenden Meldungen verstopft (der Tester selbst gibt sie gerne aus). Nach dem Backtest (oder unmittelbar nach dem Drücken von Stop) wechsle ich zur Registerkarte Log und sehe, dass die Logs weiterhin angezeigt werden. Das ist der erste Unsinn, denn der Backtest ist vorbei, warum nicht das Ende der Protokolle anzeigen?

Ich interessiere mich nicht für die Protokolle und klicke auf "Protokolle löschen". Danach wird das Protokoll geleert und... füllt sich weiter mit alten Platten!

Ja, es ist eine gute Idee, die Ausgabe in das Protokoll während eines Tests ohne Visualisierung zu deaktivieren. Meistens möchte man nur das Endergebnis sehen (Gewinn, Testzeit usw.), das ganz am Ende angezeigt wird.

Details während der Prüfung können im Visualisierungsmodus eingesehen werden. Es hat keinen Sinn, diesen "Haufen" reaktiv zu entsorgen, ohne ihn zu visualisieren.

 
Alexey Kozitsyn:

Hier ist der Testcode, wenn Sie daran interessiert sind.

Ich glaube, ich habe die Ursache und eine vorübergehende Lösung für dieses Problem gefunden. Es fällt mir schwer zu erklären, wie das passiert, aber es scheint, dass der Farbpuffer alles durcheinander bringt.


Ich habe folgende Änderungen im Quellcode vorgenommen, und das Problem ist verschwunden

#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. Setzen Sie den Index DRAW_COLOR_HISTOGRAM "an das Ende", so dass INDICATOR_COLOR_INDEX der letzte war.
  2. Wenn der Puffer nicht mit einem Wert gefüllt werden soll, muss er mit PLOT_EMPTY_VALUE gefüllt werden
 

Warum tut der Prüfer das?

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. Sie haben sich die Protokolle des Prüfers noch nie angesehen.

Die Meldung zum Löschen des Protokolls wurde von Ihnen selbst angezeigt.

2. Wenn Sie die Protokolle des Prüfers analysieren, gelten Sie a priori als erfahrener Benutzer. Ein Zauberer muss immer ein Auge auf sein Werkzeug haben. Windows Explorer zeigt ein Laufwerk mit wenig freiem Speicherplatz immer in rot an

Übrigens: Auch wenn Ihr Armaturenbrett eine Reifendruckanzeige hat, macht dies eine Sichtprüfung des Fahrzeugs vor der Fahrt keineswegs überflüssig.

1. Ich musste dies nie tun, weil es nicht notwendig war - die Testerprotokolle zeigten immer, was erwartet wurde.

2. Wen interessiert schon, was der Windows-Explorer anzeigt? Wir arbeiten mit MT5 und es muss dem Benutzer nur mitteilen, dass nicht genügend Speicher vorhanden ist (oder ein anderer Grund, der ein normales Arbeiten verhindert).

Ja, der Grund dafür war, dass der freie Speicherplatz weniger als 500 MB betrug und nicht nur die Protokolle vollständig und ohne Aussetzer gedruckt wurden, sondern auch die Verzögerungen während des Tests verschwanden (es ist unklar, warum überhaupt Verzögerungen auftreten, wenn die Protokolle unabhängig vom Test ohnehin gedruckt werden). Aber woher weiß der Benutzer, dass wir mindestens 500Mb benötigen? Warum nicht 2Mb, 100Mb, 100500Gb? - Der Agent/Tester sollte Meldungen über Probleme anzeigen, die den normalen Betrieb stören.

Und es muss einfach eine Auswahlmöglichkeit geben, was in das Protokoll ausgegeben werden soll.

 
Alexey Viktorov:

Ich glaube, ich habe die Ursache und eine vorübergehende Lösung für dieses Problem gefunden. Es fällt mir schwer zu erklären, wie das passiert, aber es scheint, dass der Farbpuffer stört und alles durcheinander bringt.


Ich habe folgende Änderungen im Quellcode vorgenommen, und das Problem ist verschwunden

  1. Setzen Sie den Index DRAW_COLOR_HISTOGRAM "an das Ende", so dass INDICATOR_COLOR_INDEX der letzte war.
  2. Wenn der Puffer nicht mit einem Wert gefüllt werden soll, muss er mit PLOT_EMPTY_VALUE gefüllt werden
Es hat nicht funktioniert:) Ok, wir brauchen nicht zu raten, wir müssen eine Antwort vom SD bekommen. Solche Krücken sollten ohnehin nicht akzeptabel sein!