Некорректное моделирование тиков на М1

 

Уже не в первый раз сталкиваюсь со следующей проблемой: на скриншоте видно, что у свечки на 16:40 Low=1,7517 однако при тиковом моделировании это значение не достигается.

Из лога видно, что минимальное смоделированное значение = 1,7518. Разве тики не должны точно соответствовать OHLC ? Прошу пояснений у Уважаемых разработчиков.

 
Сейчас попробую проверить на таком же баре. Нужно найти подъодящие условия, так как у меня минутная свечка немного другая.
 
extern string FileName = "TestTicks.txt";
 
int handle;
double tOpen, tHigh, tLow, tClose;
int CountErrors;
 
int PrevTime;
 
 
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);
 
  return(0);
}
 
int deinit()
{
  string Str;
  
  Str = "Bar Errors = " + DoubleToStr(100.0 * CountErrors / Bars, 2) + "%";
  
  Print(Str);
  FileWrite(handle, Str);
  
  FileClose(handle);
  
  return(0);
}
 
int start()
{
  string Str;
  
  if (PrevTime == Time[0])
  {
    if (Bid > tHigh)
      tHigh = Bid;
    else if (Bid < tLow)
      tLow = Bid;
  }
  else
  {
    PrevTime = Time[0];
    
    if ((NormalizeDouble(tOpen - Open[1], Digits) != 0) ||
        (NormalizeDouble(tHigh - High[1], Digits) != 0) ||
        (NormalizeDouble(tLow - Low[1], Digits) != 0) ||
        (NormalizeDouble(tClose - Close[1], Digits) != 0))
    {
      Str = TimeToStr(Time[1]);
      Print(Str);
      FileWrite(handle, Str);
      CountErrors++;
    }
        
    tOpen = Bid;
    tHigh = Bid;
    tLow = Bid;
  }
 
  tClose = Bid;
 
  return(0);
}

У меня более 5% минутных баров имеют при моделировании всех тиков данную ошибку. Код проверки выше.

 
Analitik:

Уже не в первый раз сталкиваюсь со следующей проблемой: на скриншоте видно, что у свечки на 16:40 Low=1,7517 однако при тиковом моделировании это значение не достигается.

Из лога видно, что минимальное смоделированное значение = 1,7518. Разве тики не должны точно соответствовать OHLC ? Прошу пояснений у Уважаемых разработчиков.


Даже если это ошибка?!?!? Её исправление Вам поможет? Вы заработатете на один пипс больше:) (на тестере) Зачем???
 
Я полагаю, что это не баг, а фича, о которой честно предупреждают разработчики - качество моделирования в режиме "все тики" для минутных баров 25%.
 
Меня интересует не зарабатывание лишнего пункта, а корректность тестирования стратегии. На указанном в примере значении Low у меня должен был сработать ордер (почему я, собственно и обратил на это внимание), а т.к. тиком это значение смоделировано небыло, то и открытие, соответственно, не произошло. Т.е. речь идёт не о зарабатывании/потере одного пункта, а об отсутствии в результатах тестирования итога целой сделки. А т.к. я тестирую эту стратегию на двухлетнем промежутке, то возникает вопрос - сколько ещё сделок небыло открыто по причине указанного бага и можно ли после этого доверять результатам такого тестирования? Не берусь судить о качестве тикового моделирования минутных баров вцелом, но, по моему, если смоделированные тики не соответствуют, по крайне мере, OHLC (поведение тиков внутри бара, ИМХО, большого значения не имеет, т.к. в реале оно может быть любым), то возникает вопрос о смысле такого моделирования и о доверии к результатам тестирования стратегий на нём, по указанной выше причине.
 
Спасибо за вопрос - мы все проверим и опубликуем результат.
 
Renat:
Спасибо за вопрос - мы все проверим и опубликуем результат.

Рад помочь, дело ведь - общее.
 
Analitik:
Renat:
Спасибо за вопрос - мы все проверим и опубликуем результат.

Рад помочь, дело ведь - общее.
На самом деле правильный Low тестер видит, я это проверил вчера , но не успел опубликовать. Но проверить все же есть что, поэтому точно будет известно в понедельник.
 

Rosh, поделитесь, как вы проверяли, что видит Tester, а что нет?

В проверяющем советнике, что привел выше, ваше утверждение не соответствует действительности. Возможно, где-то в коде допустил промашку. Прошу тогда, укажите, где ошибка. Вроде, все так.

И возникла следующая дилема, если ошибка в тестере все же присутствует:

Моя МТС провела больше тысячи сделок на различных реальных счетах. Для контроля работы ДЦ всегда использовал результаты тестера при прогоне по всем тикам. И когда проблемы у ДЦ отсутствовали, сделки на счете и на тестере совпадали ОДИН В ОДИН. Иначе - связывался с ДЦ, и они признавали свою ошибку с соответствующей компенсацией.

В МТС использую ТОЛЬКО отложенные ордера и уровни SL и TP. Если ошибка в тестере, то почему реальные счета и тестер совпадали на тысячах сделок ОДИН В ОДИН? Или же система открытия отложеных ордеров и закрытия по SL и TP у брокера работает на автомате по тому же принципу, что и тестер? Т..е данная система содержит ту же ошибку, что и тестер, поэтому эта ошибка и не проявляется при сравнении тестера и счета?

Доверие к тестеру пошатнулось, теперь проверяю вручную, пока не автоматизировал данный процесс.

Спасибо.

 
Вот код:

//+------------------------------------------------------------------+
//|                                                     CheckLow.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/"
 
//---- input parameters
extern int       DayS=14;
extern int       MonthS=4;
extern int       YearS=2006;
extern int       HourS=16;
extern int       MinuteS=19;
extern int       CounterS=20;
int counter;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if (counter>CounterS) return;
   if (Year()<2006) return;
   if (Month()<MonthS) return;
   if (Day()<DayS) return;
   if (Hour()<HourS) return;
   if (Minute()<MinuteS) return;
   Print("Open=",Open[0],"  High=",High[0],"   Low=",Low[0],"  Close=",Close[0],"  Bid=",Bid);
   counter++;  
//----
   return(0);
  }
//+------------------------------------------------------------------+
А вот иллюстрация:
Причина обращения: