MQL4 - automated forex trading   /  

Форум

У кого есть корректный "датчик случайных чисел")) -поделитесь

К списку тем  | 1 2 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
1302
George-on-Don 07.02.2006 13:05 
День добрый)) Хочу протестировать ТС со случайным открытием позиции (либо buy либо sell) - но вот беда)))) ни как нем огу приноровиться к функциям mathSrand и mathRand))) - все время генерятЬ одни и те же "случайные" последовательности))) и синхронно-одинаковые по всем парам)))
я использую следующий код
в начале каждого часа -
MathSrand(LocalTime());
rr = MathRand();
MathSrand(rr);
rr1 = MathRand();
rr2= rr-rr1;
а затем либо rr2 >0 либо <0 - исходя из которого и наступает "событие" - покупка или продажа ))
Пока я добился того что по всем тестируемым парам - все пары дружно идит либо в короткую либо в длинную))-
Есть у кого нибудь предложения?)))

Бесплатная Groupware для групп разработчиков

Установите систему групповой работы TeamWox и объедините усилия всех разработчиков. Это поможет вашей команде работать быстрее и организованнее. Благодаря TeamWox станет намного проще ставить задачи и контролировать их выполнение.


avatar
Модератор
33759
Rosh 07.02.2006 13:23 
MathSrand() нужно делать только один раз перед генерацией случайной последовательности. Только вот как будет вести себя LocalTime() в тестере - этот вопрос я не изучал.

avatar
1302
George-on-Don 07.02.2006 13:24 
Rosh:
MathSrand() нужно делать только один раз перед генерацией случайной последовательности. Только вот как будет вести себя LocalTime() в тестере - этот вопрос я не изучал.
Поставить его в Init()? Где он будет инициализироваться только один раз?

avatar
Модератор
5198
stringo 07.02.2006 14:37 
Rosh:
Только вот как будет вести себя LocalTime() в тестере - этот вопрос я не изучал.
LocalTime будет отдавать тестовое значение. Кстати, CurTime будет отдавать то же самое значение.
Отсюда вывод: при тестировании на одной и той же последовательности инициализация рандомайзера будет производиться одним и тем же значением. И последующий ряд "случайных" чисел будет каждый раз тем же самым!

avatar
Модератор
3646
Renat 07.02.2006 15:06 
Один раз в init вызовите MathSrand( GetTickCount() ) - этого будет достаточно.

avatar
1302
George-on-Don 07.02.2006 15:21 
Renat:
Один раз в init вызовите MathSrand( GetTickCount() ) - этого будет достаточно.
Спасибо)) -попробую таким образом))

avatar
Модератор
33759
Rosh 07.02.2006 16:27 
stringo:
Rosh:
Только вот как будет вести себя LocalTime() в тестере - этот вопрос я не изучал.
LocalTime будет отдавать тестовое значение. Кстати, CurTime будет отдавать то же самое значение.
Отсюда вывод: при тестировании на одной и той же последовательности инициализация рандомайзера будет производиться одним и тем же значением. И последующий ряд "случайных" чисел будет каждый раз тем же самым!
Вот эту бяку я и имел ввиду. Как получить рандомайзную инициализирующую величину? Чтобы новые прогоны давали новую случайную последовательность. Я на эти грабли наступил еще в МТ3.

avatar
4498
KimIV 07.02.2006 20:44 
Rosh:
Вот эту бяку я и имел ввиду. Как получить рандомайзную инициализирующую величину? Чтобы новые прогоны давали новую случайную последовательность. Я на эти грабли наступил еще в МТ3.
Даю идею. Бесплатно :-).
1. На любой график повесить либо советника, либо зацикленный скрипт, который пишет в файл значение CurTime().
2. В ините тестируемого советника читать содержимое этого файла.

avatar
Модератор
33759
Rosh 07.02.2006 21:19 
Ай маладэс. Идею чтения из файла я сразу рассмотрел, но споткнулся о необходимость как-то обновлять содержимое (вручную влом каждый раз).
Черт, смутно вспоминаю, что папки файлов тестера и экпертов разнесены и взаимопрониконовение запрещено. Или я путаю?

avatar
Модератор
3646
Renat 07.02.2006 21:23 
Все программисты нормально пользуются srand() и rand(), а тут проблему развели :)
MathSrand( GetTickCount() ), а дальше сколько угодно вызовов MathRand()

avatar
Модератор
33759
Rosh 07.02.2006 21:56 
Опа, первый раз такую вижу в МТ4, она там давно? Тогда проблем нет вообще :)
int GetTickCount( )

Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы. Ограничено разрешающей способностью системного таймера.

Пример:

int start=GetTickCount();
// некие серьёзные вычисления...
Print("Время вычисления ", GetTickCount()-start, " миллисекунд.");
К списку тем   | 1 2  

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