Ошибки, баги, вопросы - страница 3471

 
fxsaber #:

Напишите, что нужно получить.

Имеем: Индикатор(код здесь), который получает хэндл на самого себя.

Далее в своей работе он обращается к этому хэндлу и получает какие то данные.

До этого момента всё хорошо.

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

И удалить такой индикатор с графика получается только перезагрузкой терминала.

Что нужно получить? 

Работающий индикатор с нормальным удалением его с графика.

С помощью ваших рекомендаций, получается добиться только нормального удаления, но при этом индикатор перестаёт работать)

 
Maxim Kuznetsov #:

а теперь фанфары !

Хендл нормально получается. Без ошибок. Для индикатора который вернул INIT_FAILED в OnInit и не вызывал SetIndexBuffer

Эффективный менеджмент - исправлять то что за 20 лет работало

А я чё, я ничё)))

Вот и господа с иноземного форума тоже считают, что это баг, а Slava говорит, что это фича)

 
Aleksandr Slavskii #:

Вот и господа с иноземного форума тоже считают, что это баг

Просьба описать баг. Так и не понял из обсуждения.

 
fxsaber #:

Просьба описать баг. Так и не понял из обсуждения.

как выше верно заметили, теперь это фича :-)

если индикатор из OnInit() возвращает INIT_FAILED , то он всё равно остаётся висеть в списке индикаторов (и в шаблонах, и при смене таймфрейма снова будет вызван OnInit)

к тому-же как выяснилось от этого нефункционирующего индикатора можно получить хендл как от нормального

код индикатора с INIT_FAILED https://www.mql5.com/ru/forum/1111/page3471#comment_51963944

код скрипта берущего хендл вот https://www.mql5.com/ru/forum/1111/page3471#comment_51964451

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2024.01.30
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
fxsaber #:

Просьба описать баг. Так и не понял из обсуждения.

Запускаю индикатор


Гифка у меня на экране как будто пустая, но если по ней кликнуть, то показывает.

Думаю на ней понятна суть проблемы.


Просто подтвердите, что это баг.

К вашим словам разработчики чаще прислушиваются. (ИМХО)

Файлы:
 
Maxim Kuznetsov #:

как выше верно заметили, теперь это фича :-)

Уважаемый, ну мы же с вами про два разных бага рассказываем.

Вы про продолжение работы индикатора после  INIT_FAILED.

Я про продолжение работы индикатора после его удаления с графика.

Давайте не будем путать аудиторию)))


Вы пошли дальше наших иноземных коллег и проверили, что этот баг оказывает плохое влияние на работу скриптов и советников, а это очень плохо.

 
Aleksandr Slavskii #:

Гифка у меня на экране как будто пустая, но если по ней кликнуть, то показывает.

Не показывает.
 
fxsaber #:
Не показывает.
У меня в смартфоне показывает.
 
fxsaber #:
Не показывает.

В новой вкладке показывает.

 
Aleksandr Slavskii #:

Имеем: Индикатор(код здесь), который получает хэндл на самого себя.

Далее в своей работе он обращается к этому хэндлу и получает какие то данные.

До этого момента всё хорошо.

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

И удалить такой индикатор с графика получается только перезагрузкой терминала.

Что нужно получить? 

Работающий индикатор с нормальным удалением его с графика.

С помощью ваших рекомендаций, получается добиться только нормального удаления, но при этом индикатор перестаёт работать)

#property indicator_chart_window
#property indicator_plots 0
#property indicator_buffers 1
int indicator_handle = INVALID_HANDLE;
double indBuff[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, indBuff, INDICATOR_DATA);
   printf("GetTickCount: %llu", GetTickCount());

   string indicator_shortname = ::MQLInfoString(MQL_PROGRAM_NAME);
   const int wnd_count  = (int)ChartGetInteger(ChartID(), CHART_WINDOWS_TOTAL);
   for(int wndptr = NULL; (wndptr < wnd_count) && (indicator_handle == INVALID_HANDLE); wndptr++)
      for(int ind_cnt = ChartIndicatorsTotal(ChartID(), wndptr) - 1; (ind_cnt >= NULL) && (indicator_handle == INVALID_HANDLE); ind_cnt--)
         indicator_handle = (ChartIndicatorName(ChartID(), wndptr, ind_cnt) == indicator_shortname) ? ChartIndicatorGet(ChartID(), wndptr, indicator_shortname) : indicator_handle;
   printf("Indicator handle: %i", indicator_handle);
   
//   IndicatorRelease(indicator_handle);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//   IndicatorRelease(indicator_handle);
   printf("OnDeInit reason: %i; GetTickCount: %llu", reason, GetTickCount());
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   double buff[];
   indBuff[rates_total - 1] = close[rates_total - 1];
   if(indicator_handle != INVALID_HANDLE)
     {
      CopyBuffer(indicator_handle, 0, 0, 1, buff);
      IndicatorRelease(indicator_handle);
      
      Print(buff[0]);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+