28 !!! валютных пар, 1 эксперт. Опять грааль, но такого помоему еще никто не показывал. + ДЕМО СЧЕТ - страница 12

 
Rosh:
Я сделал тестирование "по EURUSD в диапазоне с 2007.07.10 по 2007.07.14, и, отдельным тестом, в диапазоне с 2007.07.09 по 2007.07.14" как Вы просили, разницы никакой нет.


Пришлось и мне обновиться до последнего билда. :-) Действительно, проблемы с временем исчезли, это приятно. Однако, как выяснилось, на этом история не кончается.

Прогнал я советника на том же периоде - никаких расхождений High и Low на М1 и на Н1/Д1 нет. Здесь наши с Вами результаты совпадают. Заметьте - я прогнал тест на обычных своих непричесанных данных. Никакой синхронизации и т.п. Так что это не может быть приичной расхождений.

Затем решил на всякий случай (ну плохой у меня характер) попробовать на другом интервале. И оказалось, что дело еще не кончено.

Попробуйте интервал с 2007.08.06 по 2007.08.11, то есть фактически последняя неделя. Причем сравнение не с Д1, а с Н1. В тексте советника надо 4 оператора закомментировать, и 4 раскомментировать. Не то чтобы доказана возможность подсматривания в будущее, нет. Но глюк присутствует.

И, поскольку, как оказалось, отсутствие проблем на недельном интервале еще не дает гарантии отсутствия проблем вообще, может быть стоит прогнать тест на значительно большем интервале ? Например, год или полгода ?

 
Я рассмотрел код вашего советника Simple Prospection. К сожалению, он оказался не безупречен, т поэтому я его немного пофиксил:

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {   
//----
  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
 
  mm = TimeMinute(TimeCurrent());
  hh = TimeHour(TimeCurrent());
  dd = TimeDay(TimeCurrent());
  if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
        {  
           Print("Новые сутки наступили");
           curHi=NormalizeDouble(Bid,Digits);
           curLo=NormalizeDouble(Bid,Digits);
           curD1=dd;
        }
        //curHi=NormalizeDouble(Bid,Digits);
        //curLo=NormalizeDouble(Bid,Digits);
        curH1=hh;
     }
     curM1=mm;
  }
  if (NormalizeDouble(Bid,Digits)==0) Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"  Bid=",Bid);
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);
  //LoH1 =  iLow(NULL,PERIOD_H1,0);
  HiH1 = iHigh(NULL,PERIOD_D1,0);
  LoH1 =  iLow(NULL,PERIOD_D1,0);
  HiH1 = NormalizeDouble(HiH1,Digits);
  LoH1 = NormalizeDouble(LoH1,Digits);
 
  str = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
  mHi = ", curHi=" + DoubleToStr(curHi,Digits);
  mLo = ", curLo=" + DoubleToStr(curLo,Digits);
  hHi = ", HiH1="  + DoubleToStr(HiH1, Digits);
  hLo = ", LoH1="  + DoubleToStr(LoH1, Digits);
  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
 
  if (HiH1!=curHi||LoH1!=curLo) 
  {  //Print(str,mHi,hHi,mLo,hLo);
     if (handle>0) FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),curHi,HiH1,curLo,LoH1);
  }
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{  Print("Работа закончена");
   if (handle>0)
      {FileWrite(handle,"записано ",TimeToStr(TimeLocal()));
      FileClose(handle);
      } 
//---- done
   return(0);
}
В вашем коде факт наступления новых суток фиксировался слишком поздно, фактически на вторые сутки, в то время как проверка корректности моделироания начиналась сразу после начала тестироания. Чтобы исключить эту несимметричность. я ввел булеву переменную start, с помощью которой сразу в начале тестиорвания фиксировал все проверяемые значения.

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
Как видите, она отрабатывает только один раз и больше не влияет на работу советника. в дальнейшем все идет согласно Вашего алгоритма. Если первичной инициализации не делать, то проверочные строчки

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
дают значение curLo=0, в то время как curHi не равно нулю. Это объясняется просто: обе переменные, и curLo, и curHi, изначально равны нулю, так как неинициализированы. При первом же тике условие

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
срабатывает и curHi уже отличается от нуля, так как текущий Bid больше нуля. В то же время текущий Bid не может быть меньше нуля(curLo не инициализировался и потому равен нулю), и поэтому условие

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
никак не может изменить curLo. Прогоните мой вариант советника самостоятельно и убедитесь, что файл ошибок Fu.xls будет содержать только одеу строчку - время последней смоделированной котировки в тестере.

Полный код прицеплен к сообщению, лучше скачать его, так как в пост он не влез.
Файлы:
 

Спасибо, конечно, Rosh за Вашу доработку, но в ней по-моему не было необходимости.

Возможно Вы не обратили внимание, но в моем коде в функции init() стоит следующий блок:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Врезультате выполнения этого блока, в начале исполнения советника не может быть выполнено ни одно из условий

if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
 

Поэтому с какого бы места истории не стартовал советник, это всегда будет новая минута, новый час и новый день. А первая пара операторов упомянутого блока объясняет почему Ваше утверждение: "Это объясняется просто: обе переменные, и curLo, и curHi, изначально равны нулю, так как неинициализированы." не соответствует действительности. Поскольку Bid на первом же тике больше нуля, но меньше 1000, то оба соответствующих условных оператора срабатывают обязательно и переменные curLo и curHi получают те же самые начальные значения, которые Вы им приписываете в блоке if (start) {...}.

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

Обратите еще раз внимание на мой предыдущий пост. Проблема возникает не при переходе к новым суткам, и не при старте советника, а при тестировании т/ф Н1. Из предложенного к тестированию интервала проблема возникает только один раз 10.08.2007 и продолжается 3 минуты с 17:00 до 17:03. За это время генерится 28 тиков с расхождениями в значениях High для М1 и Н1. Привожу соответствующую картинку.

Если Вам не трудно, прогоните советник (исправленный Вами код) на том интервале, о котором я просил. Только поправьте использование комментариев. Сейчас в Вашем коде он сравнивает с т/ф Д1 и в этом режиме никаких ошибок нет. Нужно, чтобы он сравнивал с Н1.

 

Немного изменил код, для сохранения корректности в особо патологических случаях ( у меня для 2007.01.01 всего одна свеча на М1, аналогично и на Н1 и Д1). Прогнал тест с 2007.01.01 по 2007.08.11. Для Д1 получилось 4 ошибочных случая, для Н1 - 2. Все ошибки случаются при переходе на новую свечу на старшем т/ф. Желающие могут убедиться.

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

Файлы:
future-2h.mq4  4 kb
 
Yurixx:

Спасибо, конечно, Rosh за Вашу доработку, но в ней по-моему не было необходимости.

Возможно Вы не обратили внимание, но в моем коде в функции init() стоит следующий блок:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Если Вам не трудно, прогоните советник (исправленный Вами код) на том интервале, о котором я просил. Только поправьте использование комментариев. Сейчас в Вашем коде он сравнивает с т/ф Д1 и в этом режиме никаких ошибок нет. Нужно, чтобы он сравнивал с Н1.


Лучше бы Вам самим выложить код. если Вы обратили внимание, то при тестировании моего кода на H1 значения не будут инициализированы:
  if (Period()>PERIOD_M1)
  {  Print("Период тестирования не соответствует задаче");
     return(-1);
  }
  Print("Период тестирования ",Period()," минут");
  FileWrite(handle,"Date","Time","curHi","HiH1","curLo","LoH1");
  nn=D'2007.07.12 23:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:02:00';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
 
  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

То есть, будет именно так как я написал. Если вам сложно выкладывать код , чтобы я не догадывался о чем идет речь, тогда уж сами разбирайтесь, у меня есть и другие дела, кроме упраженений в телепатии.
 

Право, не понимаю почему Вы раздражаетесь.

Как я и написал на прошлой странице, когда выкладывал советника с результатами, он предназначен для тестирования исключительно на М1. При этом он сравнивает формируемые им самостоятельно High и Low, с High и Low старшего т/ф, которыми могут быть Н1 или Д1, в зависимости от того, как расставлены комментарии в тексте процедуры start().

Признаюсь честно, поставив return(-1); в процедуре init() я полагал, что это вообще остановит работу советника и, таким образом, запустить его удастся только на М1. Однако, теперь, благодаря Вашему посту, я убедился, что его можно запустить на любом т/ф. В связи с этим хочу подчеркнуть: идея этого советника в попытке подсмотреть будущее с младшего т/ф (конкретно - М1) на старшем т/ф (конкретно - Н1 или Д1). Поэтому и запускать его следует только на М1. Что может показать тестирование на Н1 я даже не знаю.

Код советника я выложил непосредственно перед Вашим постом. Этот код можно использовать непосредственно для сравнения данных М1 с данными Н1. В тексте советника есть четкие указания о тех (элементарных) изменениях, которые нужно сделать, чтобы он сравнивал данные М1 с данными Д1. Так что и здесь мне непонятно чем Вы недовольны.

И последнее. Ваш код подходит для прогона в тестере также как и мой. Вопрос только в том, чтобы сделать это.

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

 
Yurixx:

Право, не понимаю почему Вы раздражаетесь.

Как я и написал на прошлой странице, когда выкладывал советника с результатами, он предназначен для тестирования исключительно на М1. При этом он сравнивает формируемые им самостоятельно High и Low, с High и Low старшего т/ф, которыми могут быть Н1 или Д1, в зависимости от того, как расставлены комментарии в тексте процедуры start().

Признаюсь честно, поставив return(-1); в процедуре init() я полагал, что это вообще остановит работу советника и, таким образом, запустить его удастся только на М1. Однако, теперь, благодаря Вашему посту, я убедился, что его можно запустить на любом т/ф. В связи с этим хочу подчеркнуть: идея этого советника в попытке подсмотреть будущее с младшего т/ф (конкретно - М1) на старшем т/ф (конкретно - Н1 или Д1). Поэтому и запускать его следует только на М1. Что может показать тестирование на Н1 я даже не знаю.

Код советника я выложил непосредственно перед Вашим постом. Этот код можно использовать непосредственно для сравнения данных М1 с данными Н1. В тексте советника есть четкие указания о тех (элементарных) изменениях, которые нужно сделать, чтобы он сравнивал данные М1 с данными Д1. Так что и здесь мне непонятно чем Вы недовольны.

И последнее. Ваш код подходит для прогона в тестере также как и мой. Вопрос только в том, чтобы сделать это.

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

Потому что из этого поста я так и не понял на каком тайифрейме мне его нужно запускать. Запустил на трех таймфреймах без вмешательства в код.

2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: Работа закончена
2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: 2007.08. 10 23:59:59, curHi=1.3693, HiH1=1.3702, curLo=1.3693, LoH1=1.3689
2007.08.14 16:29:02 2007.08.03 23:59 future-2h EURUSD,Daily: 2007.08. 03 23:59:59, curHi=1.3773, HiH1=1.3787, curLo=1.3773, LoH1=1.3772
2007.08.14 16:29:02 2007.07.27 23:59 future-2h EURUSD,Daily: 2007.07. 27 23:59:59, curHi=1.3635, HiH1=1.3641, curLo=1.3635, LoH1=1.3627
2007.08.14 16:29:02 2007.07.20 23:59 future-2h EURUSD,Daily: 2007.07. 20 23:59:59, curHi=1.3826, HiH1=1.3827, curLo=1.3826, LoH1=1.3821
2007.08.14 16:29:01 2007.07.16 23:59 future-2h EURUSD,Daily: 2007.07. 16 23:59:59, curHi=1.3772, HiH1=1.3773, curLo=1.3772, LoH1=1.3772
2007.08.14 16:29:01 2007.07.13 23:59 future-2h EURUSD,Daily: 2007.07. 13 23:59:59, curHi=1.3782, HiH1=1.3787, curLo=1.3782, LoH1=1.3780
2007.08.14 16:29:01 2007.07.06 23:59 future-2h EURUSD,Daily: 2007.07. 06 23:59:59, curHi=1.3625, HiH1=1.3630, curLo=1.3625, LoH1=1.3623
2007.08.14 16:29:01 2007.07.02 00:00 future-2h EURUSD,Daily: Период тестирования не соответствует задаче
2007.08.14 16:29:01 future-2h started for testing
2007.08.14 16:28:34 2007.08.10 22:59 future-2h EURUSD,H1: Работа закончена
2007.08.14 16:28:32 2007.07.02 00:00 future-2h EURUSD,H1: Период тестирования не соответствует задаче
2007.08.14 16:28:32 future-2h started for testing
2007.08.14 16:28:22 2007.08.10 22:59 future-2h EURUSD,M1: Работа закончена
2007.08.14 16:28:19 2007.07.02 00:00 future-2h EURUSD,M1: Период тестирования 1 минут
2007.08.14 16:28:19 future-2h started for testing
2007.08.14 16:24:28 2007.08.10 22:59 future-2h EURUSD,M1: Работа закончена
2007.08.14 16:24:28 2007.08.06 00:00 future-2h EURUSD,M1: Период тестирования 1 минут
 
Теперь поменял
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1

на

  else if (hh!=curH1)
  {  //curHi=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     //curLo=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     curH1=hh;
     curM1=mm;
  }
  else if (mm!=curM1) curM1=mm;
  
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
и прогнал опять на трейх периодах на том же интервале с 2007.07.01 по 2007.08.11 :


2007.08.14 16:32:03 2007.08.10 23:59 future-2h EURUSD,Daily: Работа закончена
2007.08.14 16:32:03 2007.07.27 23:59 future-2h EURUSD,Daily: 2007.07. 27 23:59:59, curHi=1.3753, HiH1=1.3753, curLo=1.3627, LoH1=1.3626
2007.08.14 16:32:01 2007.07.02 00:00 future-2h EURUSD,Daily: Период тестирования не соответствует задаче
2007.08.14 16:32:01 future-2h started for testing
2007.08.14 16:31:56 2007.08.10 22:59 future-2h EURUSD,H1: Работа закончена
2007.08.14 16:31:54 2007.07.02 00:00 future-2h EURUSD,H1: Период тестирования не соответствует задаче
2007.08.14 16:31:54 future-2h started for testing
2007.08.14 16:31:48 2007.08.10 22:59 future-2h EURUSD,M1: Работа закончена
2007.08.14 16:31:46 2007.07.02 00:00 future-2h EURUSD,M1: Период тестирования 1 минут
2007.08.14 16:31:46 future-2h started for testing
О чем это говорит? Надо опять анализировать код на наличие/отсутствие ошибок.
 

Понятно. Вы все сделали правильно. А запускать этот советник надо только на М1. По-моему я написал это вполне определенно. Запускается советник на М1, а тестирует при этом совпадение данных по High и Low периода М1 с периодом Н1 или Д1. Если бы была возможность подглядывания в будущее, то данные старшего т/ф позволяли бы узнать High и Low раньше, чем эти High и Low достигаются на М1. Вот и все.

Результат Вашего теста Д1 соответствует моему, на этом интервале для Д1 я тоже получил отсутствие ошибок. Но тест Н1 не подтверждает того, что было получено мною и выложено чуть раньше. Анализировать код незачем. Как видите он подтверждает нормальную работу тестера.

Если Вы считаете, что этого достаточно, то на этом можно и остановиться. Если же хотите убедиться, что это не случайно, не благодаря тому, что период слишком мал, то прогоните эти же два теста на периоде подлиннее. За год, например, или с начала 2007.

PS

На всякий случай повторюсь. Тестировать только на периоде М1. Только в режиме все тики.

Спасибо за участие.

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

Эти тесты реально помогают улучшить тестер в MetaTrader 4. Особенно с исходниками.
Причина обращения: