Запрос на загрузку бара mql5 - страница 2

 
Galina Bobro:

... И как узнать посчитан ли n-й бар? 

Где посчитан, в индикаторе? Если в индикаторе, то смотрим prev_calculated, но здесь только два варианта: не посчитано ничего (значит считаем для всех баров), и посчитано все (считаем для одного формирующегося бара). Промежуточных вариантов типа не просчитано 2, 3, 5 и т.п. баров нет.

Еще есть функция BarsCalculated(), может пригодиться.

 
Dmitry Fedoseev:

Где посчитан, в индикаторе? Если в индикаторе, то смотрим prev_calculated, но здесь только два варианта: не посчитано ничего (значит считаем для всех баров), и посчитано все (считаем для одного формирующегося бара). Промежуточных вариантов типа не просчитано 2, 3, 5 и т.п. баров нет.

Еще есть функция BarsCalculated(), может пригодиться. 

Понятно, спасибо. Вот за последний вариант я и спрашивала. Мала вероятность что он одним разом подгрузит 500 баров*20 валют или даже 50 без ошибок... Точнее попыток будет очень много... И так не быстро работает (загружается первоначально где-то от 10 сек до минуты). Заказчик в печали(

Лучше уж лишний кусок памяти раз такая соль.

 
Galina Bobro:

Понятно, спасибо. Вот за последний вариант я и спрашивала. Мала вероятность что он одним разом подгрузит 500 баров*20 валют или даже 50 без ошибок... Точнее попыток будет очень много... И так не быстро работает (загружается первоначально где-то от 10 сек до минуты). Заказчик в печали(

Лучше уж лишний кусок памяти раз такая соль.

Да нет. Должно нормально работать. Проблемы могут быть только при запуске, пока другие таймфреймы не обновлены. Потом все нормально должно быть. Нужно на каждом баре хотя бы один раз запрашивать данные, даже если они не нужны.

Еще может интернет слабый? 

 
Dmitry Fedoseev:

Проблемы могут быть только при запуске, пока другие таймфреймы не обновлены. 

Вот-вот, в том и проблема что таймфреймы не обновлены...  Если по другом, то получится что он загружается и показывает фигу. Для использования в сове, он дергает по бару (там нулевой только нужно), думаю должно быть тут норм. 
Dmitry Fedoseev:

Еще может интернет слабый?  

Или кто-то не убрал слип... По прежнему делал 100 попыток загрузить из слипом соответственно. Поставила 3 попытки.
 
Galina Bobro:
Вот-вот, в том и проблема что таймфреймы не обновлены...  Если по другом, то получится что он загружается и показывает фигу. Для использования в сове, он дергает по бару (там нулевой только нужно), думаю должно быть тут норм.  Или кто-то не убрал слип... По прежнему делал 100 попыток загрузить из слипом соответственно. Поставила 3 попытки.

Добрый день!

Аналогичную проблему я поднимал здесь:

https://www.mql5.com/ru/forum/42180

MQ исправили ошибку SymbolIsSynchronized(), но если нет долгого обращения к таймсерии, то через

таймер её нужно периодически "дёргать"

Вот код, который нормально (может быть Вам пригодится), но если нет долгого обращения, придётся использовать таймер.

//+------------------------------------------------------------------+
// Custom indicator Check timer function                             |
//+------------------------------------------------------------------+
bool CheckTimer( const uint start_value, const uint per_value )
{
  uint end_value = GetTickCount();
  
  if ( end_value < start_value )
  {
    if ( ( start_value - end_value ) >= per_value ) return( true );
  } 
  else
  {
    if ( ( end_value - start_value ) >= per_value ) return( true );
  }
  return( false );
}
//+------------------------------------------------------------------+
//| Custom indicator Get local data function                         |
//+------------------------------------------------------------------+
int GetLocalData( const string a_symbol, ENUM_TIMEFRAMES a_period )
{
//--- Enough data in timeseries
  int a_bars = Bars( a_symbol, a_period );
//---  
  if ( a_bars > 0 ) return ( a_bars );
//---  
 // Print( "GetLocalData: Нет баров за выбранный период! Пробуем построить таймсерию..." ); 
  int fail_cnt = 0;
  datetime times[1];
  long bars = 0;
//---  
  while ( ( fail_cnt < 5 ) && !IsStopped() )
  {
    if ( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_BARS_COUNT, bars ) )
    {
      if ( bars >= long( double( PeriodSeconds( a_period ) ) / 60 ) )
      {
//--- force timeseries build
        CopyTime( a_symbol, a_period, 0, 1, times );
//---        
        uint start_tick = GetTickCount();
//---        
        while ( !CheckTimer( start_tick, 5 ) )
        {
          fail_cnt--;
          fail_cnt++;
        }
//--- check 
        if ( SeriesInfoInteger( a_symbol, a_period, SERIES_BARS_COUNT, bars ) )
          if ( bars > 0 ) return( int( bars ) );
      }
    }
    fail_cnt++;
  }
 // Print( "GetLocalData: Таймсерия не построена!" );
  return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator Get server data function                        |
//+------------------------------------------------------------------+
int LoadServerData( const string a_symbol, ENUM_TIMEFRAMES period )
{
  int fail_cnt = 0;
//---
  while ( ( fail_cnt < 5 ) && !IsStopped() )
  {   
    long first_date = long( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE ) );
//---
    if ( first_date > 0 )
    {
     // Print( "LoadServerData: Первая дата на сервере есть. Пробуем получить локальные данные..." );
      return( GetLocalData( a_symbol, period ) );
    }
    else
    {
      uint start_tick = GetTickCount();
//---        
      while ( !CheckTimer( start_tick, 10 ) )
      {
        fail_cnt--;
        fail_cnt++;
      }
    }    
    fail_cnt++;
  }
 // Print( "LoadServerData: Первой даты на сервере нет!" );
  return( 0 );  
}
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period )
{
  if ( !IsStopped() )
  {
//---Check symbol is synchronized  
    if ( SymbolIsSynchronized( symbol ) )
    {
    //  Print( "GetBars: Символ сихронизирован. Проверяем таймсерию..." );
//---Check series is synchronized
      if ( bool( SeriesInfoInteger( symbol, period, SERIES_SYNCHRONIZED ) ) )
      {
     //   Print( "GetBars: Серия синхронизирована. Пробуем получить бары..." );
//---  
        int fail_cnt = 0;
//---            
        while ( ( fail_cnt < 3 ) && !IsStopped() )
        { 
          int a_bars = Bars( symbol, period );  
//---            
          if ( a_bars > 0 ) return( a_bars );
//---
          uint start_tick = GetTickCount();
//---        
          while ( !CheckTimer( start_tick, 5 ) )
          {
            fail_cnt--;
            fail_cnt++;
          }
          fail_cnt++;
        } 
      }
      else
      {
     //   Print( "GetBars: Серия не сихронизирована. Пробуем получить данные из терминала..." );
        return( GetLocalData( symbol, period ) );
      }    
    }
    else
    {
   //   Print( "GetBars: Символ не синхронизирован. Пробуем получить данные с сервера..." );
      return( LoadServerData( symbol, period ) );
    }
  }  
  return( 0 );
}

  Сначала вызываете GetBars(), а затем СopyClose()

ФОРТС Прошу помощи
ФОРТС Прошу помощи
  • www.mql5.com
Прошу откомпилировать этот код и "бросить" индикатор на символ MIX-6. - - Категория: автоматические торговые системы
 
Михаил:

Добрый день!

Аналогичную проблему я поднимал здесь:

https://www.mql5.com/ru/forum/42180

MQ исправили ошибку SymbolIsSynchronized(), но если нет долгого обращения к таймсерии, то через

таймер её нужно периодически "дёргать"

Вот код, который нормально (может быть Вам пригодится), но если нет долгого обращения, придётся использовать таймер.

  Сначала вызываете GetBars(), а затем СopyClose()

Спасибо, правда в справке сказано что 

SymbolIsSynchronized
Проверяет факт синхронизированности данных по указанному символу в терминале с данными на торговом сервере

Но не загружает... И за Bars не указано что инициирует загрузку данных... Но проверю тогда.  

 
Galina Bobro:
Спасибо, правда в справке сказано что 

Но не загружает... И за Bars не указано что инициирует загрузку данных... Но проверю тогда.  

Да, не загружает, но инициирует загрузку.

( в справке не точно написано )

Чтобы правильно построить таймсерию, символ должен быть синхронизирован, т.е данные в терминале должны

совпадать с данными на сервере. 

 

В справке ничего нет про SymbolIsSynchronized, что она загружает или синхронизирует или еще чего-то.

А вот Bars() - хорошая полезная функция, самая нужная: инициирует построение таймфрейма, загрузку и дожидается синхронизации.

В справке: 

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение. 

 
Dmitry Fedoseev:

В справке ничего нет про SymbolIsSynchronized, что она загружает или синхронизирует или еще чего-то.

А вот Bars() - хорошая полезная функция, самая нужная: инициирует построение таймфрейма, загрузку и дожидается синхронизации.

В справке: 

Хорошее замечание.

Если сначала прверять Bars(), то если всё синхронизировано, то функция GetBars() будет работать быстрее:

//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period )
{
  if ( !IsStopped() )
  {
    int a_bars = Bars( symbol, period );
//---
    if ( a_bars > 0 )
    {
      return( a_bars ); 
    }
    else
    {
//---Check symbol is synchronized  
      if ( SymbolIsSynchronized( symbol ) )
      {
    //  Print( "GetBars: Символ сихронизирован. Проверяем таймсерию..." );
//---Check series is synchronized
        if ( bool( SeriesInfoInteger( symbol, period, SERIES_SYNCHRONIZED ) ) )
        {
     //   Print( "GetBars: Серия синхронизирована. Пробуем получить бары..." );
          a_bars = Bars( symbol, period );  
//---            
            if ( a_bars > 0 ) return( a_bars );
        }
        else
        {
     //   Print( "GetBars: Серия не сихронизирована. Пробуем получить данные из терминала..." );
          return( GetLocalData( symbol, period ) );
        }    
      }  
      else
      {
 //     Print( "GetBars: Символ не синхронизирован. Пробуем получить данные с сервера..." );
        return( LoadServerData( symbol, period ) );
      }  
    }   
  }  
  return( 0 );
}