Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Спасибо, теперь есть чем генерить случайное число.
Вот про GetTickCount я спрвку и не посмотрел. По названию подумал, что это с тиками связано, а оказывается это время)))
Тот-же код вставил в OnInit(), советник прикрепил к графику и три раза перезапустил терминал:
Выше вставил результат второго запуска.
Интересно, есть ли риск того, что многопоточная оптимизация запустится с разницей во времени меньше 1 миллисекунды. Т.е. с одинаковым GetTickCount?
в GetTickCount разница в 1 миллисекунду.
Интересно, есть ли риск того, что многопоточная оптимизация запустится с разницей во времени меньше 1 миллисекунды. Т.е. с одинаковым GetTickCount?
Да! Запускаются потоки с разницей меньше 1 мс.
Код советника
Запустил оптимизацию с параметрами i1 от 1 до 10
Результаты для 10 потоков (записаны в файлы в общей папке MetaQuotes\Terminal\Common\Files)
1) 370755548 = 370755548 rand=19589 = 5
2) 370755626 = 370755626 rand=19843
3) 370755564 = 370755564 rand=19641 = 9
4) 370755610 = 370755610 rand=19791 = 8
5) 370755548 = 370755548 rand=19589 = 1
6) 370755595 = 370755595 rand=19742
7) 370755548 = 370755548 rand=19589
8) 370755610 = 370755610 rand=19791 = 4
9) 370755564 = 370755564 rand=19641 = 3
10) 370755642 = 370755642 rand=19896
из 10 - 6 прогонов получат совпадающие GetTickCount и соответственно результат от генератора случайных чисел. Повторы случаются и при других запусках.
Кто-то знает? Глобальные переменные между разными потоками оптимизатора видны друг другу?
Если нет, тогда все это не важно.
Если нет, тогда все это не важно.
Проверил - не видны и не могут быть перезаписаны, хотя ранды и GetTickCount совпадают:
1) prev_g_var=0; my_g_var=372627092; GetTickCount = 372627092; rand=3648
3) prev_g_var=0; my_g_var=372627092; GetTickCount = 372627092; rand=3648
В общем для моих задач этот баг / особенность (очень быстрого <1 мс, запуска потоков оптимизации) не имеет значения.
... хотя ранды и GetTickCount совпадают...
Совпадают. Жутко неудобно. Поднимала эту тему ранее.
Делал однажды давно, ещё на старой четвёрке, генерацию уникального имени. Вернее - постфикса для имени. Пришлось костыли делать - если после генерации имя существует, то в цикле while() добавлять цифру к сгенерированному имени, пока имена совпадают.
Так я также сначала решила вопрос: генерация, и если имя существует, то плюс цифра. Потом подумала и убрала генерацию. А смысл? Если имя существует, то плюс цифра.
в GetTickCount разница в 1 миллисекунду.
Интересно, есть ли риск того, что многопоточная оптимизация запустится с разницей во времени меньше 1 миллисекунды. Т.е. с одинаковым GetTickCount?
А как винда захочет, так и запустит. Если не будет нагрузки в системе, запустит потоки процесса с минимальной задержкой. А потоков в системе несколько тысяч, все непредсказуемо. У Рихтера все хорошо расписано. Кстати, есть же GetMicrosecondCount(), там точность выше в 1000 раз.
А вообще, если надо гарантированно уникальный счетчик, надо использовать счетчик тактов процессора, но это уже dll с ассемблерной вставкой. Если надо, кину ссылку на мой код на другом форуме, там это сделано.
нужно "гарантированное получение неповторяющейся последовательности MathSrand()"
В оптимизаторе получается, что все будет повторяющимся. И TimeLocal() и GetTickCount и TimeCurrent() - будут одинаковы при запусках каждого прогона (если верить справке)
Вы немного неправильно понимаете значение функции MathSrand. Начнем с того, что сама последовательность псевдослучайных чисел выдаваемая MathRand конечна и повторяется. т.е. это ни какие не бесконечные случайные числа, а просто большой ряд последовательности чисел (которые выглядят как якобы случайные). Когда ряд заканчивается, MathRand начинает выдавать числа сначала этой последовательности, и значения начинают повторятся вновь.
MathSrand просто указывает функции MathRand, с какого места последовательности псевдослучайных чисел их необходимо выдавать.
В Вашем вопросе не видно необходимости использования случайных чисел. Почему вместо случайных чисел не использовать обычный счетчик 1, 2, 3...? - Значения никогда не повторятся.
Если так необходимо использовать именно случайное число, то могу порекомендовать посмотреть в сторону симметричного шифрования счетчика - вероятность образования коллизии равна нулю, т.е. Вы гарантировано получите уникальное, нормально-распределенное число, характеризующее прогон.