Способ определения номера подокна

 
Бывают случаи, когда один и тот же индикатор, рисующий графику, подсоединен несколько раз.
Определить номер подокна для копии. бывает затруднительно - короткое имя может быть одинаковым для всех (ну, например, громоздко в нем отображать все параметры индикатора).
Возникает проблема: как отличить индикаторы друг от друга для рисования в своем подокне.

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

Кроме того, локальное время прикрепления использую как часть имени объекта.

string IndTime; // дата и время подключения индикатора по комп.(лок.) времени
string ShortName; // имя инидкатора для вывода
int win; // номер подокна индикатора


int init()
  {
   //----------------
   //----------------
   //----------------
   //----------------
   //----------------
   IndTime=TimeToStr(TimeLocal()); // время прикрепления индикатора по комп.(лок.) времени
   ShortName="Имя индикатора";
   IndicatorShortName(ShortName);
   return(0);
  }

int start()
  {
// выяснение текущего номера подокна инидкатора
   IndicatorShortName(IndTime); // короткое имя = времени прикрепления индикатора к инструменту
   win=WindowFind(IndTime); // номер подокна
   IndicatorShortName(ShortName); // восстановление имени индикатора
   //----------------
   //----------------
   //----------------
   //----------------
   //----------------
   return(0);
  }


Кстати, довольно странно, что в MQL4 нет возможности создавать объекты в своем подокне без выяснения его номера. Например, было бы логично, если номер подокна задан как -1, то объект создается в подокне индикатора. Хотя, это все равно не снимает проблему уникальности имени объектов для копий индикаторов - тогда пришлось бы через глобальные терм. переменные крутиться...

 

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

Таким образом выясняют кто из них кто и под каким номером. Эксперт тоже это знает и раздаёт графические объекты и вертикальную развёртку по подокнам.

 
Zhunko >>:

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

Таким образом выясняют кто из них кто и под каким номером. Эксперт тоже это знает и раздаёт графические объекты по подокнам.

Да, этот способ, как альтернатива гл.терм. переменным я тоже юзаю - почти массивы!)))

Но я о другом немного писал - о различении копий индикаторов и созданных ими гр. объектов.

Потом, когда открыто много подокон, при уничтожении части из них - возникает геморой с изменением номера подокна. Здесь этой проблемы нет как таковой.


Для генерации уникального имени использую такую сабрутину:

// подпрограмма генерации уникального имени граф.объекта с занесением его в буфер  
string DrawArray() 
  {string out;
   
   DrawCnt++; // счетчик граф. объектов
   out=IndTime+": "+DrawCnt; // имя объекта = время подсоединения индикатора + счетчик граф. объектов
   ArrayResize(Draw,DrawCnt); // увеличение массива граф. объектов на 1
   Draw[DrawCnt-1]=out; // занесение имени объекта в массив

   return(out); // возврат уникального имени объекта
  }

Счетчик, ясен пионер, в головной част объявлен. Так же как и массив объектов.

Деинициализация, соответственно, так:

int deinit()
  {
   for(int i=0; i<DrawCnt; i++) ObjectDelete(Draw[i]); // Стереть созданные индикатором объекты
   ArrayResize(Draw,1); DrawCnt=0; // сброс массива и счетчика
   return(0);
  }
Если используется IndicatorCounted() и связанные с ней стандартные конструкции, то сброс счетчика, деинит нужно делать при ее обнулении - иначе каша будет на экране.
 
Svinozavr >>:

Да, этот способ, как альтернатива гл.терм. переменным я тоже юзаю - почти массивы!)))

Но я о другом немного писал - о различении копий индикаторов.

Потом, когда открыто много подокон, при уничтожении части из них - возникает геморой с изменением номера подокна. Здесь этой проблемы нет как таковой.

При удалении подокна другие индикаторы и эксперт об этом узнают и переинициализируются.

Отслеживаю и контроллирую:

1. Номер подокна.

2. Порядковый номер индикатора. Это чтобы при удалении других индикаторов не было проблем.

3. Постфикс имени индикатора.

 
Zhunko >>:

При удалении подокна другие индикаторы и эксперт об этом узнают и переинициализируются.

Отслеживаю и контроллирую:

1. Номер подокна.

2. Порядковый номер индикатора. Это чтобы при удалении других индикаторов не было проблем.

3. Постфикс имени индикатора.

ок.

Дано:

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

Задача:

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


Если вашим способом это решается компактней, проще и изящней - с удовольствием воспользуюсь. (У меня подобный вашему способ получился очень громоздким и не гибким - поэтому сделал то, что сделал))).)

Покажите, как это решено у вас.


з.ы. Что значит "переинициализируются"? Стирается все и рисуется заново?

 

С одинаковыми именами не получиться.

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

Можно и без переинициализации, но уж больно сложно всё получается. Пересчитать проще.

Перемещение объектов на графике почти не загружает МТ4. В отличии от их создания и операций с индикаторными буферами. Т.е. стирать ни чего не надо.

 
Zhunko >>:

С одинаковыми именами не получиться.

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

Можно и без переинициализации, но уж больно сложно всё получается. Пересчитать проще.

Перемещение объектов на графике почти не загружает МТ4. В отличии от их создания и операций с индикаторными буферами. Т.е. стирать ни чего не надо.

Так получилось же. Можно сделать моим способом и разные имена - достаточно просто прибавить к имени индюка его времени прикрепления. И все. По-моему, проще некуда. И ничего не надо ни переинициализировать, ни пересчитывать. Каждое имя получается уникальным, каждый создаваемый им объект содержит в имени время прикрепления и тоже уникален и привязан жестко к создавшему ему индюку.

Не знаю. Я так и не понял, у вас проще?

 
Svinozavr >>:

Так получилось же. Можно сделать моим способом и разные имена - достаточно просто прибавить к имени индюка его времени прикрепления. И все. По-моему, проще некуда. И ничего не надо ни переинициализировать, ни пересчитывать. Каждое имя получается уникальным, каждый создаваемый им объект содержит в имени время прикрепления и тоже уникален и привязан жестко к создавшему ему индюку.

Не знаю. Я так и не понял, у вас проще?

Если добавляете время, то не получилось. Это уже совсем другое имя индикатора.

Мне такой способ не подходит. Все вычисления провожу в эксперте. Индикатор у меня является просто пустым окном. Он принимает графические объекты от эксперта.

 

Если добавляете время, то не получилось. Это уже совсем другое имя индикатора.

??? Вы, вообще-то, первый пост читали? В подокнах все копии индикатора выводятся под ОДНИМ именем и все корректно рисуют у себя в окнах, не мешая друг дружке. Если нужно получать свойства гр. объектов конкретного индикатора, то и тогда можно обойтись без его уникального шортнейма - все имена граф.объектов привязаны к конкретному индикатору временем его прикрепления. Можно это время добавить к шортнейму. А можно и не - совсем необязательно.


Мне такой способ не подходит. Все вычисления провожу в эксперте. Индикатор у меня является просто пустым окном. Он принимает графические объекты от эксперта.


Я и говорю (см. выше) - мы о разных задачах.

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


Ну, тем не менее, спасибо за общение. Успехов.

 
Svinozavr >>:
Бывают случаи, когда один и тот же индикатор, рисующий графику, подсоединен несколько раз.

Все просто.

Задаете текстовый идентификатор и выносите его во внешние параметры, затем ручками задаете.

У советников магик по-хорошему задается ручками, Здесь практически тот же случай.

____

Ваш способ тоже неплох. Но при загрузке терминала.... Может тогда лучше использовать GetTickCount?

 
TheXpert >>:

Все просто.

Задаете текстовый идентификатор и выносите его во внешние параметры, затем ручками задаете.

У советников магик по-хорошему задается ручками, Здесь практически тот же случай.

____

Ваш способ тоже неплох. Но при загрузке терминала.... Может тогда лучше использовать GetTickCount?

))) Да. Ручками оно конечно.


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

Первый загружаемый индикатор создает гл.т.переменную со своим именем и кладет в нее свое время подсоединения, каждая следующая копия проверяет наличие переменной, если есть, то берет имеющееся время, прибавляет 1 (да хоть тыщу!), делает своим временем и заносит уже свое время обратно в эту переменную. И так далее.

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