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

 

Нужно было уникальное число в ините, различное в различных прогонах оптимизатора. Я не нашёл ни одного штатного способа добыть такое число.

Не сработали перед MathRound() : MathSrand(TimeLocal()), MathSrand(GetTickCount()) и т.п. - во всех этих случаях MathRand() генерил одну и ту же последовательность.

В том числе не получилось организовать счётчик прогонов через глобальную переменную - то ли тестер их моделирует внутри себя (собственный виртуальный набор),

то ли пока с ними не работает вообще. // В четвёрке я решал подобную задачу именно так.

В результате таки проблему свою "уникальную" решил, но пришлось не на шутку извратиться.

// Как - пока не скажу, подожду свежих идей.

Итак - конкурс!  Главный приз - почёт и уважуха.  :-) :-) :-) :-)

Особо поощряются в решениях оригинальность подхода и чувство юмора.

// Торопитесь, пока не появились штатные средства!!

:)

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
MetaDriver:

Нужно было уникальное число в ините, различное в различных прогонах оптимизатора. Я не нашёл ни одного штатного способа добыть такое число.

Не сработали перед MathRound() : MathSrand(TimeLocal()), MathSrand(GetTickCount()) и т.п. - во всех этих случаях MathRand() генерил одну и ту же последовательность.

с этим лучше в сервисдеск.

 
sergeev:
с этим лучше в сервисдеск.

Так не интересно. Они сделают, конечно. Достаточно этой ветки, чтоб напомнить.

Лучше поторопись пока не сделали. Есть оригинальные предложения?

 
MetaDriver:

Нужно было уникальное число в ините, различное в различных прогонах оптимизатора. Я не нашёл ни одного штатного способа добыть такое число.

Не сработали перед MathRound() : MathSrand(TimeLocal()), MathSrand(GetTickCount()) и т.п. - во всех этих случаях MathRand() генерил одну и ту же последовательность.


input uint x=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   MathSrand(x);for(uint i=0;i<MathRand();i++)MathRand();
   MathSrand((uint)TimeLocal()*MathRand());
   return(0);
  }
double OnTester(){return((double)MathRand());}

 
Urain:

У меня такой номер (со счётчиком) не прокатит, ибо используется генетический алгоритм и количество оптимизируемых параметров за раз 8-10.

// Хотя он вполне рабочий, для экспертов без внешних параметров. Если же параметры брать из файла, то тады ........ тады проще счётчик или рэндом брать из файла. ;-))

Т.е. если я счётчик такой сделаю, он в режиме ген-алгоритма станет "оптимизироваться" (подползать к конкретному глючному значению и на нём фиксироваться).

Подобный случай уже грустно описан на форуме: https://www.mql5.com/ru/forum/131308/page54

// см. мой ответ Figar0

;)

Где грань между подгонкой и реальными закономерностями? - MQL4 форум
  • www.mql5.com
Где грань между подгонкой и реальными закономерностями? - MQL4 форум
 

а) В функции OnInit() загружаем rand seed из файла (если файл отсутствует - инициализируем при помощи таймера), в функции OnDeinit() записываем в тот же самый файл (если файл отсутствует - создаём) новый rand seed для следующего старта советника/etc.

б) Использовать dll для генерации случайных чисел (можно прикрутить и Crypto API - http://msdn.microsoft.com/en-us/library/aa379942(v=vs.85).aspx )

CryptGenRandom function (Windows)
  • msdn.microsoft.com
The CryptGenRandom function fills a buffer with cryptographically random bytes. Syntax Parameters hProv [in] dwLen [in] Number of bytes of random data to be generated. pbBuffer [in, out] Buffer to receive the returned data. This buffer must be at least dwLen bytes in length. Optionally, the application can fill this buffer with data to...
 
Где-то даааавно, видел библиотеку, которая считывала шумы с звуковухи и генерировала случайное число. :)
Только что-то найти не могу :)
 
lea:

а) В функции OnInit() загружаем rand seed из файла (если файл отсутствует - инициализируем при помощи таймера), в функции OnDeinit() записываем в тот же самый файл (если файл отсутствует - создаём) новый rand seed для следующего старта советника/etc.

б) Использовать dll для генерации случайных чисел (можно прикрутить и Crypto API - http://msdn.microsoft.com/en-us/library/aa379942(v=vs.85).aspx )

Ага. Оба способа рабочие. По мне - первый проще, но это от "уровня испорченности мозга" зависит.  Зачёт.
 
mrProF:
Где-то даааавно, видел библиотеку, которая считывала шумы с звуковухи и генерировала случайное число. :)
Только что-то найти не могу :)

Мне тож попадалась. Помнится разборка на эту тему была на mql4 года два-три назад. Потом через год паузы кто-то и выложил таку бяку.

Правда в том топике искали "идеальный шумогенератор", а тут идеальность по условию не требуется.

Вобчем код на вашей совести. Найдёте - зачёт. ;-)

 

Моё решение было (есть) без файлов и dll (включая апи).

Эт я не к тому что запрещено по условию, так, выпендриваюсь просто... :)

 
MetaDriver:

У меня такой номер (со счётчиком) не прокатит, ибо используется генетический алгоритм и количество оптимизируемых параметров за раз 8-10.

// Хотя он вполне рабочий, для экспертов без внешних параметров. Если же параметры брать из файла, то тады ........ тады проще счётчик или рэндом брать из файла. ;-))

Т.е. если я счётчик такой сделаю, он в режиме ген-алгоритма станет "оптимизироваться" (подползать к конкретному глючному значению и на нём фиксироваться).

Подобный случай уже грустно описан на форуме: https://www.mql5.com/ru/forum/131308/page54

// см. мой ответ Figar0

;)

Владимир, я специально прикрутил возврат rand() в OnTester() чтоб по первому вызову ранда и графику тестирования даже на последовательном переборе можно было убедится что ранд инициализируется совершенно неповторимо (случайно).

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

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

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

ЗЫ прикручивать к оптимизируемому параметру нужно в случае если тестирование идёт так быстро что соседние вызовы попадают на один локалтайм. Иначе же если прогоны идут достаточно долго то можно обойтись просто инициализацией через локалтайм.