Случайное не случайно!

 

Тема генерации случайных чисел в MT4 уже обсуждалась, но я не нашел ответа на такой вопрос:

Почему случайные числа в тестере стратегий не СЛУЧАЙНЫ?!

int day = 0;

int init(){
//----
      MathSrand(TimeLocal());
//----
return(0); }

int start(){
//----
int rnd = MathRand();
//---- Условия для сделки
if (day<=TimeCurrent()-86400){
if ( rnd < 32767 / 2 ) { Print("Случайное число: ", rnd); }
if ( rnd > 32767 / 2 ) { Print("Случайное число: ", rnd); }
day = TimeCurrent();
}
//----
return(0); }

Код компилить в виде советника.

Если прогнать данный код в тестере стратегий несколько раз, то имеем.

2010.07.23 08:27:53 2010.07.22 22:19 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 12843
2010.07.23 08:27:53 2010.07.21 22:18 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 27974
2010.07.23 08:27:53 2010.07.20 22:16 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 6785
2010.07.23 08:27:53 2010.07.19 22:15 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 28127
2010.07.23 08:27:53 2010.07.18 22:15 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 19801
2010.07.23 08:27:53 2010.07.16 00:00 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 3627
2010.07.23 08:27:53 2010.07.15 00:00 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 23933
2010.07.23 08:27:53 2010.07.14 00:00 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 18663
2010.07.23 08:27:53 Test started for testing
2010.07.23 08:27:39 2010.07.22 22:19 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 12843
2010.07.23 08:27:39 2010.07.21 22:18 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 27974
2010.07.23 08:27:39 2010.07.20 22:16 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 6785
2010.07.23 08:27:39 2010.07.19 22:15 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 28127
2010.07.23 08:27:39 2010.07.18 22:15 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 19801
2010.07.23 08:27:39 2010.07.16 00:00 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 3627
2010.07.23 08:27:39 2010.07.15 00:00 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 23933
2010.07.23 08:27:39 2010.07.14 00:00 Test EURUSD,M1: Ñëó÷àéíîå ÷èñëî: 18663

Явно видно что последовательность чисел совпадает, хотя по идеи должна отличаться т.к.

MathSrand(TimeLocal());
 
HIDDEN:

Тема генерации случайных чисел в MT4 уже обсуждалась, но я не нашел ответа на такой вопрос:


Отвечу немного не в тему, но ближе с практической стороны - если нужны действительно более-менее качественные псевдослучайные числа, лучше не использовать стандартный генератор. Как вариант, могу посоветовать то, чем сам пользовался, алгоритм MT19937:

https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%85%D1%80%D1%8C_%D0%9C%D0%B5%D1%80%D1%81%D0%B5%D0%BD%D0%BD%D0%B0

Тут есть ссылка на C-версию, которую при желании несложно переделать в DLL.

 
HIDDEN:

Тема генерации случайных чисел в MT4 уже обсуждалась, но я не нашел ответа на такой вопрос:

Почему случайные числа в тестере стратегий не СЛУЧАЙНЫ?!

....

Явно видно что последовательность чисел совпадает, хотя по идеи должна отличаться т.к.

Начнём с банального, генератор случайных чисел в МТ совсем не "случайный". Продолжим тем, что время в тестере эмулируется, т.е. сколько бы прогонов ты не сделал TimeLocal для них для всех будет одинаковый. Итого: ты при каждом прогоне инициализируешь "не совсем случайный" генератор случайных чисел одним и тем же значением. Соответственно, твои последовательности просто обязаны совпадать.
 

Из справки:

datetime TimeLocal( )
Возвращает локальное компьютерное время в виде количества секунд, прошедших после 00:00 1 января 1970 года.
Замечание: при тестировании локальное время моделируется и совпадает с моделированным последним известным временем сервера.

Т.е. получается, что генератор устанавливается в одно и тоже начальное состояние.


"Я так думаю"(c) - не помню из какого фильма.

PS timbo меня опередил.

PPS что бы не говорили, качества штатного ГСЧ вполне хватает для практических задач. Если конечно не моделируется движение материи внутри Солнца. :)

 
timbo:
Начнём с банального, генератор случайных чисел в МТ совсем не "случайный". Продолжим тем, что время в тестере эмулируется, т.е. сколько бы прогонов ты не сделал TimeLocal для них для всех будет одинаковый. Итого: ты при каждом прогоне инициализируешь "не совсем случайный" генератор случайных чисел одним и тем же значением. Соответственно, твои последовательности просто обязаны совпадать.

Какое отношение TimeLocal имеет к эмулированию в тестере? И в чём логика эмулировать локальное время в том же тестере.

Решение данного вопроса существует в рамках штатного MQL4 или делать придется с внешней DLL.

 
joo:

Из справки:

"Я так думаю"(c) - не помню из какого фильма.

Если что-то не работает, прочитай инструкцию. Спасибо, пойдём другим путем.
 
HIDDEN:

Какое отношение TimeLocal имеет к эмулированию в тестере? И в чём логика эмулировать локальное время в том же тестере.

А какое локальное время должно быть в тестере, когда он тестирует январские котировки? Вполне логично, что январское, а не июльское... Решения этой проблемы, если считать это проблемой, средствами MQL, лично я не вижу. Тестер сделан достаточно хорошо, чтобы его недопускать. Идентичные прогоны всегда дадут идентичный результат. И это, наверное, правильно.

 
Штатное решение нашлось MathSrand(GetTickCount());
 
HIDDEN:

Тема генерации случайных чисел в MT4 уже обсуждалась, но я не нашел ответа на такой вопрос:

Почему случайные числа в тестере стратегий не СЛУЧАЙНЫ?!

Явно видно что последовательность чисел совпадает, хотя по идеи должна отличаться т.к.

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

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

Как дать советнику доступ к такой программе? Правильно, через DLL. Если Вы можете написать ДЛЛ-ку самостоятельно, то Ваша проблема будет решена Вами же. В противном случае нужно учить что-то типа С++ или того же Delphi.

Среди языков программирования, например, Фортран до сих пор  используется как язык, предназначенный для научных вычислений - у него довольно богатый инструментарий для этого - он изначально создавался для научных вычислений. С фортраном на этой почве практически ни кто не конкурирует. Сами понимаете, что там где вычисления, там и случайности. Думаю, стОит попробовать полистать мануал по этому языку. Правда вот не знаю, можно ли на фортране делать DLL-ки. Наверно можно - компилятор-то у него имеется. 

Вот Вам ссылка на несколько книг по этому языку - может найдёте в них что-то для себя. http://depositfiles.com/files/79gafmuo1 

 

Если хочешь получать каждый раз разные значения, то функцию MathSrand()нужно привязать к чему-нибудь переменному. Можно воспользоваться API функцией и запросить системное время (длительность работы системы). На языке Visual Basic это выглядит так:

Option Explicit

Public Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type

Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)

Sub test()
    Dim k As SYSTEMTIME
    GetSystemTime k
    MsgBox "" & k.wHour & ":" & k.wMinute & ":" & k.wSecond
End Sub

Как это перевести в код MQ4 - незнаю. Сложность возникает, когда необходимо передать в параметр lpSystemTime массивный тип.

 
EvgeTrofi:

Если хочешь получать каждый раз разные значения, то функцию MathSrand()нужно привязать к чему-нибудь переменному. Можно воспользоваться API функцией и запросить системное время (длительность работы системы). На языке Visual Basic это выглядит так:

Как это перевести в код MQ4 - незнаю. Сложность возникает, когда необходимо передать в параметр lpSystemTime массивный тип.


GetTickCount()
Причина обращения: