ChartIndicatorDelete - БАГ! Индикатор не удаляет сам себя с Чарта

 
int OnInit()
{
    // Получаем имя текущего индикатора
    long CH_ID = ChartID();
    int window=ChartWindowFind();
    string indicatorName = __FILE__;
    Print(CH_ID," ",window," ",indicatorName);
// далее идут условия и расчеты и в нужный момент нужно удалить полностью индикатор с данного Чарта: 
    if(resultText != "XXX")
    {
        return INIT_FAILED;
        ChartIndicatorDelete(CH_ID,window,indicatorName); // как было определено выше
    }
    return INIT_SUCCEEDED;
}
 
void OnDeinit(const int reason)
{
Print("Deinit Clear All");
ObjectsDeleteAll(ChartID(), -1, -1);
}

Какой то баг платформы. Такая конструкция не работает - Индикатор перестает прорисовываться, но сам файл индикатора продолжает висеть на чарте. Почему? 
Мало того пишет в журнале Remooved и даже выполняет очистку всех обьектов из функции Deinit... Разрабы проверьте

2024.04.16 21:37:21.101 XX (EURUSD,M5) 128968169024912129 0 XX.mq5

2024.04.16 21:37:21.101 XX (EURUSD,M5) Deinit Clear All



С роботом без проблем - ExpertRemove и нет его на чарте. А с индикаторами как? Уже танцы с бубном всех народов перетанцевал

Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
Для облегчения отладки и получения информации о работе mql5-программы введены специальные константы-макросы, значения которых устанавливается в...
 
Alex Renko:
    if(resultText != "XXX")     {         return INIT_FAILED;         ChartIndicatorDelete(CH_ID,window,indicatorName); // как было определено выше     }
    if(resultText != "XXX")
    {
        return INIT_FAILED;
        ChartIndicatorDelete(CH_ID,window,indicatorName); // как было определено выше
    }

Сначала уходите из OnInit(), а потом уже бесполезно удалять что-либо - уже ушли.

 
Это не баг. Индикатор нужно удалять в OnDeinit. В своем индикаторе так это делаю (лишнее удалил).
void OnDeinit( const int Reason )
{
  if (Reason == REASON_INITFAILED)
  {
    const string ShortName = __FILE__;

    if (IndicatorSetString(INDICATOR_SHORTNAME, ShortName))
      ChartIndicatorDelete(0, 0, ShortName);
  }
}
PriceChanges
PriceChanges
  • www.mql5.com
изменение цен символов на интервале
 
Artyom Trishkin #:

Сначала уходите из OnInit(), а потом уже бесполезно удалять что-либо - уже ушли.

  if(resultText != "XXX")
    {
        
        ChartIndicatorDelete(CH_ID,window,indicatorName); // как было определено выше
        return INIT_FAILED;
    }

Если так то индикатор продолжает банально работу и даже отрисовывает все

 
fxsaber #:
Это не баг. Индикатор нужно удалять в OnDeinit. В своем индикаторе так это делаю (лишнее удалил).

Благодарю! Ваша конструкция заработала!