Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Gomonov
8283
Vladimir Gomonov 2011.03.04 23:15 

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

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

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

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

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

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

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

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

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

:)

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

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

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

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

Vladimir Gomonov
8283
Vladimir Gomonov 2011.03.04 23:31  
sergeev:
с этим лучше в сервисдеск.

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

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

Nikolay Demko
12498
Nikolay Demko 2011.03.04 23:43  
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());}

Vladimir Gomonov
8283
Vladimir Gomonov 2011.03.05 00:46  
Urain:

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

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

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

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

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

;)

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

а) В функции 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...
Дмитрий Александрович
1705
Дмитрий Александрович 2011.03.05 00:56  
Где-то даааавно, видел библиотеку, которая считывала шумы с звуковухи и генерировала случайное число. :)
Только что-то найти не могу :)
Vladimir Gomonov
8283
Vladimir Gomonov 2011.03.05 01:03  
lea:

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

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

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

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

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

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

Vladimir Gomonov
8283
Vladimir Gomonov 2011.03.05 01:09  

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

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

Nikolay Demko
12498
Nikolay Demko 2011.03.05 01:17  
MetaDriver:

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

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

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

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

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

;)

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

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

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

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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий