エラー、バグ、質問 - ページ 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メガを下回るとログがクリアされます

どのようにクリーニングしているのですか?クリーニングアルゴリズムについては、どこで知ることができますか?ログがきれいになったというメッセージはどこにあるのですか?

プログラムが期待通りの働きをしない場合、どのように働きかけるか?- Expert Advisorだけでなく、MT5も対象にしています。

この例では、ティックがスキップされていることがログで確認できます。この場合、ユーザーはどう考えればいいのでしょうか?汚い言葉で濁らず、どんな明るい純粋な思いが生まれるのだろう。

 

テスタービジュアルモードでは、スピードスライダーの位置が記憶されます。一度最大に設定しました。その後、重いEAを実行すると、ビジュアライザーがハングアップします。

ダミーのEAを作ってビジュアライザーで動かして、スライダーを少し戻す必要がありますね。重いEAがその後ハングアップしない。

スライダーの位置をあらかじめ設定することは可能でしょうか(MT4と同様)。

 

可視化せずに1回実行する間に、Expert Advisorを実行して多くの取引を 行い、適切なメッセージ(テスター自身が好んで出力する)でログを満たします。バックテスト後(またはStopを押した直後)、Logタブに切り替えると、ログが表示され続けているのがわかります。バックテストが終わったのだから、ログの最後を表示すればいいのに、これが最初の戯言です。

ログに興味がないので、「ログを削除」をクリックする。その後、ログがクリアされ...は、古いレコードで埋め尽くされ続けています

 
Andrey Dik:

どのようにクリーニングしているのですか?クリーニングアルゴリズムについては、どこで知ることができますか?ログがきれいになったというメッセージはどこにあるのですか?

プログラムが期待通りの働きをしない場合、どのように働きかけるか?- Expert Advisorだけでなく、MT5も対象にしています。

私の特定の例では、ティックがスキップされていることがログで確認できます。この場合、ユーザーはどう考えればいいのでしょうか?汚い言葉では言い表せないような、明るい純粋な思いが湧いてくるかもしれません。

テスターエージェントのログを見たことがないのでは?

ログをクリアするというメッセージは、自分で表示したものです。

テスターのログを解析すれば、先験的に熟練ユーザーとみなされる。魔法使いは常に自分の道具から目を離さない。Windowsエクスプローラで、空き容量が少ないドライブが常に赤く表示されている

ちなみに、ダッシュボードにタイヤ空気圧の表示があっても、運転前の目視点検を欠かすことはできません。

 
fxsaber:

可視化せずに1回実行する間に、Expert Advisorを実行して多くの取引を 行い、適切なメッセージ(テスター自身が好んで出力する)でログを詰まらせます。バックテスト後(またはStopを押した直後)、Logタブに切り替えると、ログが表示され続けているのがわかります。バックテストが終わったのだから、ログの最後を表示すればいいのに、これが最初の戯言です。

ログに興味がないので、「ログを削除」をクリックする。その後、ログがクリアされ...は、古いレコードで埋め尽くされ続けています

そうですね、可視化しないテストではログへの出力を無効にするのが良いでしょう。それよりも、一番最後に表示される最終結果(利益、テスト時間など)を見たい、という方が多いのではないでしょうか。

テスト中の詳細は、ビジュアライゼーションモードで確認することができます。この「山」を可視化せずに、反応的に捨てても意味がないのです。

 
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. INDICATOR_COLOR_INDEXが最後になるように、インデックスDRAW_COLOR_HISTOGRAMを "最後に "置く。
  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エクスプローラで、空き容量が少ないドライブが常に赤く表示されている

ちなみに、ダッシュボードにタイヤ空気圧表示があったとしても、運転前の目視点検は欠かせません。

1.テスターのログには、常に期待されるものが表示されるからです。

2.Windowsエクスプローラが何を表示しているかなんて、誰が気にするんだ?私たちはMT5で作業していますが、メモリが不足していること(またはその他の理由で正常に作業できないこと)をユーザーに伝えるだけでよいのです。

そうです、空き容量が500mbを切っていたため、ログが飛ばされることなく完全に印刷されただけでなく、テスト中にラグがなくなったのです(テストに関係なくとにかくログが印刷されるなら、なぜラグが全く発生しないのかは不明です)。しかし、最低でも500Mbが必要だということを、ユーザーはどうやって知ることができるのでしょうか?2Mb、100Mb、100500Gbではダメなのか?- エージェント/テスターは、正常な動作を妨げる問題についてのメッセージを表示する必要があります。

それと、ログに何を出力するかという選択肢があればいいんです。

 
Alexey Viktorov:

この問題の原因と一時的な解決策が見つかったと思う。この現象を説明するのは難しいのですが、カラーバッファが 干渉して、すべてを台無しにしているようです。


ソースコードを変更したところ、問題が解消されたのは以下のとおりです。

  1. INDICATOR_COLOR_INDEXが最後になるように、インデックスDRAW_COLOR_HISTOGRAMを "最後に "置く。
  2. バッファに値が入らない場合は、PLOT_EMPTY_VALUEで埋める必要があります。
うまくいかなかった:)よし、推測する必要はない、SDから答えを引き出すんだ。そんな松葉杖は、どうせ通用しないはずだ!