После перезапуска терминала нет отрисовки индикатора

 
Есть у меня индикатор. Проверен уже и в торговле на реале и в тестах. Всё рисует как нужно и высчитывает. Но вот есть один нюанс. После перезапуска терминала нет вооще ничего того, что он нарисовал. С чем это может быть связано? Пока терминал не отключить всё показывается верно.
 

Есть у меня несколько таких индикаторов. Это свойство им придано преднамеренно. При первичной инициализации они ничего не делают. Чтобы индикатор заработал нужна повторная инициализации.

У меня это два случая:

1. При старте терминала индикатор намертво вешает терминал. Как вариант, один из таких индикаторов у меня начинает отрисовку через 30 секунд после инициализации.

2. Я знаю, что индикатор имеет высокую вычислительную сложность. Поэтому, без необходимости, он ничего и не делает.

 
Viktar Dzemikhau:
Есть у меня индикатор. Проверен уже и в торговле на реале и в тестах. Всё рисует как нужно и высчитывает. Но вот есть один нюанс. После перезапуска терминала нет вооще ничего того, что он нарисовал. С чем это может быть связано? Пока терминал не отключить всё показывается верно.

Правильный индикатор отрисовывает свои значения даже на выходных - когда нет котировок.

Пример: все индикаторы из поставки MetaTarder 5 (код индикаторов искать в редакторе MetaEditor в папке MQL5 - Indicators - Examples)


 
Vladimir Karputov:

Правильный индикатор отрисовывает свои значения даже на выходных - когда нет котировок.

Пример: все индикаторы из поставки MetaTarder 5 (код индикаторов искать в редакторе MetaEditor в папке MQL5 - Indicators - Examples)

Не поможет мне стандартное.. У меня индикатор МТФ. С индикаторами, которые написаны для 1 ТФ таких косяков нет.

 
Нет кода - нет советов.
 

В общем, пришлось пришлось принтовать код. Я нашёл, где косяк возникает. И, именно, при запуске терминала.

Вот есть функция вычисляющая индекс бара, с которого будет происходить перерасчёт:

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                            Определение индекса бара, с которого необходимо производить перерасчет                                             |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
int getRecalcIndex(const int barsTotal,        // Количество пришедших баров таймфрейма открытого графика
                   const int countedBars) {    // Количество уже обработанных баров таймфрейма открытого графика
//---
  if (countedBars != 0) {
    return barsTotal - countedBars;
  } else {
    int firstBarIndexOfCurTF = barsTotal() - 1;
    Print("firstBarIndexOfCurTF = ", firstBarIndexOfCurTF);
    Print("barOpenTime(firstBarIndexOfCurTF), i_tf = ", barOpenTime(firstBarIndexOfCurTF), i_tf);
    Print("barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) = ", barShift(barOpenTime(firstBarIndexOfCurTF), i_tf));
    return barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) - 1;
  }
}

Онавызывается в OnCalculate() так:

int limit = getRecalcIndex(rates_total, prev_calculated);    // Определим первый расчетный бар

Параметры видны, какие в эту функцию приходят.

Здесь используются 3 библиотечные функции:

//==================================================================================================================================================================================
// 1.1 Возвращает количество баров в окне торгового инструмента активного окна на заданном таймфрейме. =============================================================================
int barsTotal(ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export {    // ТФ, количество баров которого требуется получить
//---
  return Bars(_Symbol, tf);
}
//==================================================================================================================================================================================
// 7.1 Возвращает значение времени открытия бара торгового инструмента активного окна, находящегося на shift баров от 0-го бара в историю. =========================================
datetime barOpenTime(int shift,                                       // Индекс бара, время открытия которого требуется определить
                     ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export {    // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime()
//---
  return ((CopyTime(_Symbol, tf, shift, 1, barOpenTime) ==  1) ? barOpenTime[0] : WRONG_VALUE);
}
//==================================================================================================================================================================================
// 2.1 Возвращает индекс бара торгового инструмента активного окна по его времени открытия на заданном таймфрейме. =================================================================
int barShift(datetime initialBarTime,                         // Время открытия бара, индекс коорого требуется найти
             ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export {    // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime()
//----
  datetime barsOpenTime[],                      // Массив, в котором находится времени открытия баров открытого окна за указанный интервал времени
           lastBarTime = barOpenTime(0, tf);    // Время до которого будет происходить поиск времени открытия баров функцией CopyTime()

  if (CopyTime(_Symbol, tf, initialBarTime, lastBarTime, barsOpenTime) == -1)
    return -1;
//---
  return (ArraySize(barsOpenTime) > 1) ? (ArraySize(barsOpenTime) - 1) : 0;
}

При запуске терминала вижу такое:

MP      0       10:31:33.900    ZigZag_HightLow_MTF (AUDJPY,H1) firstBarIndexOfCurTF = -1
MJ      0       10:31:33.902    ZigZag_HightLow_MTF (AUDJPY,H1) barOpenTime(firstBarIndexOfCurTF), i_tf = wrong datetime16408
OP      0       10:31:33.902    ZigZag_HightLow_MTF (AUDJPY,H1) barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) = 4999
Запуск платформы - Для продвинутых пользователей - MetaTrader 5
Запуск платформы - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
 

В общем, получается какая-то дичь. Со старта терминала стандартная функция:

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe        // периоду 
   );

Возвращает -1.

 

Стабильностью от платформы так и прёт..

Изменил этот метод тестово:

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                            Определение индекса бара, с которого необходимо производить перерасчет                                             |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
int getRecalcIndex(const int barsTotal,        // Количество пришедших баров таймфрейма открытого графика
                   const int countedBars) {    // Количество уже обработанных баров таймфрейма открытого графика
//---
  for (int i = (barsTotal - countedBars - 1); i >= 0; i--)
    g_ZZPriceBuf[i] = EMPTY_VALUE;

  if (countedBars != 0) {
    return barsTotal - countedBars;
  } else {
    int cnt = 0;
    while (Bars(_Symbol, PERIOD_CURRENT) == 0) {
      Print("cnt = ", cnt, " ; barsTotal = ", Bars(_Symbol, PERIOD_CURRENT));
      cnt++;
      Sleep(12000);
    }
    int firstBarIndexOfCurTF = barsTotal() - 1;
    Print("firstBarIndexOfCurTF = ", firstBarIndexOfCurTF);
    Print("barOpenTime(firstBarIndexOfCurTF), i_tf = ", barOpenTime(firstBarIndexOfCurTF), i_tf);
    Print("barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) = ", barShift(barOpenTime(firstBarIndexOfCurTF), i_tf));
    return barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) - 1;
  }
}

В цикле бесконечно принтуется:

Print("cnt = ", cnt, " ; barsTotal = ", Bars(_Symbol, PERIOD_CURRENT));

Сервис деск погиб. Теперь кому писать о багах интересно?

 
Чтобы что-то кому-то писать для начала нужен минимальный код, который можно скомпилировать и запустить и описание действий. Нет минимального кода, который можно скомпилировать и запустить, нет описания - значит никто не сможет воспроизвести. 
 
Vladimir Karputov:
Чтобы что-то кому-то писать для начала нужен минимальный код, который можно скомпилировать и запустить и описание действий. Нет минимального кода, который можно скомпилировать и запустить, нет описания - значит никто не сможет воспроизвести. 

Щяс накидаю.. Просто если индюк слать, там нужно сдать инклюдники, библиотеки и тд. Это как-бы не так просто кому-то въехать.

 
Viktar Dzemikhau:

Щяс накидаю.. Просто если индюк слать, там нужно сдать инклюдники, библиотеки и тд. Это как-бы не так просто кому-то въехать.

Вот-вот. Пример должен быть минималистическим. Максимально простым.

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