Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Mikhail Filimonov
5931
Mikhail Filimonov  

Добрый день!

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

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

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

Andrey Miguzov
2128
Andrey Miguzov  
Mikalas:

Добрый день!

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

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

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

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

Vladimir Karputov
Модератор
50097
Vladimir Karputov  
Mikalas:

Добрый день!

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

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

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

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

if(prev_calculate==0)

 

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

Mikhail Filimonov
5931
Mikhail Filimonov  
MigVRN:

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

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

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

Andrey Miguzov
2128
Andrey Miguzov  
Mikalas:

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

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

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

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

 

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

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

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

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

Mikhail Filimonov
5931
Mikhail Filimonov  
MigVRN:

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

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

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

Mikhail Filimonov
5931
Mikhail Filimonov  

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

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

//+------------------------------------------------------------------+
//| 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 ); 
}

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

 

 

Как быть? 

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий