Скачать MetaTrader 5

такой странный MathRand

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

Есть индикатор Line_Sound, который создает трендовую линию с именем:

string LineName  = "HLine_Sound_" + (string)TimeCurrent() + "_"+(string)MathRand() + "_"+(string)MathRand();

Если на график добавить еще индикатор Line_Sound, то на графике будет две линии, никакого конфликта.

Имена: HLine_Sound_1441373185_3692_23760 и HLine_Sound_1441373186_9757_27839

Но если же выключить и включить терминал, то при инициализации имена будут одинаковые!

1 

Вот как так? В индикаторе, два раза помещенном на графике, два раза сработал одинаково рандом? 

Sergey Eremin
4466
Sergey Eremin  

Возможно дело в том, что документация явно говорит:

Перед первым вызовом функции необходимо использовать функцию MathSrand, чтобы перевести генератор псевдослучайных чисел в начальное состояние.

MathSrand - Документация на MQL4
  • docs.mql4.com
MathSrand - Документация на MQL4
Oksana Berenko
2773
Oksana Berenko  
Sergey Eremin:

Возможно дело в том, что документация явно говорит:

Я пока не придумала, какое число в MathSrand поместить. Потому что, если делать так: MathSrand(GetTickCount()), то результат тот же. 
Sergey Eremin
4466
Sergey Eremin  
Oksana Berenko:
Я пока не придумала, какое число в MathSrand поместить. Потому что, если делать так: MathSrand(GetTickCount()), то результат тот же. 

Хмм, тогда не могли бы сам индикатор дать посмотреть (можно в личку)?

Alexander Puzanov
33443
Alexander Puzanov  
Чем-то значения настроек этих индикаторов различаются, иначе зачем их 2? Включите эту настройку (или неск настроек) в имя объекта вместо этого МатаРэнда
Oksana Berenko
2773
Oksana Berenko  
Alexander Puzanov:
Чем-то значения настроек этих индикаторов различаются, иначе зачем их 2? Включите эту настройку (или неск настроек) в имя объекта вместо этого МатаРэнда

Этот индикатор - это алерт.

Вот индикатор один на графике.

 3

Вот их два.

 4

Я уже обошла проблему - создаю линию в init, и если уже на графике есть линия с таким же названием, то присваиваю другое имя.

Мне не придумать, как не создавая линию в init, чтобы у переменной  LineName были разные значения.

Renat Akhtyamov
6654
Renat Akhtyamov  
Oksana Berenko:
Я пока не придумала, какое число в MathSrand поместить. Потому что, если делать так: MathSrand(GetTickCount()), то результат тот же. 
GetTickCount()*MathSrand(1000)
Oksana Berenko
2773
Oksana Berenko  
new-rena:
GetTickCount()*MathSrand(1000)

Вначале обрадовалась вашей идее - решила проверить, не получилось.

 

Я уже по своему решила  - перенесла создание имени из init в start. 

Renat Akhtyamov
6654
Renat Akhtyamov  
Oksana Berenko:

Здорово! Не догадалась бы.

Я уже по своему решила  - перенесла создание имени из init в start. 

ок
Sergey Eremin
4466
Sergey Eremin  
new-rena:
GetTickCount()*MathSrand(1000)

int умножить на void? О_о

Даже если имелось в виду

MathSrand(1000*GetTickCount());

То ничего не меняется - в момент инициализации GetTickCount() вернёт в двух индикаторах одинаковое значение, следовательно и GetTickCount()*1000 будет одинаковым.

К примеру, вывод такого кода:

      int value = 1000*GetTickCount();
      MathSrand(value);
      LineName  = LineName + (string)TimeCurrent() + "_"+(string)MathRand() + "_"+(string)MathRand();
      
      Print(value," ", LineName);

запущенного в двух экземплярах, при старте терминала будет таким:


Oksana Berenko
2773
Oksana Berenko  
Sergey Eremin:

int умножить на void? О_о

Даже если имелось в виду

То ничего не меняется - в момент инициализации GetTickCount() вернёт в двух индикаторах одинаковое значение, следовательно и GetTickCount()*1000 будет одинаковым.

К примеру, вывод такого кода:

запущенного в двух экземплярах, при старте терминала будет таким:


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