Последовательность выполнение Init() и DeInit() - страница 18

 
Alexey Kozitsyn:
Т.е. с использованием костылей? Можно пример?

Нельзя добавить индикатор через ChartIndicatorAdd() на чарт имеющий другой символ или ТФ. Будет выставлена ошибка.

https://www.mql5.com/ru/docs/chart_operations/chartindicatoradd

ChartIndicatorAdd

Добавляет на указанное окно графика индикатор с указанным хэндлом. Индикатор и график должны быть построены на одинаковых символе и таймфрейме.

Вот такое ограничение сейчас. В Сервисах его не будет.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Небольшой лайфхак почти на тему сабжа

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.09.23 10:48

  1. Устанавливаем руками на ГОЛЫЙ чарт индикатор
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define TOSTRING(A) #A + " = " + (string)A + "\n"
    
    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[] )
    {
      if (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. Удаляем руками индикатор с чарта.
  3. В логе видим, что индикатор продолжает выполняться. Можно закрыть все чарты в терминале, но он все равно будет выполняться. И это не поможет, конечно,
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. Перезагрузка терминала останавливает выполнение индикатора.
  5. Это сколько же может индикаторов выполняться вот так в холостую, а мы о них ни слухом, ни духом?! Контроля нет совсем.
Без каких-либо претензий к разработчикам.
 
fxsaber:
Вот такое ограничение сейчас. В Сервисах его не будет.

Я говорил совсем не об этом. Не добавление из эксперта индикатора, а создание индикатора при помощи эксперта.

По поводу этого:

Чем Сервисы или возможность запуска нескольких советников на одном чарте не смогут покрыть полностью обсуждаемые траблы?

Если через сервисы не будет возможности создавать индикаторы, то проблема с созданием индикатора с данными из файла никуда не денется. В том случае, если не будет контролироваться последовательность OnDeinit() -> OnInit(). Т.к. смена ТФ - это действие пользователя, а, получается, реакция на это действие (OnDeitit()) придет уже тогда, когда этого не нужно (после OnInit(), или может даже  последующий OnCalculate()?).

Т.е. если индикатор записывает данные в файл и на основании этих данных строит граф. серию, а данные будут записываться "не последовательно" - корректного отображения всех данных не будет.

А вот если бы сервис был глобальной программой (как ГПТ, только целая программа) и с его помощью можно было создавать индикаторные буферы и расчеты не прерывались пользовательскими действиями типа смены ТФ/закрытия чарта - тогда проблемы бы не было. А так - индикаторы, как всегда, кастрируют. 

 
Alexey Kozitsyn:

Я говорил совсем не об этом. Не добавление из эксперта индикатора, а создание индикатора при помощи эксперта.

Терминологию не понимаю.

 
fxsaber:

Терминологию не понимаю.

Расчет и отображение данных с записью их в индикаторных буферах, а не только лишь отображение данных.
 
Slawa:

С OnChartEvent пока нет решения

Это как,  нет решения?  Что ж это будет за сервис без возможности доступа к мышке?  Да и пользовательские события хотелось бы обрабатывать. 
 
Alexey Kozitsyn:
Расчет и отображение данных с записью их в индикаторных буферах, а не только лишь отображение данных.

Тут сетуют, что данные, посчитанные индикатором, нельзя надежно и логично передать другой копии этого индикатора во время смены ТФ.

Через Сервисы это делается элементарно, если Сервис будет делать расчетную часть, а индикатор отображать.

Во всех остальных случаях, что не подпадают под выделенное жирным, можно продолжать писать индикаторы по-классике.

 
fxsaber:

Тут сетуют, что данные, посчитанные индикатором нельзя надежно и логично передать другой копии этого индикатора во время смены ТФ.

Через Сервисы это делается элементарно, если Сервис будет делать расчетную часть, а индикатор отображать.

Во всех остальных случаях, что не подпадают под выделенное жирным, можно продолжать писать индикаторы по-классике.

Ок, ладно, поживем - увидим, что получится. Когда бета будет?
 
Alexey Kozitsyn:
Ок, ладно, поживем - увидим, что получится. Когда бета будет?
Если дам добро, то сегодня вечером.
 
Nikolai Semko:
Это как,  нет решения?  Что ж это будет за сервис без возможности доступа к мышке?  Да и пользовательские события хотелось бы обрабатывать. 

Нет решения означает "пока неизвестно как решать", а не "не будет"

А с пользовательскими событиями вообще никаких проблем

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