Генератор уникального идентификатора для конкретного показателя - страница 3

 
Ovo: Не уверен, что вы имели в виду "научил". Я использую несколько из них для отладки, но для __DATETIME__ я пока не нашел применения... куда вы нацелились?

Извините, забыл, что вы ищете один и тот же индикатор для нескольких окон.

Попробую придумать что-нибудь другое.

===============================================

А-ха, я понял. Создайте функцию, которая вычисляет приличную длину.

Затем верните промежуток времени, за который функция завершится, в качестве уникального числа.

 

TimeCurrent() - это уникальное число...

Почему бы вам не попробовать использовать время, которое вы прикрепляете к инди? Сохраните его в метке.

 
Ovo:
Потому что я не испытываю каждый совет. Я выбираю только те, которые имеют смысл.
Я предлагаю вам умерить свое высокомерие по отношению к людям, которые пытаются вам помочь. Такое отношение не приветствуется на этом форуме.
 
angevoyageur:
Я предлагаю вам умерить свое высокомерие по отношению к людям, которые пытаются вам помочь. Такое отношение не приветствуется на этом форуме.

Я постараюсь держаться подальше.
 

Как вы можете говорить, что моя идея бессмысленна?

Текущее время - это уникальное число...

Попробуйте этот код... прикрепите его на один график... но с разным входным периодом.

#property strict
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
extern int periode=4;
int OnInit()
  {
//--- indicator buffers mapping
string shortname=StringConcatenate(WindowExpertName(),"_",periode);
IndicatorShortName(shortname);
int wind=WindowFind(shortname);
string name=StringConcatenate("TIME_TAG",wind);
  if (ObjectFind(name)!=wind)
  {  ObjectCreate(name, OBJ_LABEL, wind, 0, 0);
      ObjectSet(name, OBJPROP_CORNER,2);
      ObjectSet(name, OBJPROP_XDISTANCE,2 );
      ObjectSet(name, OBJPROP_YDISTANCE,5); 
      ObjectSetText(name,DoubleToStr(TimeCurrent(),0)+DoubleToStr(wind,0) ,9,"Arial",Yellow);   
  }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
WDholic:

time current - уникальное число...

TimeCurrent() не является уникальным числом при различных возможных обстоятельствах, включая следующие:

* Вы перезапускаете копию MT4 с несколькими существующими графиками и несколькими индикаторами, прикрепленными к этим графикам. Все они будут инициализированы одновременно и увидят одно и то же TimeCurrent().

*Вы добавляете копии индикатора в период низкой ликвидности. В зависимости от типа ценового фида вашего брокера, могут быть периоды, когда в течение 5-10 секунд нет новых тиков, а TimeCurrent() не меняется. Если вы добавите новые индикаторы в такой период, то они получат то же значение для TimeCurrent().

 
string name=StringConcatenate("TIME_TAG",wind);
  if (ObjectFind(name)!=wind)
  {  ObjectCreate(name, OBJ_LABEL, wind, 0, 0);
      ObjectSet(name, OBJPROP_CORNER,2);
      ObjectSet(name, OBJPROP_XDISTANCE,2 );
      ObjectSet(name, OBJPROP_YDISTANCE,5); 
      ObjectSetText(name,DoubleToStr(TimeCurrent(),0)+DoubleToStr(wind,0) ,9,"Arial",Yellow);   
  }

только добавление метки времени, если мы не можем найти метку TIME TAG

поэтому не удаляйте метку TIME TAG при деинициализации... чтобы значение никогда не менялось.

Хорошо... если мы боимся, что не будет тика в течение 5 или 10 секунд, мы можем использовать TimeLocal вместо Time Current.

 
WDholic:

только добавление метки времени, если мы не можем найти метку TIME TAG

поэтому не удаляйте метку TIME TAG при деинициализации... чтобы значение никогда не менялось.

Хорошо... если мы боимся, что не будет тика в течение 5 или 10 секунд... возможно, мы можем использовать TimeLocal вместо Time Current

... Существует также проблема, о которой говорилось выше об объектах графика: если вы добавите индикатор на график, а затем создадите шаблон, все новые графики, созданные на основе шаблона, будут иметь то же значение TIME_TAG. А использование объекта позволяет только один экземпляр индикатора на график; несколько индикаторов получат один и тот же ID, если не поместить все возможные параметры в IndicatorShortName.

 
gchrmt4:

... Существует также проблема, о которой говорилось выше в отношении объектов графика: если вы добавите индикатор на график, а затем создадите шаблон, все новые графики, созданные на основе шаблона, будут иметь одно и то же значение TIME_TAG. А использование объекта позволяет только один экземпляр индикатора на график; несколько индикаторов получат один и тот же ID, если вы не поместите все возможные параметры в IndicatorShortName.


Пожалуйста, попробуйте...

если вы поместите 5 инди в разные настройки с 1 шаблоном...

например... значение времени 111111000

в окне 1 будет показано 1111110001
в окне 2 будет показано 1111110002
в окне 3 будет показано 1111110003
в окне 4 будет показано 1111110004

в окне 5 будет показано 1111110005

потому что я включаю номер окна

ObjectSetText(name,DoubleToStr(TimeCurrent(),0)+DoubleToStr(wind,0),9,"Arial",Yellow);


несколько индикаторов получат один и тот же ID, если вы не поместите все возможные параметры в IndicatorShortName.

Да... это было бы хорошо рассмотреть.

но я думаю, что это будет легко для таких мастеров кодинга, как OVO и Вы.

 
WDholic:

если вы поместите 5 инди в разные настройки с одним шаблоном...

Я не знаю, какую версию MT4 вы используете, но на v616 на моем компьютере WindowFind() возвращает -1 во время OnInit(). В документации всегда говорилось "WindowFind() возвращает -1, если пользовательский индикатор ищет сам себя во время работы функции init()."
Причина обращения: