错误、漏洞、问题 - 页 1988

 
Andrey Dik:


这是正确的,有,在这里。

2017.09.05
2017.09.05 11:42:04:04 记录仪日志被清理了
2017.09.05 2017.09.05 00:00:00.000 服务器MetaTester 5停止了

外面没有别的东西了。

那么,为什么在测试人员的日志中没有完整的Print() 信息?

磁盘上的自由空间。如果磁盘上的剩余容量小于500兆,日志就会被清除。
 
Slava:
释放磁盘空间。如果磁盘空间小于500兆,日志将被清除。

它们是如何被清洗的?我在哪里可以了解到清洁算法的情况?日志已被清理的信息在哪里?

如果方案没有做到预期的效果,如何与之合作?- 我们谈论的也是MT5,而不仅仅是专家顾问。

在我的具体例子中,我们可以在日志中看到,刻度线被跳过。在这种情况下,用户该怎么想呢?有什么光明纯洁的思想可以不被粗俗的语言所遮蔽而产生?

 

在测试仪的可视模式下,速度滑块的位置被记住了。我把它设置为最大的一次。然后我运行一个重的EA--可视化器挂起。

我必须做一个假的EA,并在visualizer中运行,把滑块往后移一点。在那之后,一个沉重的EA就不会再挂了。

是否可以提前设置滑块位置(就像在MT4中一样)?

 

在一次没有可视化的运行中,我运行了一个专家顾问,执行了许多交易,用适当的信息堵塞了日志(测试者本身喜欢输出这些信息)。在回测结束后(或按下停止键后),我切换到日志标签,看到日志继续显示。这是第一句废话,既然回测已经结束,为什么不显示日志的结尾?

我对这些日志不感兴趣,点击 "删除日志"。之后,日志被清除,并...继续装满老唱片!

 
Andrey Dik:

它们是如何被清洗的?我在哪里可以了解到清洁算法的情况?日志已被清理的信息在哪里?

如果方案没有做到预期的效果,如何与之合作?- 我们谈论的也是MT5,而不仅仅是专家顾问。

在我的特定例子中,你可以在日志中看到跳过的刻度。在这种情况下,用户该怎么想呢?什么样的光明纯洁的思想可以不被粗俗的语言所掩盖而产生?

你以前从未看过测试员的代理日志。

关于清除日志的信息你自己已经显示了。

如果你分析了测试者的日志,那么你就被先验地认为是一个熟练的用户。巫师必须始终关注他的工具。Windows资源管理器总是以红色显示可用空间小的驱动器

即使你的仪表盘上有一个轮胎压力指示器,它也不能取消驾驶前对车辆的目视检查。

 
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.如果你正在分析测试员的日志,你就被先验地认为是一个熟练的用户。巫师必须始终关注他的工具。Windows资源管理器总是以红色显示可用空间小的驱动器

BTW 即使你的仪表盘上有一个轮胎压力指示器,它也决不是取消了驾驶前对车辆的目视检查。

1.我从来没有这样做过,因为没有必要这样做--测试人员的日志总是显示出预期的内容。

2.谁在乎windows explorer显示什么?我们在MT5中工作,它只需要告诉用户没有足够的内存(或任何其他原因不允许正常工作)。

是的,原因是自由空间小于500MB,不仅日志被完全打印出来,没有任何跳过,而且在测试期间,滞后现象也消失了(不清楚为什么会出现任何滞后现象,如果无论如何测试,日志都被打印出来)。但用户如何知道我们至少需要500Mb?为什么不是2Mb、100Mb、100500Gb?- 代理人/测试者应显示有关干扰正常操作的问题的信息。

而且,只需要选择输出到日志的内容。

 
Alexey Viktorov:

我想我已经找到了这个问题的原因和临时解决办法。我很难解释这种情况是如何发生的,但似乎是颜色缓冲器 在干扰,把一切都搞乱了。


以下是我在源代码中的改动,问题消失了

  1. 把索引DRAW_COLOR_HISTOGRAM放在 "最后",这样INDICATOR_COLOR_INDEX就在最后。
  2. 如果缓冲区不被填充数值,必须用PLOT_EMPTY_VALUE填充。
没用的:)好吧,不需要猜测,我们需要从SD得到答案。这样的拐杖无论如何都不应该被接受!