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

 
Alexey Kozitsyn:
Вы предлагаете это на каждом тике делать?
Я поддерживаю синхронизацию на каждом срабатывании OnBookEvent() :(
 
prostotrader:
Я поддерживаю синхронизацию на каждом срабатывании OnBookEvent() :(
Тут без вопросов, вопрос в том, что помимо этого, предлагается еще и вызывать каждый раз функцию CopyRates().... это, как мне кажется, жесть какая-то...
 
Alexey Kozitsyn:
Тут без вопросов, вопрос в том, что помимо этого, предлагается еще и вызывать каждый раз функцию CopyRates().... это, как мне кажется, жесть какая-то...

:)

void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol())
  {
    GetBars(Symbol(), time_frame);
  }  
}

Так меня научили в СД
 

 
prostotrader:

:)

void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol())
  {
    GetBars(Symbol(), time_frame);
  }  
}

Вы если хотите что-то сказать, или показать - показывайте, пожалуйста, нормально... гадать, что тут у Вас за функция и что она делает не охота.

Добавлено:

Научили? А реализацию не предоставили? 

 
Alexey Kozitsyn:

Вы если хотите что-то сказать, или показать - показывайте, пожалуйста, нормально... гадать, что тут у Вас за функция и что она делает не охота.

Добавлено:

Научили? А реализацию не предоставили? 

Что нормально?

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

посоветовали вызывать Bars

//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars(string symbol, ENUM_TIMEFRAMES period)
{
  if(!IsStopped())
  {
    if(SymbolIsSynchronized(symbol))
    {
      if(bool(SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED)))
      {
        int a_bars = Bars(symbol, period);  
        if(a_bars > 0)
        {
          return(a_bars);
        }
        else
        {
          return(GetLocalData(symbol, period));
        }  
      }
      else
      {
        return(GetLocalData(symbol, period));
      }    
    }  
    else
    {
      return(LoadServerData(symbol, period));
    }  
  }  
  return(0);
}
Ща поищу полную реализацию
 

Вот

//+------------------------------------------------------------------+
// Custom indicator Check timer function                             |
//+------------------------------------------------------------------+
bool CheckTimer(const ulong start_value, const ulong per_value)
{
  ulong end_value = GetMicrosecondCount();
  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)
{
  long first_date;
  int fail_cnt = 0;
  while((fail_cnt < 3) && !IsStopped())
  {
    first_date = long( SeriesInfoInteger(a_symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE));
    if(first_date > 0)
    {
      int f_cnt = 0;
      datetime times[1];
      long a_bars = 0;
      while((f_cnt < 5) && !IsStopped())
      {
        if(bool(SeriesInfoInteger(a_symbol, PERIOD_M1, SERIES_BARS_COUNT, a_bars)))
        {
          if ( a_bars > 0 )
          {
            if( bool(SeriesInfoInteger(a_symbol, a_period, SERIES_BARS_COUNT, a_bars)))
              if(a_bars > 0) return(int(a_bars));
          }
        }
        else
        {
//--- force timeseries build
          CopyTime(a_symbol, a_period, 0, 1, times);
          ulong start_tick = GetMicrosecondCount();
          while(!CheckTimer(start_tick, 5000))
          {
            f_cnt--;
            f_cnt++;
          }  
        }
        f_cnt++;
      }
    }
    else
    {
      ulong start_tick = GetMicrosecondCount();
      while(!CheckTimer(start_tick, 5000))
      {
        fail_cnt--;
        fail_cnt++;
      }
    }
//---  
    fail_cnt++;
  }
  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)
    {
      if(SymbolIsSynchronized(a_symbol))
      {
        return(GetLocalData(a_symbol, period));
      }  
    }
    else
    {
      ulong start_tick = GetMicrosecondCount();
      while(!CheckTimer(start_tick, 20000))
      {
        fail_cnt--;
        fail_cnt++;
      }
    }    
    fail_cnt++;
  }
  return(0);  
}
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars(string symbol, ENUM_TIMEFRAMES period)
{
  if(!IsStopped())
  {
    if(SymbolIsSynchronized(symbol))
    {
      if(bool(SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED)))
      {
        int a_bars = Bars(symbol, period);  
        if(a_bars > 0)
        {
          return(a_bars);
        }
        else
        {
          return(GetLocalData(symbol, period));
        }  
      }
      else
      {
        return(GetLocalData(symbol, period));
      }    
    }  
    else
    {
      return(LoadServerData(symbol, period));
    }  
  }  
  return(0);
}


 Вызывая GetBars, мы подддерживаем синхронизацию или пытаемся получить данные 

 
prostotrader:

Что нормально?

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

посоветовали вызывать Bars

//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars(string symbol, ENUM_TIMEFRAMES period)
{
  if(!IsStopped())
  {
    if(SymbolIsSynchronized(symbol))
    {
      if(bool(SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED)))
      {
        int a_bars = Bars(symbol, period);  
        if(a_bars > 0)
        {
          return(a_bars);
        }
        else
        {
          return(GetLocalData(symbol, period));
        }  
      }
      else
      {
        return(GetLocalData(symbol, period));
      }    
    }  
    else
    {
      return(LoadServerData(symbol, period));
    }  
  }  
  return(0);
}

Разве это не аналоги:

if(SymbolIsSynchronized(symbol))
if(bool(SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED)))

Да, мне казалось, что Bars() возвращает 0, если нет синхронизации... Надо будет провести тест...
 

 
Alexey Kozitsyn:
Вы предлагаете это на каждом тике делать?
Зачем? Достаточно однократного действия.

И пока символ выбран в обзоре рынка и история по символу удерживается экспертом, то она поддерживается в синхронизированном состоянии. Удержание экспертом означает не реже 1 раза в 2 минуты обращаться к этой истории, например копированием одного бара. Если история синхронизирована, то на копирование одного бара время не тратится - всего несколько тактов процессора. Либо, как тут только что сказали, спрашивать количество баров, тоже несколько тактов
 
Slawa:
Зачем? Достаточно однократного действия.

И пока символ выбран в обзоре рынка и история по символу удерживается экспертом, то она поддерживается в синхронизированном состоянии. Удержание экспертом означает не реже 1 раза в 2 минуты обращаться к этой истории, например копированием одного бара. Если история синхронизирована, то на копирование одного бара время не тратится - всего несколько тактов процессора.

К индикаторам относится интервал в 2 минуты?

Да, а проверкой факта синхронизации синхронизация также будет удерживаться?

 
Alexey Kozitsyn:

К индикаторам относится интервал в 2 минуты?

Да, а проверкой факта синхронизации синхронизация также будет удерживаться?

К индикаторам тоже относится. Создайте 1-минутный таймер и спрашивайте количество баров у всех интересующих Вас таймсерий.

Проверкой факта синхронизированности синхронизация не удерживается.
Причина обращения: