Erros, bugs, perguntas - página 1802

 
Alexey Kozitsyn:
Está a sugerir que o faça em cada carraça?
Eu apoio a sincronização em cada disparo do OnBookEvent() :(
 
prostotrader:
Apoio a sincronização em cada disparo do OnBookEvent() :(
Sem perguntas aqui, a questão é que, para além disto, é sugerido que se ligue sempre para CopyRates()..... isto parece-me ser uma espécie de birra.
 
Alexey Kozitsyn:
Sem perguntas aqui, a questão é que, para além disto, sugere-se que se chame cada vez a função CopyRates()..... Isto parece-me ser uma birra...

:)

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

Foi assim que me ensinaram em SD

 
prostotrader:

:)

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

Se quiser dizer ou mostrar alguma coisa, por favor mostre-a devidamente... Não quero adivinhar que função tem aqui e o que ela faz.

Adicionado:

Ensinou-me? E não deu uma implementação?

 
Alexey Kozitsyn:

Se quiser dizer ou mostrar alguma coisa, por favor mostre-a devidamente... Não quero adivinhar que função tem aqui e o que ela faz.

Adicionado:

Ensinou-me? E não deu uma implementação?

O que é normal?

Disseram que em dois minutos os dados são descarregados e para manter a sincronização

disseram-me para ligar aos bares.

//+------------------------------------------------------------------+
//| 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);
}
Procurarei a implementação integral.
 

Aqui está

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


Ao ligar para GetBars, estamos a fazer o backup da sincronização ou a tentar recuperar dados

 
prostotrader:

O que é normal?

Disseram que após dois minutos os dados são descarregados e para os manter em sincronia

disseram para chamar 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);
}

Não são estes os análogos?

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

Sim, pareceu-me que Bars() retorna 0 se não houver sincronização... Terei de fazer um teste...

 
Alexey Kozitsyn:
Está a sugerir que o faça em todas as carraças?
Porquê? Uma única acção é suficiente.

Enquanto o símbolo for seleccionado na visão geral do mercado e o histórico do símbolo for mantido pelo Consultor Especialista, então é mantido em sincronia. Segurar pelo consultor especializado significa que precisa de aceder a este histórico pelo menos uma vez a cada 2 minutos, por exemplo, copiando uma barra. Se o histórico estiver sincronizado, não é gasto tempo a copiar uma barra - apenas alguns ciclos de processamento. Ou, como acabou de ser dito aqui, pedir o número de barras, também alguns ciclos de relógio
 
Slawa:
Porquê? Uma única acção é suficiente.

Enquanto o símbolo for seleccionado na revisão do mercado e o histórico do símbolo for mantido pelo Consultor Especialista, é mantido em sincronia. A detenção de Expert Advisor significa que precisa de aceder a este histórico pelo menos uma vez a cada 2 minutos, por exemplo, copiando uma barra. Se o histórico estiver sincronizado, então não é gasto tempo a copiar uma barra - apenas alguns relógios de processador.

Os indicadores incluem um intervalo de 2 minutos?

Sim, e verificando o facto da sincronização, a sincronização também será realizada?

 
Alexey Kozitsyn:

Os indicadores incluem um intervalo de 2 minutos?

Sim, a verificação da sincronização também irá manter a sincronização?

Também se aplica aos indicadores. Crie um temporizador de 1 minuto e pergunte o número de barras de todas as séries de tempo em que está interessado.

A sincronização não é realizada através da verificação do facto da sincronização.