Как экспертом удалить индикатор? - страница 2

 

Попадаю.

Хм, ShortName - пустая строка....

void OnTick()
  {
//---
if(win==0){
   Handl=iMomentum(Symbol(),PERIOD_CURRENT,14,PRICE_CLOSE);
   IDs=ChartID();
   ChartIndicatorAdd(IDs,0,Handl);
   win++;
}
   Sleep(20*1000);

if ( Handl != INVALID_HANDLE )
{
    IndicatorRelease( Handl ); 
    ShortName=ChartIndicatorName(IDs,1,0);
    Print(IDs);
    Print(ShortName);
    ChartIndicatorDelete( IDs, 0, ShortName ); 
    Print(GetLastError());
}
  }
 

перезапустил:

2015.04.28 21:46:48.524    2015.04.01 17:26:00   12345
2015.04.28 21:46:48.527    2015.04.01 17:26:20   Momentum(14)
2015.04.28 21:46:48.527    2015.04.01 17:26:20   4014

 
alrane:

перезапустил:

2015.04.28 21:46:48.524    2015.04.01 17:26:00   12345
2015.04.28 21:46:48.527    2015.04.01 17:26:20   Momentum(14)
2015.04.28 21:46:48.527    2015.04.01 17:26:20   4014

Установите индикатор в OnInit(),

а его удаление в OnDeinit() 

 
Тоже самое
 
alrane:
Тоже самое

А у меня, почему-то работает:

//+------------------------------------------------------------------+
//|                                                        iTest.mq5 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//
int mom_handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
    mom_handle = iMomentum( _Symbol, PERIOD_CURRENT, 14, PRICE_CLOSE );
    
    if ( mom_handle == INVALID_HANDLE )
    {
      Print("Индикатор не создан!");
      return(INIT_FAILED);
    }
    else
    {
      ChartIndicatorAdd( 0, 1, mom_handle );
    }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if ( mom_handle != INVALID_HANDLE )
    {
      string ShortName=ChartIndicatorName( 0, 1, 0 );
      IndicatorRelease( mom_handle ); 
      ChartIndicatorDelete( 0, 1, ShortName ); 
    }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
 

Написал свою функцию, она по очереди удаляет все найденные индикаторы в основном окне.

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

DeleteAllIndicators(ChartIndicatorsTotal(0,0));

Вот сама функция (можно сделать её типом void, если вам не надо ничего возвращать):

bool DeleteAllIndicators(int ToalIndicatorsNumber)
  {
   if(ToalIndicatorsNumber>0)
     {
      for(int iii=0;iii<ToalIndicatorsNumber;iii++)
        {
         ChartIndicatorDelete(0,0,ChartIndicatorName(0,0,0));        // Удаляем найденный индикатор
         ChartRedraw(0);                                             // Обновляем окно графика
        }
     }

   if(ChartIndicatorsTotal(0,0)==0)
     {
      Print("Все индикаторы удалены успешно!");
      return true;
     }
   else
     {
      Alert("Ошибка в функции DeleteAllIndicators. Ошибка: %d",GetLastError());
      return false;
     }
  }
 
alrane:
Есть ли способ полностью очистить график? От всего что на нем есть

Самое простое - заранее создать и, когда надо, подгрузить пустой шаблон - ChartApplyTemplate(0,"default.tpl")).

Понятно, что идентификатор графика нужно подставлять правильный, если работаете не на текущем графике.