Как это работает?

 

В очередной раз в ступоре. Не понимаю, что не так. Ни справка ни форум не дают ответов.

Кто понимает как работает удаление и загрузка индикаторов на график?

Создаем массив структур для хранения данных о индикаторах на графике.

   struct   indicators
     {
      string            names;
      int               handle;
      ENUM_INDICATOR    type;
      MqlParam          param[];
      int               countParam;
     } ind[];
И массив для хранения хендлов.
   int      handles[];

Заполняем структуру. В цикле проходим по окнам, в окнах проходим по индикаторам. Если индикатор не тот, который мы сейчас загружаем, то в массив структур добавляем его имя, хендл, количество параметров, заполняем массив MqlParam с помощью функции IndicatorParameters(). И сразу удаляем индикатор с графика

 for(int i=0; i<windows; i++)
     {
      int chart =  ChartIndicatorsTotal(0,i);

      for(int j=0; j < chart; j++)
         if(ChartIndicatorName(0,i,j)!="Test")
           {
            int s=ArraySize(ind);
            if(ArrayResize(ind,s+1,total_Indicators)>0)
               ind[s].names = ChartIndicatorName(chart_ID,i,j);
            ind[s].handle = ChartIndicatorGet(chart_ID,i,ChartIndicatorName(chart_ID,i,j));
            ind[s].countParam = IndicatorParameters(ind[s].handle,ind[s].type,ind[s].param);
            //+------------------------------------------------------------------+
            //|                   УДАЛЕНИЕ ИНДИКАТОРА
            //+------------------------------------------------------------------+
            ChartIndicatorDelete(chart_ID,i,ChartIndicatorName(0,i,j));
            ChartRedraw();
           }
     }

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

//+------------------------------------------------------------------+
//|          СОЗДАНИЕ НОВОГО ХЕНДЛА, ЗАГРУЗКА ИНДИКАТОРА
//+------------------------------------------------------------------+
   int size = ArraySize(ind);
   for(int i=0; i<size; i++)
     {
      int s=ArraySize(handles);
      if(ArrayResize(handles,s+1,total_Indicators)>0)
         handles[s]=IndicatorCreate(NULL,PERIOD_CURRENT,IND_RSI,ind[i].countParam,ind[i].param);  //например это будет RSI или же ind[i].type
     }

Пробуем загрузить обратно на график индикаторы

   int s = ArraySize(handles);
   for(int i=0; i<s; i++)
     {
      ChartIndicatorAdd(chart_ID,0,handles[i]);
     }

Получаем ошибку

Ошибка

 

Исходник

Файлы:
Test.mq5  7 kb
 
Для проверки сначала загружаем на график RSI, потом уже Test
 

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

 

Почему так

handles[s]=IndicatorCreate(NULL,PERIOD_CURRENT,IND_RSI,ind[i].countParam,ind[i].param);

а не так

handles[s]=IndicatorCreate(NULL,PERIOD_CURRENT,ind[i].type,ind[i].countParam,ind[i].param);

?

 
Я и так пробовал. А в итоге тоже самое
 

У Вас, кстати, вот тут ошибка в коде:

            if(ArrayResize(ind,s+1,total_Indicators)>0)
               ind[s].names = ChartIndicatorName(chart_ID,i,j);
            ind[s].handle = ChartIndicatorGet(chart_ID,i,ChartIndicatorName(chart_ID,i,j));
            ind[s].countParam = IndicatorParameters(ind[s].handle,ind[s].type,ind[s].param);

Надо так:

            if(ArrayResize(ind,s+1,total_Indicators)>0) {
               ind[s].names = ChartIndicatorName(chart_ID,i,j);
               ind[s].handle = ChartIndicatorGet(chart_ID,i,ChartIndicatorName(chart_ID,i,j));
               ind[s].countParam = IndicatorParameters(ind[s].handle,ind[s].type,ind[s].param);
            }

Вообще, старайтесь всегда использовать {} в опереторах if-else

 
PapaYozh #:

У Вас, кстати, вот тут ошибка в коде:


Надо так:


Вообще, старайтесь всегда использовать {} в опереторах if-else

Да, спасибо. Но тут дело не в ней

 
PapaYozh #:

У Вас, кстати, вот тут ошибка в коде:


Надо так:


Вообще, старайтесь всегда использовать {} в опереторах if-else

достали они уже с такими портянками ...

 
Aleksandr Kononov:

В очередной раз в ступоре. Не понимаю, что не так. Ни справка ни форум не дают ответов.

Кто понимает как работает удаление и загрузка индикаторов на график?

Создаем массив структур для хранения данных о индикаторах на графике.

И массив для хранения хендлов.

Заполняем структуру. В цикле проходим по окнам, в окнах проходим по индикаторам. Если индикатор не тот, который мы сейчас загружаем, то в массив структур добавляем его имя, хендл, количество параметров, заполняем массив MqlParam с помощью функции IndicatorParameters(). И сразу удаляем индикатор с графика

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

Пробуем загрузить обратно на график индикаторы

Получаем ошибку

удаление индикатора с графика никак не работает

можно только выключить

если из OnInit выйти так:

if(ЕслиИндикаторНеНадо==true)return(INIT_PARAMETERS_INCORRECT);

else if(ЕслиИндикаторНадо==true)return(INIT_SUCCEEDED);
 
Renat Akhtyamov #:

удаление индикатора с графика никак не работает

можно только выключить

если из OnInit выйти так:

if(ЕслиИндикаторНеНадо==true)return(INIT_PARAMETERS_INCORRECT);

else if(ЕслиИндикаторНадо==true)return(INIT_SUCCEEDED);
Понятно, но я вобще про другое спрашиваю. Объясню свой вопрос: мне нужно записать параметры индикаторов с графика, удалить их  и затем по этим параметрам снова найти индикаторы которые были. Не получается по параметра восстановить хендлы
Причина обращения: