Способ определения номера подокна - страница 2

 
Svinozavr >>:

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


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

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

Тут тогда и время ни причем. Остается лишь один из приколов метода - подмена и восстановление шортнейма. Что тоже неплохо...)))


Дописать что ли с гл.терм.переменной, чтоб без уж совсем без багов?

 
Svinozavr >>:

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

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

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


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

Я, наверно, понял смысл темы буквально. Это, ведь, "Способ определения номера подокна".

С одинаковым именем индикатора это MQL4 не позволяет сделать.

А графические объекты, действительно, можно называть, как угодно с некоторым ограничением длины имени. 

 
Svinozavr >>:

Тут тогда и время ни причем. Остается лишь один из приколов метода - подмена и восстановление шортнейма. Что тоже неплохо...)))


Дописать что ли с гл.терм.переменной, чтоб без уж совсем без багов?

Теперь это выглядит так. Вместо времени прикрепления как идентификатора копии индикатора используется гл.терм.переменная, что сняло проблему с одновременным запуском копий при открытии MT4.


Необходимые переменные в головной части программы:

string ShortName; // имя инидкатора для вывода в подокно
string _ID; // идентификатор (номер) копии индикатора

В ф-ии init() с помощью ф-ии Identity() присваивается идентификатор (номер) копии индюка:

   _ID=Identity(); // получить идентификатор (номер) копии индикатора

Сама ф-я Identity():

string Identity()
  {
   string _GV="__DrawExample"; // имя глобальной переменной клиентского терминала
   int ID=GlobalVariableGet(_GV); // получить существующий идентификатор (номер) копии индикатора
   ID++; // новый номер
   GlobalVariableSet(_GV,ID); // новый номер в гл.пер; (если гл.пер. нет, то создается) 
   
   return(DoubleToStr(ID,0)); // возврат идентификатора (номера) копии индикатора
  }

Перед созданием объекта выясняется номер подокна с помощью функции WinNumber():

// выяснение текущего номера подокна индикатора
int WinNumber()
  {
   IndicatorShortName(_ID); // подмена: имя индикатора = идентификатору (номеру) копии индикатора
   int win=WindowFind(_ID); // считан номер подокна с именем идентификатора (номера) копии индикатора
   IndicatorShortName(ShortName); // восстановлено имя индикатора

   return(win); // возврат номера подокна
  }

-----------------------------------

Пример для наглядности в прикрепленном файле. Он рисует с помощью граф. объектов в своем окне EMA с текущими и пиковыми значениями внутри бара. Не путать с EMA по High/Low! Пиковые значения - это максимальные/минимальные значения индикатора внутри бара. Т.е. вся предыстория считается по Close, а текущий 0-й бар по High/Low.

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

Файлы:
 
Svinozavr >>:

Необходимые переменные в головной части программы:

Прикольно.

Есть проблемы.

1. Есть маленькая вероятность получения одинакового ID в виду отсутствия локов. Просто пофиксить не получится. Вероятность мизерная.

2. Защиту бы от дураков бы. Например так:

int ID = EMPTY_VALUE;

string GetID()
{
   string _GV = "__DrawExample"; // имя глобальной переменной клиентского терминала
   
   if (ID == EMPTY_VALUE)
   {
      ID = GlobalVariableGet(_GV); // получить существующий идентификатор (номер) копии индикатора
      ID++; // новый номер
      GlobalVariableSet(_GV,ID); // новый номер в гл.пер; (если гл.пер. нет, то создается) 
   }
   
   return(DoubleToStr(ID,0)); // возврат идентификатора (номера) копии индикатора
}
 
TheXpert >>:

Прикольно.

Есть проблемы.

1. Есть маленькая вероятность получения одинакового ID в виду отсутствия локов. Просто пофиксить не получится. Вероятность мизерная.

2. Защиту бы от дураков бы. Например так:


2. Видимо, я глупее (умнее?))) дурака, но что этот талантливый дурак может сделать, чтоб защиту ставить?

 
Svinozavr >>:

2. Видимо, я глупее (умнее?))) дурака, но что этот талантливый дурак может сделать, чтоб защиту ставить?

Два раза вызвать функцию. Теперь функция будет возвращать одно и то же в течение одной сессии.

 
TheXpert >>:

Два раза вызвать функцию. Теперь функция будет возвращать одно и то же в течение одной сессии.

Не понял. Эта ф-я и вызывается каждый раз за одну сессию в секции ф-ии init() при добавлении копии. Или при изменении параметров. Или при перекомпиляции. Просто номер копии увеличивается.

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