Тестер: ошибка моделирования тиков на всех таймфреймах на модели все тики - страница 2

 
getch:

Скрипт, показывающий ошибку вашей функции сравнения двух double:

Действительно, функция не до конца корректна. Правильно сравнивать не только на условие "больше", но и на условие "равно", то ест так:

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2, int Dig,double accuracy)
  {
   if(NormalizeDouble(MathAbs(number1-number2),Dig)>=accuracy) return(true);
   else return(false);
  }


Я сделал более подробный вариант советника, и протестировал все периоды по символу EURUSD с Dayli до минуток на модели "Все тики". Предварительно я скачал историю с 1999 года из History Center c автоматическим созданием всех таймфреймов. Также я скачал последний билд терминала от 25.07.2007.

Вот код советника:

//+------------------------------------------------------------------+
//|                                            CheckHighAndLow-2.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru/"
 
extern string FileName = "TestTicks.txt";
 
int handle;
double tOpen, tHigh, tLow, tClose;
int CountErrors;
 
int PrevTime;
 
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  PrevTime = Time[0];
  tOpen = Bid;
  tHigh = Bid;
  tLow = Bid;
  tClose = Bid;
  CountErrors = 0;
 
  handle=FileOpen(FileName,FILE_READ|FILE_WRITE, "\t");
  FileSeek(handle, 0, SEEK_END);
  FileWrite(handle,Symbol(),Period());
  FileWrite(handle,"Time","tOpen","Open[1]","tHigh","High[1]","tLow","Low[1]","tClose","Close[1]"); 
  return(0);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  string Str;
  
  Str = "Bar Errors = " + DoubleToStr(100.0 * CountErrors / Bars, 2) + "%";
  
  Print(Str);
  FileWrite(handle, Str);
  
  FileClose(handle);
   
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2, int Dig,double accuracy)
  {
   if(NormalizeDouble(MathAbs(number1-number2),Dig)>=accuracy) return(true);
   else return(false);
  }
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  string Str;
  
  if (PrevTime == Time[0])
  {
    if (Bid > tHigh)
      tHigh = Bid;
    else if (Bid < tLow)
      tLow = Bid;
  }
  else
  {
    PrevTime = Time[0];
    
    if (CompareDoubles(tOpen,Open[1], Digits,Point) ||
        CompareDoubles(tHigh,High[1], Digits,Point) ||
        CompareDoubles(tLow,Low[1], Digits,Point) ||
        CompareDoubles(tClose,Close[1], Digits,Point))
      {
        Str = TimeToStr(Time[1]) + ", Volume = " + DoubleToStr(Volume[1], 0);
        Print(Str);
        FileWrite(handle,TimeToStr(Time[1]),tOpen,Open[1], tHigh,High[1],tLow,Low[1],tClose,Close[1]);
        CountErrors++;
      }
        
    tOpen = Bid;
    tHigh = Bid;
    tLow = Bid;
  }
 
  tClose = Bid;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Результаты немного меня озадачили. На всех таймфреймах количество ошибок 0. Кроме перида Daily
На дневном периоде действительно большой % ошибок. Завтра я проверю на этих же данных этим же советником, так как предыдущий тест на рабочем компьютере показал только одну ошибку моделирования.

Если Вам несложно, прошу Вас скачать последний билд терминала и установить в отдельную папку. А также загрузить котировки из History Center. Если у Вас на EURUSD покажет ошибки, сообщите пожалуйста. Спасибо Вам за найденные ошибки в моем коде и терминале.
 

Сделал все, как в первом посте, только билд 208. Ошибки остались.

Закачал USDJPY из History Center Alpari, ошибки исчезли.

Надо смотреть Period_converter.

Спасибо за внесенные исправления.

Да, только что произошла неприятность: при попытке закрыть ордер терминал выдал крэш и история котировок по множеству инструментов (терминал на реале висел несколько недель) исчезла. Хотелось бы, чтобы при крэше все же история котировок сохранялась. Еще раз спасибо.

Причина обращения: