Индикатор не сразу начинает работать

 

Добрый день!

Почему, когда "бросаешь" индикатор на график, то

он  не сразу начинает работать?

Приходится 5-7 раз устанавливать его. 

 
Mikalas:

Добрый день!

Почему, когда "бросаешь" индикатор на график, то

он  не сразу начинает работать?

Приходится 5-7 раз устанавливать его. 

Он до того момента как начал работать вываливается (его нет в списке индикаторов) или после того как он начал работать - индикаторов  уже в списке 5-7 шт?

 
Mikalas:

Добрый день!

Почему, когда "бросаешь" индикатор на график, то

он  не сразу начинает работать?

Приходится 5-7 раз устанавливать его. 

Если это в выходные - значит индикатор тесно завязан на условие 

if(prev_calculate==0)

 

Можно поступить так: правый клик на графике с индикатором и выбрать команду "Обновить". 

 
MigVRN:

Он до того момента как начал работать вываливается (его нет в списке индикаторов) или после того как он начал работать - индикаторов  уже в списке 5-7 шт?

Нет, не вываливается, просто нет самого графика.

Уебрешь - установишь (5-7) раз, тогда появляется график. 

 
Mikalas:

Нет, не вываливается, просто нет самого графика.

Уебрешь - установишь (5-7) раз, тогда появляется график. 

CopyRates() в функции OnCalculate() используется?
 
barabashkakvn:

Если это в выходные - значит индикатор тесно завязан на условие 

 

Можно поступить так: правый клик на графике с индикатором и выбрать команду "Обновить". 

Ок, зафурыкало :)
 
Mikalas:
Ок, зафурыкало :)
Аккуратнее! Такое поведение индюка говорит, что где-то косяк. Правая кнопка и команда "Обновить" не меняет prev_calculated. Команда "Обновить" просто запускает OnCalculate() ещё раз. Значит при первом запуске где-то косяк. Если есть CopyRates() в OnCalculate() лучше посмотрите - срабатывает она как надо при первом запуске или нет.
 
MigVRN:
Аккуратнее! Такое поведение индюка говорит, что где-то косяк. Правая кнопка и команда "Обновить" не меняет prev_calculated. Команда "Обновить" просто запускает OnCalculate() ещё раз. Значит при первом запуске где-то косяк. Если есть CopyRates() в OnCalculate() лучше посмотрите - срабатывает она как надо при первом запуске или нет.
Нeт CopyRates()? есть CopyTimes() 
 

Mikalas:
Нeт CopyRates()? есть CopyTimes() 

Сделайте контроль количества копируемых элементов (должно быть >0) и в случае ошибки Print() и return(). Скорее всего при первом запуске увидите ошибку в этой функции (в журнале).

 
MigVRN:

Сделайте контроль количества копируемых элементов (должно быть >0) и в случае ошибки Print() и return(). Скорее всего при первом запуске увидите ошибку в этой функции (в журнале).

В том то и дело, что проверки стоят и нет ошибок!

Спасибо, нашел "косяк" 

 

"Косяк" нашел, но что с ним делать?

 Проверяя историю этой функцией:

//+------------------------------------------------------------------+
//| Custom indicator Check Load History function                     |
//+------------------------------------------------------------------+
bool CheckLoadHistory( string symbol, ENUM_TIMEFRAMES period, datetime start_date )
{
  if ( !SymbolInfoInteger( symbol, SYMBOL_SELECT ) )
  {
    if ( GetLastError() == ERR_MARKET_UNKNOWN_SYMBOL ) return( false );
    SymbolSelect( symbol,true );
  }
//---
  if ( MQL5InfoInteger( MQL5_PROGRAM_TYPE ) == PROGRAM_INDICATOR && Period() == period && Symbol() == symbol )
      return( false ); 
//---
   datetime first_date;
   datetime times[1];
   if ( SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date ) )
   {
     if ( first_date > 0 )
     {
       CopyTime( symbol, period, first_date + PeriodSeconds( period ), 1, times );
//--- 
       if( SeriesInfoInteger( symbol,period, SERIES_FIRSTDATE, first_date ) )
       if ( ( first_date > 0 ) && ( first_date <= start_date ) ) return( true );
     }
   }       
//---     
  int max_bars = TerminalInfoInteger( TERMINAL_MAXBARS );
//--- load symbol history info
   datetime first_server_date = 0;
   int fail_cnt = 0;
   while( !SeriesInfoInteger( symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE, first_server_date ) )
   {
     fail_cnt++;
     if ( fail_cnt >= 1000 ) 
     {
       Print( " У серии ", symbol, " нет начальной даты! ", first_server_date );
       return( false );
     }  
     Sleep( 100 );
   }  
//--- wait for timeseries build
  while( !SeriesInfoInteger( symbol, period, SERIES_SYNCHRONIZED ) && !IsStopped() ) Sleep( 10 );
//--
  int bars = Bars( symbol, period );
//---  
  if ( bars > 0 )
  { 
    if ( bars >= max_bars ) return( false );
//--- ask for first date
    if ( SeriesInfoInteger( symbol, period, SERIES_FIRSTDATE, first_date ) )
    {
      if ( symbol == _Symbol )
      {
        if ( ( first_date > 0 ) && ( first_date <= start_date ) ) return( true );
      }
      else
      {
        if ( first_date > 0 ) return( true );
      }    
    }
  }
  else
  {
    Print( "Не получены данные по символу ", symbol );
  } 
  return( false ); 
}

 Получаю следующее:

 

 

Как быть? 

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