Ошибки, баги, вопросы - страница 1988

 
Andrey Dik:


Верно, есть, вот они:

2017.09.05  
2017.09.05 11:42:04 Logger log was cleaned
2017.09.05 00:00:00.000 Server MetaTester 5 stopped

Больше там ничего нет.

Так почему в логах тестера нет полной информаци по функции Print()?

Место освободите на диске. Логи чистятся, если на диске осталось меньше 500 мегов
 
Slava:
Место освободите на диске. Логи чистятся, если на диске осталось меньше 500 мегов

Каким образом они чистятся? Где можно узнать об алгоритме чистки? Где сообщение о том, что логи были подчищены?

Как работать с программой если она делает не то, что от неё ожидается? - речь в том числе и о МТ5, а не только о советнике.

В конкретном моём примере в логах видим, что тики пропускаются. Что думать в данном случае пользователю? Какие светлые чистые мысли могут возникнуть незатуманенные нецензурной бранью?

 

В визуальном режиме тестера положение ползунка скорости запоминается. Выставил на максимум один раз. Затем запускаю тяжелый советник - получаю зависание визуализатора.

Приходится делать советник-пустышку, запускать его в визуализаторе и сдвигать ползунок немного назад. После такой манипуляции тяжелый советник не вызывает зависания.

Возможно ли положение ползунка задать заранее (как это есть в MT4)?

 

При одиночном прогоне без визуализации запускаю советник, который совершает много торговых операций, забивая лог соответствующими сообщениями (сам тестер их любит выводить). После бэктеста (или сразу после нажатия на Стоп) переключаюсь на вкладку Журнал и вижу, как логи продолжают выводиться. Это первая несуразность, т.к. бэктест закончен, почему бы на показать конец логов?

Меня не интересуют логи и жму "Удалить журналы". После чего журнал чистится и... продолжает заполняться старыми записями!

 
Andrey Dik:

Каким образом они чистятся? Где можно узнать об алгоритме чистки? Где сообщение о том, что логи были подчищены?

Как работать с программой если она делает не то, что от неё ожидается? - речь в том числе и о МТ5, а не только о советнике.

В конкретном моём примере в логах видим, что тики пропускаются. Что думать в данном случае пользователю? Какие светлые чистые мысли могут возникнуть незатуманенные нецензурной бранью?

Вы до этого никогда не смотрели логи тестерного агента.

Сообщение об очистке лога Вы сами и показали.

Если Вы анализируете логи тестера, то Вы априори считаетсь квалифицированным пользователем. Мастер всегда должен смотреть за своим инструментом. Проводник виндовса всегда показывает красным цветом диск, на котором осталось мало свободного места

BTW даже если на Вашей приборной панели есть индикатор давления шин, то это ни в коем случае не отменяет визуальный осмотр автомобиля перед поездкой

 
fxsaber:

При одиночном прогоне без визуализации запускаю советник, который совершает много торговых операций, забивая лог соответствующими сообщениями (сам тестер их любит выводить). После бэктеста (или сразу после нажатия на Стоп) переключаюсь на вкладку Журнал и вижу, как логи продолжают выводиться. Это первая несуразность, т.к. бэктест закончен, почему бы на показать конец логов?

Меня не интересуют логи и жму "Удалить журналы". После чего журнал чистится и... продолжает заполняться старыми записями!

Да, хорошо бы отключать вывод в журнал во время теста без визуализации. Чаще нужно просто результат конечный увидеть (профит, время теста и т.д.), которые в самом конце выводятся.

Подробности во время теста можно смотреть в режиме его визуализации. Нет никакого смысла без визуализации реактивно вываливать эту "груду".

 
Alexey Kozitsyn:

Вот тестовый код, если интересно.

Мне кажется я нашёл причину и временное решение этой проблемы. Сложно, для меня, объяснить как это происходит, но кажется тут буфер цвета встревает и всё портит.


Вот что я поменял в исходном коде и проблема пропала

#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. Поставил индекс DRAW_COLOR_HISTOGRAM "в конец" с тем расчётом, чтобы INDICATOR_COLOR_INDEX был последним.
  2. Если в буфер не надо вносить значение, то обязательно его нужно заполнить значением PLOT_EMPTY_VALUE
 

Зачем это делает тестер?

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. Вы до этого никогда не смотрели логи тестерного агента.

Сообщение об очистке лога Вы сами и показали.

2. Если Вы анализируете логи тестера, то Вы априори считаетсь квалифицированным пользователем. Мастер всегда должен смотреть за своим инструментом. Проводник виндовса всегда показывает красным цветом диск, на котором осталось мало свободного места

BTW даже если на Вашей приборной панели есть индикатор давления шин, то это ни в коем случае не отменяет визуальный осмотр автомобиля перед поездкой

1. Мне никогда не приходилось этого делать потому что в этом не было необходимости - в логах тестера всегда было то, что ожидалось.

2. Мало ли что показывает проводник виндовс? Мы работаем в МТ5 и он просто обязан сообщить пользователю что недостаточно памяти (или любая другая причина не позволяющая работать штатно).

Да, причина была в том, что свободного места было меньше 500мб, причем не только стали полностью без пропусков выводится логи, но и пропали тормоза при прогоне (откуда вообще возникать тормозам, если логи всё равно выводятся не зависимо от теста, непонятно). Но откуда пользователю знать, что нужно не менее 500Мб? Почему не 2Мб, 100Мб, 100500 Гб? - должны выводится сообщения агентом/тестером о проблемах мешающих нормальной работе.

И, просто необходима возможность выбора что именно выводить в лог.

 
Alexey Viktorov:

Мне кажется я нашёл причину и временное решение этой проблемы. Сложно, для меня, объяснить как это происходит, но кажется тут буфер цвета встревает и всё портит.


Вот что я поменял в исходном коде и проблема пропала

  1. Поставил индекс DRAW_COLOR_HISTOGRAM "в конец" с тем расчётом, чтобы INDICATOR_COLOR_INDEX был последним.
  2. Если в буфер не надо вносить значение, то обязательно его нужно заполнить значением PLOT_EMPTY_VALUE
Не помогло:) Ладно, чего гадать, нужно получить ответ от СД. Все равно такие костыли не должны быть приемлемы!