Работа с индикаторами из эксперта - страница 2

 
При много благодарен.
 
micle:
При много благодарен.

Пока будете ждать (это может быть долго и не факт, что сделают) попробуйте этот вариант. :)

Простой пример:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int total=0;
   string ind_name="";
   int handle=iMA(_Symbol,_Period,5,0,MODE_EMA,PRICE_CLOSE);
   //---
   if(ChartIndicatorAdd(0,0,handle))
     Print("Индикатор успешно добавлен на график!");
   //---
   total=ChartIndicatorsTotal(0,0);
   //---
   for(int i=0;i<total;i++)
     {
      ind_name=ChartIndicatorName(0,0,i);
      Print(i,": ",ind_name);
     }
   //---
   if(ChartIndicatorDelete(0,0,ind_name))
     Print("Индикатор успешно удалён с графика!");
  }
 
tol64:

Пока будете ждать (это может быть долго и не факт, что сделают) попробуйте этот вариант. :)

Простой пример:

Спасибо. Пример настолько прост, что его можно воспроизвести "в уме".

Конкретный пример будет удалять только что созданный индикатор без каких либо проблем. Т.к. переменная ind_name к моменту попытки удалить индикатор с таким именем, будет содержать только что созданый. Что и обречёт её на успех. Что если в процессе работы индикаторы создавались не последовательно, пользователь добавлял свои индикаторы???? Пример работоспособен только как пример. Он не несёт в себе какой либо программной ценности.

 
micle:

Спасибо. Пример настолько прост, что его можно воспроизвести "в уме".

Конкретный пример будет удалять только что созданный индикатор без каких либо проблем. Т.к. переменная ind_name к моменту попытки удалить индикатор с таким именем, будет содержать только что созданый. Что и обречёт её на успех. Что если в процессе работы индикаторы создавались не последовательно, пользователь добавлял свои индикаторы???? Пример работоспособен только как пример. Он не несёт в себе какой либо программной ценности.

Всё зависит от конкретной задачи. Например, если на графике несколько индикаторов и нужно удалить один из них, то также в цикле останавливаем свой выбор на том, который нужно удалить. Или опишите точнее задачу. 

 
tol64:

Всё зависит от конкретной задачи. Например, если на графике несколько индикаторов и нужно удалить один из них, то также в цикле останавливаем свой выбор на том, который нужно удалить. Или опишите точнее задачу. 

Задача состоит в том чтобы добавить несколько индикаторов на график при запуске (инициализации), поработать, удалить _созданные_ при де инициализации. В промежутке между Init - DeInit пользователь может делать что угодно. В том числе добавлять свои индикаторы. Вот как раз индикаторы добавленные пользователем, удалять не следует. Короткое имя создаваемых индикаторов не известно. Перебрать то конечно можно, нес чем сравнивать.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 
micle:
Задача состоит в том чтобы добавить несколько индикаторов на график при запуске (инициализации), поработать, удалить _созданные_ при де инициализации. В промежутке между Init - DeInit пользователь может делать что угодно. В том числе добавлять свои индикаторы. Вот как раз индикаторы добавленные пользователем, удалять не следует. Короткое имя создаваемых индикаторов не известно. Перебрать то конечно можно, нес чем сравнивать.
Также в цикле получая имя индикатора можно получить по имени и его хэндл. Для этого можно использовать функцию ChartIndicatorGet(). После этого Вы уже можете сравнить хендлы в памяти и полученные хендлы и удалить те индикаторы, которые были созданы при инициализации.
 
tol64:
Также в цикле получая имя индикатора можно получить по имени и его хэндл. Для этого можно использовать функцию ChartIndicatorGet(). После этого Вы уже можете сравнить хендлы в памяти и полученные хендлы и удалить те индикаторы, которые были созданы при инициализации.
Спасибо, затея интересная. Нужно опробовать. Но согласитесь, такой огород городить...
 
micle:

При создании индикатора, теоретически) ShortName известно. Например:

indicator_handle=iMA(Symbol(), Period(), ma_period, ma_shift, MODE_EMA, PRICE_CLOSE);
ChartIndicatorAdd(0,0,indicator_handle);
string ShortName="MA("+ma_period+")";
 
Swan:

теоретически, да! на практике вот такая вот кракозяблина нужна, чтобы правильно удалить индюк по его хендлу


bool ChartIndicatorDeleteHendle(
                 long  chart_id,      // идентификатор графика
                 int   sub_window,    // номер подокна
                 int   handle         // хендл индикатора
                 )
{
   for(int i = 0; i < ChartIndicatorsTotal(chart_id, sub_window); i++)
   {
      string ind_name = ChartIndicatorName(chart_id, sub_window, i);
      if (handle == ChartIndicatorGet(chart_id, sub_window, ind_name)){
         if (ChartIndicatorDelete(chart_id, sub_window, ind_name)){
            return(true);
         } else {
            return(false);
         }
      }
   }
   return(false);
}
 
micle:

теоретически, да! на практике вот такая вот кракозяблина нужна, чтобы правильно удалить индюк по его хендлу


ChartIndicatorDeleteHandle не будет. Закрываем.(с) Сервисдеск

-1 к лояльности

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