такой странный MathRand - страница 2

 
Oksana Berenko:
я тоже проверила, уже ради любопытства, не получилось

дак поставьте int, поиздеваемся чуток)

если не получится, значит я чо та ступил)

 
new-rena:

дак поставьте int, поиздеваемся чуток)

если не получится, значит я чо та ступил)

MathSrand не возвращает никакого значения, это функция void, поэтому на неё умножать некорректно

void  MathSrand(
   int  seed      // инициализирующее число
   );
 
...а ещё 1000*GetTickCount() по-моему приводит к переполнению.

Даже если писать
uint value = 1000*GetTickCount();


Корректнее будет:
double value = 1000.0 * GetTickCount();

Но MathRand принимает int, так что будет ли вообще корректно работать с double - большой вопрос (скорее всего тупо к верхней границе типа int приводить будет, а потому в любой момент программы всегда будет выполняться инициализация рандома одним и тем же значением.)
 
Sergey Eremin:

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

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

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

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

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


понял... чапай думает)

не, ничо на ум не приходит, т.к. генерится за один тик одно и то же число.

придется открыть два раза, за два тика.

 

Я бы использовал счетчик, и включал бы в название линий номер.

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

 
George Merts:

Я бы использовал счетчик, и включал бы в название линий номер.

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

запинать в инициализацию цикл в два прогона?
 

Можно примерно так:

      int value = GetTickCount();
      string glVariableName = (string)ChartID()+"RandInitValue";
      if(!GlobalVariableCheck(glVariableName))
      {
         GlobalVariableSet(glVariableName, value);         
      }
      else
      {
         value =(int)GlobalVariableGet(glVariableName) + 1;
         GlobalVariableDel(glVariableName);
      }
      
      MathSrand(value);
      
      LineName  = LineName + (string)TimeCurrent() + "_"+(string)MathRand() + "_"+(string)MathRand();
      
      Print(value," ", LineName);

Вывод:


Это если только два индикатора планируется запускать. Ну и в таком случае я бы проверял количество запущенных индикаторов на графике, и если их больше двух - INIT_FAILED (не давать третий запускать).

 
Sergey Eremin:

Можно примерно так:

Вывод:


Это если только два индикатора планируется запускать. Ну и в таком случае я бы проверял количество запущенных индикаторов на графике, и если их больше двух - INIT_FAILED (не давать третий запускать).

да да. я тоже про start подумал. накидает....
 
Sergey Eremin:

Можно примерно так: GlobalVariableCheck...

Мне понравилась идея! Если вместо if использовать while, то без разницы, сколько индикаторов на графике! Попробую, напишу.
 
Oksana Berenko:
Мне понравилась идея! Если вместо if использовать while, то без разницы, сколько индикаторов на графике! Попробую, напишу.

Посмотрите в сторону такого варианта,

int i=0;
string Line_name1=NULL,Line_name2=NULL;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
while()
  {
   Line_name1=StringConcatenate("UPLine",i);
   Line_name2=StringConcatenate("DWLine",i);
   if(ObjectFind(Line_name1)==0 || ObjectFind(Line_name2)==0)
      i++;
   else
      break;
  }
//+------------------------------------------------------------------+

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

input string Prefix="VR";
string Line_name1=NULL,Line_name2=NULL;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Line_name1=StringConcatenate(Prefix,"UPLine");
   Line_name2=StringConcatenate(Prefix,"DWLine");

  return(INIT_SUCCEEDED);
   }
//+------------------------------------------------------------------+

Удаление только обьектов одного индикатора будет выглядеть так

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   if(ObjectsDeleteAll(0,Prefix)<=0)
      Print(" ObjectsDeleteAll Prefix ",Prefix," Error ",GetLastError());
   else
      Print("Objects of the indicator deleted successfully !");
  }
//+------------------------------------------------------------------+
Причина обращения: