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

 

Не ждите в ините индикатора полного создания индикатора.

Создайте индикатор и возвращайте управление, а все окружение и история будут подготовлены позже и вызван ваш код пересчета.

 
Renat Fatkhullin:

Не ждите в ините полного создания индикатора.

Создайте индикатор и возвращайте управление, а все окружение и история будут подготовлены позже и вызван ваш код пересчета.

Спасибо, то есть проверку на 4806 нужно производить каждый раз при получении данных уже после возврата из OnInit()?
 
В каждом месте чтения данных
 

Здесь происходит обращение к индикатору и расчет его значений внутри OnCalculate. Ждать можно бесконечно, пересчета не происходит. Запускать на графике периода D1

int i_ich=INVALID_HANDLE;
double ind_buf[];

int OnInit(){
   i_ich=iIchimoku(Symbol(), PERIOD_H4, 9, 26, 52);
   if(i_ich==INVALID_HANDLE){
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
   }
   SetIndexBuffer(0, ind_buf, INDICATOR_DATA);
   ArraySetAsSeries(ind_buf, true);
   return(INIT_SUCCEEDED);
}


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 temp[];
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied<=0){
      datetime now=TimeLocal();
      while(BarsCalculated(i_ich)<=0 && !IsStopped()){  
         Comment("Ждем пересчета индикатора Ишимоку... ",int(TimeLocal()-now));
      }
      if(BarsCalculated(i_ich)>0){
         Print("Расчитано ", BarsCalculated(i_ich), " баров за ",int(TimeLocal()-now)," секунд");
      }
      Comment("");
   } 

   return(rates_total);
}

Прошу объяснить, почему показания Ишимоку не рассчитываются.

 

 
Ilya Malev:

Здесь происходит обращение к индикатору и расчет его значений внутри OnCalculate. Ждать можно бесконечно, пересчета не происходит. Запускать на графике периода D1

Прошу объяснить, почему показания Ишимоку не рассчитываются.

 

А если так:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   static int count;
   Print(count);
   double temp[];
   datetime now=TimeLocal();
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied>0)
      Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+
?
 

Нельзя зацикливать ожидание в коде индикатора никогда. В скриптах и экспертах можно, а в индикаторах категорически нельзя.

То есть, стратегия расчетов и запросов чужих данных в индикаторах должна быть такой: если запрос данных не удался, то сразу выходим, откладывая расчеты на следующий тик. В следующем тике/вызове еще раз попробуем запросить нужное.

 
Karputov Vladimir:

А если так:

?
Выводит "0" (поскольку сегодня воскресенье, повторного запуска OnCalculate не происходит)
 
Renat Fatkhullin:

Нельзя зацикливать ожидание в коде индикатора никогда. В скриптах и экспертах можно, а в индикаторах категорически нельзя.

То есть, стратегия расчетов и запросов чужих данных в индикаторах должна быть такой: если запрос данных не удался, то сразу выходим, откладывая расчеты на следующий тик. В следующем тике/вызове еще раз попробуем запросить нужное.

Ок, а если нужно за один запуск рассчитать показания индикатора, не дожидаясь следующих тиков? Например, если выходные или просто малоликвидное время, когда выходит тик в минуту? Использовать OnTimer вместо OnCalculate?
 
Ilya Malev:
Выводит "0" (поскольку сегодня воскресенье, повторного запуска OnCalculate не происходит)
В тестере, в тестере! А на выходных нужно правый клик на графике и "Обновить".
 

После нажатия на "обновить" все рассчиталось. Все таки в качестве пожелания - удобнее если бы данные индикаторов, созданных в ините рассчитывались до первого вызова OnCalculate/OnTimer etc.

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

Чтобы рассчитать индикатор пользователю придется несколько раз жать "обновить" на графике. Надо ли ему это. Он вспомнит старый добрый МТ4 и останется на нем, не смотря на некоторые преимущества МТ5.