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

 
Все "инициализации" производите в OnCalculate. Не в OnInit().
 
Vladimir Karputov:
Все "инициализации" производите в OnCalculate. Не в OnInit().

Так какая же это будет инициализация тогда? На каждом тике инициализировать? Мне вот интересно, как можно было продуать такую архитектуру. И в трезвом ли уме. Я не шучу и не оскорбляю ни кого. Не это явно в спешке было задумано. Это не правильно с точки зрения архитектуры программного обеспечения ((

Видимо придётся изобретать вездеход, раз нативных средств для упрощения работы нет... 4-ка в этом плане впереди. Хотя, мне и 4-ка не особо нравится. Но в 4-ке подобных косяков не замечено. Вообще всё работает корректно. Там один косяк, что нет событий нативаных. Хотя, я написал свой класс. А так.. Перенёс индюк с 4-ки на 5-ку и понял, что не всё так, как хотелось бы, к сожалению.

 
Начните с конца. Создаёте индикатор. И задайте вопрос: "Что мне нужно сделать? Какие данные получить"?
 
Vladimir Karputov:
Начните с конца. Создаёте индикатор. И задайте вопрос: "Что мне нужно сделать? Какие данные получить"?

В том то и загвоздка, что данных много и делать на каждом тике лишние проверки не хочется. Давайте взглянет на этот вопрос с другой стороны. Я щяс накидаю простой индюк для проверки того, что я упомянул.

 
Вот простой пример того, как даже в OnCalculate() не возможно проверить синхронизованность с сервером.
Файлы:
 
Viktar Dzemikhau:
Вот простой пример того, как даже в OnCalculate() не возможно проверить синхронизованность с сервером.

Снова накрутили кучу. Повторю вопрос: "Что индикатор долже сделать? Какие данные получить"?

 
Vladimir Karputov:

Снова накрутили кучу. Повторю вопрос: "Что индикатор долже сделать? Какие данные получить"?

Рассчёт уровней по другим индикаторам. Я же пишу, что там не всё так просто. Он использует ещё 2 индикатора и рисует уровни на основании их расчётов.

 

Ну в OnInit() ни в OnCalculate() функция не работает:

bool isTerminalSynchronizedWithServer() {
//---
  Print(__FUNCTION__, " => barOpenTime = ", barOpenTime(0));
  bool synchronized = false;
  
  while (barOpenTime(0, PERIOD_M1) == WRONG_VALUE) {
    Print("barsTotal() = ", Bars(_Symbol, PERIOD_D1));
    Print("startTimeStr = ", TimeToString(barOpenTime(0, PERIOD_M1), TIME_DATE|TIME_SECONDS));
    synchronized = SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_SYNCHRONIZED);
    Print("synchronized = ", synchronized);
    if (synchronized == true)
      return true;
  }
//---
  return false;
}

Здесь важен момент, что не возможно получить данные открытия с другого таймфрейма. Поэтому в цикле:

while (barOpenTime(0, PERIOD_M1) == WRONG_VALUE) {
    Print("barsTotal() = ", Bars(_Symbol, PERIOD_D1));
    Print("startTimeStr = ", TimeToString(barOpenTime(0, PERIOD_M1), TIME_DATE|TIME_SECONDS));
    synchronized = SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_SYNCHRONIZED);
    Print("synchronized = ", synchronized);
    if (synchronized == true)
      return true;
  }

Код циклится. Так он может висеть хоть весь день. Хотя, условие условие т.е. цикл должен выполняться только в случае, если время открытия имеет значение WRONG_VALUE, иначе, не выполняется. С чего вдруг получаемое значение всегда WRONG_VALUE ?

 

Вот стартовый код.

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameters
input int count=1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 high_PERIOD_CURRENT[];
   ResetLastError();
   int copy=-1;
   copy=CopyHigh(Symbol(),Period(),0,count,high_PERIOD_CURRENT);
   if(copy!=count)
     {
      Print("CopyHigh ",EnumToString(Period())," error #",GetLastError(),", запросили ",count," получили ",copy);
      return(0);
     }
   double high_PERIOD_H1[];
   ResetLastError();
   copy=CopyHigh(Symbol(),PERIOD_H1,0,count,high_PERIOD_H1);
   if(copy!=count)
     {
      Print("CopyHigh ",EnumToString(PERIOD_H1)," error #",GetLastError(),", запросили ",count," получили ",copy);
      return(0);
     }
   double high_PERIOD_H4[];
   ResetLastError();
   copy=CopyHigh(Symbol(),PERIOD_H4,0,count,high_PERIOD_H4);
   if(copy!=count)
     {
      Print("CopyHigh ",EnumToString(PERIOD_H4)," error #",GetLastError(),", запросили ",count," получили ",copy);
      return(0);
     }
//--- па баммм! данные получили
   Comment(copy);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Во входных параметрах поставьте тысяч 5.

Файлы:
Test.mq5  6 kb
 
Это понятно. А в цикле почему не получаются значения?
Причина обращения: