Новая версия платформы MetaTrader 5 build 2940: Перенос витрин MQL5-сервисов в рабочую область и обновление дизайна - страница 29

 
Возможно ли добавить в тестер режим аналогичный 
 

Каждый раз, когда я начинаю отладку с помощью hist. data (MQ demo EURUSD m15) терминал (тестер) выводит в журнал:

LJ    2    08:00:28.376    Tester    quality of analyzed history is 9% (5418 minute bars, tick volume errors 0, spread errors 4929)

Что это значит? Как мне интерпретировать:

  1. качество анализируемой истории 9%?
  2. ошибки распространения 4929

Если я начну нормальную отладку своей программы:

...
   min_rates_total = 35 ;
...
   if ( (n= BarsCalculated (Hdl_Ultima))<min_rates_total) return false ;

реализует (для EURUSD m15):


Я предполагаю, что всего доступно 563 468 баров.

 

The debugger with hist. Data has a problem that makes it practically worthless.
I use one (my) indicator on EURUSD m15, which runs everywhere without problems (symbols, time frame), and I call the same indicator parallel for m1.
The StrategyTester EURUSD m15 is switched on. Start date 2021.06.15. OnInit() with:

  Hdl_myUltimaSlow = iCustom(SYM, TF_myUltimaSlow, "myUltima", myUltimaSlow_WPR, myUltimaSlow_PERa, 
                    myUltimaSlow_PERb, myUltimaSlow_MOM, myUltimaSlow_REL, myUltimaSlow_DEV, myUltimaSlow_BRK);
   if(Hdl_myUltimaSlow==INVALID_HANDLE) {
      Print("Ungültiges Handle Hdl_myUltimaSlow in iniMethod L: ",__LINE__);
      return(INIT_FAILED);
   }
   else n = CopyBuffer(Hdl_myUltimaSlow,        0, 0, ßTOT,    myUltimaSlowBlau);
   
   Hdl_myUltimaFast = iCustom(SYM, TF_myUltimaFast, "myUltima", myUltimaFast_WPR, myUltimaFast_PERa, 
                      myUltimaFast_PERb, myUltimaFast_MOM, myUltimaFast_REL, myUltimaFast_DEV, myUltimaFast_BRK);
   if(Hdl_myUltimaFast==INVALID_HANDLE) {
      Print("Ungültiges Handle Hdl_myUltimaFast in iniMethod L: ",__LINE__);
      return(INIT_FAILED);
   }
   else n = CopyBuffer(Hdl_myUltimaFast,        0, 0, ßTOT,    myUltimaFastBlau);

finishes successfully.

The EA itself is designed for multiple symbols (later). Therefore there is the call of the method oTick, which simulates OnTick():

int CMa::oTick() {

   ResetLastError();
   Requotes = false;
   string frLne="";
   int n = 0;
   if ( (n=BarsCalculated(Hdl_UmaSlow))<min_rates_total) 
      return n;
   if (!SymbolInfoTick(SYM,q))   
      return -__LINE__;
   if ( q.ask*q.bid==0)        
      return -__LINE__; // check
   if ( CopyRates(SYM,TF_UmaSlow,0,2,b)<2) { 
      Print(__LINE__," e: ",sErr()); 
      return -__LINE__; 
   }// return false; //

   tC = TimeCurrent();
   
if (tC >= D'2021.06.16 05:15') // start of the program to analyse and trade
 tC = TimeCurrent(); // to switch on and off on-the-fly debugBreak()
else return n;


I query if the long indicator already has enough values (BarsCalculated(Hdl_UmaSlow))), which happens after a short while, but suddenly the indicator gets no more values and BarsCalculated() falls back to zero and stays there?

void OnTimer() {
   static int count, retN=0;
   datetime tC = TimeCurrent();
   if (tC >= D'2021.06.16 05:15')  count++;
 
   int ret,iSym = NoSym;
   while(iSym-->0) {
      ret = arrCMa[iSym].oTick();
   }   
   if ( ret < retN )
      DebugBreak();
   retN = ret;
   count++;
   if(count%10000==0)
      count++;          // to switch on and off on-the-fly debugBreak()
}

 

(BTW I have no function OnTick() - only OnTimer()

The chart shows certain oddities:
1. you can see when the indicator(s) are no longer calculated, although the chart continues to get the rates???
2. where does the chart EURUSD M5 come from, I have only m15 and m1?
3. no other indicator is started with m5.
4. when I bring the m5-chart to the foreground, it is the M15 chart or - to put it in different words - nothing happens, except that at the bottom the tabs change???

Below are the charts of m15 and m5.

Отладчик с hist. У данных есть проблема, которая делает их практически бесполезными.
Я использую один (свой) индикатор на EURUSD m15, который везде работает без проблем (символы, таймфреймы), и этот же индикатор я называю параллельным для m1.
Включен StrategyTester EURUSD m15. Дата начала 2021.06.15. OnInit () с:

  Hdl_myUltimaSlow = iCustom (SYM, TF_myUltimaSlow, "myUltima" , myUltimaSlow_WPR, myUltimaSlow_PERa, 
                    myUltimaSlow_PERb, myUltimaSlow_MOM, myUltimaSlow_REL, myUltimaSlow_DEV, myUltimaSlow_BRK);
   if (Hdl_myUltimaSlow== INVALID_HANDLE ) {
       Print ( "Ungültiges Handle Hdl_myUltimaSlow in iniMethod L: " , __LINE__ );
       return ( INIT_FAILED );
   }
   else n = CopyBuffer (Hdl_myUltimaSlow,         0 , 0 , ßTOT,    myUltimaSlowBlau);
   
   Hdl_myUltimaFast = iCustom (SYM, TF_myUltimaFast, "myUltima" , myUltimaFast_WPR, myUltimaFast_PERa, 
                      myUltimaFast_PERb, myUltimaFast_MOM, myUltimaFast_REL, myUltimaFast_DEV, myUltimaFast_BRK);
   if (Hdl_myUltimaFast== INVALID_HANDLE ) {
       Print ( "Ungültiges Handle Hdl_myUltimaFast in iniMethod L: " , __LINE__ );
       return ( INIT_FAILED );
   }
   else n = CopyBuffer (Hdl_myUltimaFast,         0 , 0 , ßTOT,    myUltimaFastBlau);

заканчивается успешно.

Сам советник рассчитан на несколько символов (позже). Поэтому есть вызов метода oTick, имитирующего OnTick ():

 int CMa::oTick() {

   ResetLastError ();
   Requotes = false ;
   string frLne= "" ;
   int n = 0 ;
   if ( (n= BarsCalculated (Hdl_UmaSlow))<min_rates_total) 
       return n;
   if (! SymbolInfoTick (SYM,q))   
       return - __LINE__ ;
   if ( q.ask*q.bid== 0 )        
       return - __LINE__ ; // check 
   if ( CopyRates (SYM,TF_UmaSlow, 0 , 2 ,b)< 2 ) { 
       Print ( __LINE__ , " e: " ,sErr()); 
       return - __LINE__ ; 
   } // return false; // 

   tC = TimeCurrent ();
   
if (tC >= D'2021.06.16 05:15' ) // start of the program to analyse and trade
 tC = TimeCurrent (); // to switch on and off on-the-fly debugBreak()
 else return n;


Я спрашиваю, достаточно ли у длинного индикатора уже значений (BarsCalculated (Hdl_UmaSlow))), что происходит через короткое время, но внезапно индикатор не получает больше значений, а BarsCalculated () возвращается к нулю и остается там?

void OnTimer() {
   static int count, retN=0;
   datetime tC = TimeCurrent();
   if (tC >= D'2021.06.16 05:15')  count++;
 
   int ret,iSym = NoSym;
   while(iSym-->0) {
      ret = arrCMa[iSym].oTick();
   }   
   if ( ret < retN )
      DebugBreak();
   retN = ret;
   count++;
   if(count%10000==0)
      count++;          // to switch on and off on-the-fly debugBreak()
}

 

(Кстати, у меня нет функции OnTick () - только OnTimer ()

На графике видны некоторые странности:
1. вы можете видеть, когда индикатор (ы) больше не рассчитываются, хотя на графике по-прежнему отображаются значения ???
2. откуда берется график EURUSD M5, у меня только m15 и m1?
3. ни один другой индикатор не запускается с m5.
4. когда я вывожу на передний план m5-график, это график M15 или - другими словами - ничего не происходит, кроме того, что внизу вкладки меняются ???

Вот графики м15 и м5:


From/Из OnTimer();


And finally the journal entry: И, наконец, запись в дневнике:

2021.06.21 15:10:53.587    Core 01    connecting to 127.0.0.1:3000
2021.06.21 15:10:53.587    Core 01    connected
2021.06.21 15:10:53.592    Core 01    authorized (agent build 2980)
2021.06.21 15:10:53.592    Tester    EURUSD,M15 (MetaQuotes-Demo): visual testing of Experts\MaDrUltima\MaEA.ex5 from 2021.06.15 00:00 to 2021.06.20 00:00
2021.06.21 15:10:53.617    Core 01    common synchronization completed
2021.06.21 15:10:53.741    Tester    quality of analyzed history is 9% (5418 minute bars, tick volume errors 0, spread errors 4929)