MT5: Количество индикаторов на графике

 
Доброго времени суток!
Есть некий график. На него перетаскиванием из Навигатора помещены несколько индикаторов. На графике они видны, всё нормально.
Теперь я хочу получить их список. Есть пример:
   //--- количество окон на графике (всегда есть хотя бы одно главное окно)
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   //--- проходим по окнам
   for(int w=0;w<windows;w++)
   {
      //--- сколько индикаторов в данном окне/подокне
      int total=ChartIndicatorsTotal(0,w);
      //--- переберем все индикаторы в окне
      for(int i=0;i<total;i++)
      {
         //--- получим короткое имя индикатора
         string name=ChartIndicatorName(0,w,i);
         //--- получим хэндл индикатора
         int handle=ChartIndicatorGet(0,w,name);
         //--- выведем в журнал
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle);
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным
         IndicatorRelease(handle);
      }
   }
Но он не работает - даже в цикл не попадаем.
Пробовал скрипт с кодом и отдельно запускать и перетаскивать на график - нет списка индикаторов. Хотя сами индикаторы я вижу.
Что я делаю не так?
 
SimpleUser:
Доброго времени суток!
Есть некий график. На него перетаскиванием из Навигатора помещены несколько индикаторов. На графике они видны, всё нормально.
Теперь я хочу получить их список. Есть пример:
Но он не работает - даже в цикл не попадаем.
Пробовал скрипт с кодом и отдельно запускать и перетаскивать на график - нет списка индикаторов. Хотя сами индикаторы я вижу.
Что я делаю не так?

Установили на график одинаковые индикаторы?

 
Vitaly Muzichenko #:

Установили на график одни и те-же индикаторы?

Почему? Разные. Просто взял 2 произвольных индикатора, бросил их на график и попытался найти - не нашёл.

 
SimpleUser:
Доброго времени суток!
Есть некий график. На него перетаскиванием из Навигатора помещены несколько индикаторов. На графике они видны, всё нормально.
Теперь я хочу получить их список. Есть пример:
Но он не работает - даже в цикл не попадаем.
Пробовал скрипт с кодом и отдельно запускать и перетаскивать на график - нет списка индикаторов. Хотя сами индикаторы я вижу.
Что я делаю не так?

во первых надо ждать, первый проход в OnStart скрипта вполне может статься неправильным

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

ещё неплохо наверное дёрнуть ChartRedraw()  или подобные..

---

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

 
SimpleUser #:

Почему? Разные. Просто взял 2 произвольных индикатора, бросил их на график и попытался найти - не нашёл.

Я этот код проверял дня 3 назад - работал отменно

 

не слишком явно в документации написано за что отвечает CHART_WINDOWS_TOTAL - не разобрался

я б с такого кода начал:

void OnStart()
{
   for(long i = ChartFirst(); i != -1; i = ChartNext(i))
   {
      for(int j = 0; j < ChartGetInteger(0, CHART_WINDOWS_TOTAL); j++)
      {
         for(int k = 0; k < ChartIndicatorsTotal(i, j); k++)
         {
            Print("ChartID = ", i, " , name = ", ChartIndicatorName(i, j, k));
         }
      }
   }
}
 

Имеются такие индикаторы:

Код который распечатывает все индикаторы:

   int windows_total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   for(int i=windows_total-1; i>=0; i--)
     {
      for(int j=ChartIndicatorsTotal(0,i)-1; j>=0; j--)
        {
         string name=ChartIndicatorName(0,i,j);
         Print("windows ",i,", indicator ",j,", indicator name ",name);
        }
     }

Результат:

2021.09.18 07:07:54.127 Script 1 (AUDUSD,D1)    windows 2, indicator 0, indicator name Bulls SMA(6) Smoothing(13)
2021.09.18 07:07:54.128 Script 1 (AUDUSD,D1)    windows 1, indicator 0, indicator name MACD(12,26,9)
2021.09.18 07:07:54.129 Script 1 (AUDUSD,D1)    windows 0, indicator 0, indicator name MA(12)
Файлы:
Script_1.mq5  2 kb
 

А синхронизироваться, видимо, как то надо. Эти методы сильно зависят от машины, на которой выполняются. Особенно заметно на виртуалке.
Формально, ведь никто не мешает запустить скрипт из ME при запущенном MT (с открытым графиком и парой индикаторов на нём). По документации, вроде, особых ограничений на такое нет. Но, если скрипт запустится после того, как график уже есть - не факт, что он индикаторы найдёт.
Разговор за разные потоки не очень актуален - сам метатрейдер ведь один, он запущен, графики видны (с индикаторами) и можно ожидать, что и скрипт всё это увидит - нет, не всегда.

 
SimpleUser:
Доброго времени суток!
Есть некий график. На него перетаскиванием из Навигатора помещены несколько индикаторов. На графике они видны, всё нормально.
Теперь я хочу получить их список. Есть пример:
Но он не работает - даже в цикл не попадаем.
Пробовал скрипт с кодом и отдельно запускать и перетаскивать на график - нет списка индикаторов. Хотя сами индикаторы я вижу.
Что я делаю не так?

C конца мотать нужно! Вы его удаляете и индексы смещаются 

 for(int i=0;i<total;i++)

for(int i=total-1 ;i>=0;i--)
 {
 
Sofiia Butenko #:

C конца мотать нужно! Вы его удаляете и индексы смещаются 

Не придумывайте. :) Если индикаторов будет 2, то один то должен остаться. А их нет. Что с вашим вариантом, что без: total == 0
Если скрипт перетаскивать на график - тут будет рулетка, иногда всё нормально, иногда 0.
А вот если скрипт запустить из ME - total всегда будет равен 0. При отладке скриптов такое поведение очень неудобно.

 
SimpleUser #:

Не придумывайте. :) Если индикаторов будет 2, то один то должен остаться. А их нет. Что с вашим вариантом, что без: total == 0
Если скрипт перетаскивать на график - тут будет рулетка, иногда всё нормально, иногда 0.
А вот если скрипт запустить из ME - total всегда будет равен 0. При отладке скриптов такое поведение очень неудобно.

Ви проверили? Именно так и есть, если бы не удаляли индикаторы все так же было ок. 

Конечно если запускать с МЕ то он открывает новый график на котором нет индикаторов. У вас же указан текущий график в коде. 
Причина обращения: