Конкурс на лучший способ получения случайного числа при оптимизации. - страница 2

 
long fCounter()
  {
   string name="fCounter.bin";
   int    hndl=-1;
   long   res=0;
   
   if(!FileIsExist(name)) {
      hndl=FileOpen(name,FILE_WRITE|FILE_BIN);
      if(hndl==INVALID_HANDLE)
         return(-1);
      FileWriteLong(hndl,1);
      FileClose(hndl);
      return(0);
     }
   
   hndl=FileOpen(name,FILE_READ|FILE_WRITE|FILE_BIN);
   if(hndl==INVALID_HANDLE)
      return(-1);
   
   res=FileReadLong(hndl);
   FileSeek(hndl,0,SEEK_SET);
   FileWriteLong(hndl,res+1);
   FileClose(hndl);
   
   return(res);
  }

 

Сори ошибочка вышла.

Локалтайм в тестере берёт не компьютерное время а эмулирует тестерное время.

Изменяется при изменении диапазона тестирования. Уж не знаю баг это или фича.


 
Urain:

Сори ошибочка вышла.

Локалтайм в тестере берёт не компьютерное время а эмулирует тестерное время.

Изменяется при изменении диапазона тестирования. Уж не знаю баг это или фича.


Именно. Я тоже не знаю баг это или фича. :-)  Мне кажется разработчики специально сделали // типа всё таки фича. :)

А вот может попросить разработчиков ещё один "TimeXXX" соорудить? Даже не знаю как назвать... ну кароче который и в тестере реальное Local-время выдаёт.

Или просто, щёб GetTickCount() в тестере выдавал реальное время работы реального компа, независимо от режима - тестер там, не тестер...

?

 
WWer:

Ага, Назарий, зачёт. Нудно, конечно, зато безотказно. // Ежли в винте дырку не протрёт... ;-)
 
Urain:

Поэтому смело прикручивайте к любому оптимизируемому параметру и вы получите неповторимый ряд даже при ГА.

Два прохода ГА будут отличны друг от друга.

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

Вопчем я сделал почти что так, только прикрутил сразу ко всем оптимизируемым параметрам. // Уж хоть один-то должен меняться при разных прогонах :-)

С разными большими множителями просуммировал - линейная комбинация така. Потом взял от неё (uint)(Abs()), ну и в завершении остаток от деления на ограничитель диапазона нужного мне рэндома.

// То есть фактически я подсел на рэндом самого генетического алгоритма, благо у него TimeLocal() видимо рабочий попался... :)

--

Но то, что я "раскололся" и огласил свой способ не означает завершение конкурса - конкурс только начался, жду новых решений!

 
Urain:

Сори ошибочка вышла.

Локалтайм в тестере берёт не компьютерное время а эмулирует тестерное время.

Изменяется при изменении диапазона тестирования. Уж не знаю баг это или фича.


С позиции разработчиков фича, и менять они это в дальнейшем не намерены.


 
Можно в глобальную переменную прибавлять по 1 каждый раз в Init(), и этой переменной инициализировать MathSrand().
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
joo:
Можно в глобальную переменную прибавлять по 1 каждый раз в Init(), и этой переменной инициализировать MathSrand().

Не покатит. Глобалы в тестере свои. Вручную их не добавить.

Причём по какой то логике если при каждой итерации добавлять 1, то первый агент стартует с 1560 второй с 9169 постепенно увеличивая значение (при медленной оптимизации). Цифры могут менятся но факт остаётся: тестер раскидывает по ядрам проходы причём парсит логику изменения глобалов. Уж как это реализовано не знаю

input uint x0=0;
int init=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!GlobalVariableCheck("cnt_tester"))
     {
      GlobalVariableSet("cnt_tester",1);
      init=1;
     }
   else
     {
      init=GlobalVariableGet("cnt_tester")+1;
      GlobalVariableSet("cnt_tester",init);
     }
   return(0);
  }
double OnTester(){return((double)init);}
 
Радость для всех любителей случайных чисел. В выходящем новом процессоре Intel Ivy Bridge встроен генератор случайных чисел 16- 32- и 64-х разрядных.  Они генерируются из теплового шума.  Вот скоро мы развернёмся :)-
Документация по MQL5: Математические функции / MathSrand
Документация по MQL5: Математические функции / MathSrand
  • www.mql5.com
Математические функции / MathSrand - Документация по MQL5
 
Здесь раздают.