Erreurs, bugs, questions - page 1802

 
prostotrader:
Je supporte la synchronisation à chaque déclenchement de OnBookEvent() :(
Aucune question ici, la question est qu'en plus de cela, il est suggéré d'appeler CopyRates().... à chaque fois. cela me semble être une sorte de crise de colère...
 
Alexey Kozitsyn:
Il n'y a pas de doute, la question est qu'en plus de cela, il est suggéré d'appeler CopyRates().... à chaque fois. Cela me semble être une crise de colère...

:)

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

C'est comme ça qu'on m'a appris en SD

 
prostotrader:

:)

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

Si vous voulez dire ou montrer quelque chose, montrez-le correctement... Je ne veux pas deviner quelle fonction vous avez ici et ce qu'elle fait.

Ajouté :

Tu m'as appris ? Et vous n'avez pas donné d'implémentation ?

 
Alexey Kozitsyn:

Si vous voulez dire ou montrer quelque chose, montrez-le correctement... Je ne veux pas deviner quelle fonction vous avez ici et ce qu'elle fait.

Ajouté :

Tu m'as appris ? Et vous n'avez pas donné d'implémentation ?

Qu'est-ce qui est normal ?

Ils ont dit que dans deux minutes les données sont déchargées et pour maintenir la synchronisation

ils m'ont dit d'appeler 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);
}
Je vais chercher la mise en œuvre complète.
 

Voici

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


En appelant GetBars, nous sauvegardons la synchronisation ou essayons de récupérer des données.

 
prostotrader:

Qu'est-ce qui est normal ?

Ils ont dit qu'après deux minutes, les données sont déchargées et pour les garder en synchronisation

ils ont dit d'appeler 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);
}

Ne sont-elles pas les analogues :

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

Oui, il me semblait que Bars() renvoie 0 s'il n'y a pas de synchronisation... Je vais devoir faire un test...

 
Alexey Kozitsyn:
Suggérez-vous que vous fassiez cela à chaque tic-tac ?
Pourquoi ? Une seule action suffit.

Tant que le symbole est sélectionné dans la vue d'ensemble du marché et que l'historique du symbole est détenu par le conseiller expert, il est maintenu en synchronisation. Le maintien par le conseiller expert signifie que vous devez accéder à cet historique au moins une fois toutes les 2 minutes, par exemple en copiant une barre. Si l'historique est synchronisé, aucun temps n'est passé à copier une barre - seulement quelques cycles de processeur. Ou, comme cela vient d'être dit ici, demandez le nombre de barres, également quelques cycles d'horloge...
 
Slawa:
Pourquoi ? Une seule action suffit.

Tant que le symbole est sélectionné dans la revue de marché et que l'historique du symbole est détenu par le Conseiller Expert, il est maintenu en synchronisation. Le maintien du conseiller expert signifie que vous devez accéder à cet historique au moins une fois toutes les 2 minutes, par exemple en copiant une barre. Si l'historique est synchronisé, aucun temps n'est passé à copier une barre - seulement quelques horloges de processeur.

Les indicateurs comprennent-ils un intervalle de 2 minutes ?

Oui, et en vérifiant le fait de la synchronisation, la synchronisation sera-t-elle également retenue ?

 
Alexey Kozitsyn:

Les indicateurs comprennent-ils un intervalle de 2 minutes ?

Oui, et en vérifiant le fait de synchronisation, la synchronisation sera-t-elle également maintenue ?

Cela s'applique également aux indicateurs. Créez une minuterie d'une minute et demandez le nombre de barres de toutes les séries chronologiques qui vous intéressent.

La synchronisation n'est pas tenue par la vérification du fait de la synchronisation.
 
Slawa:
Ou, comme on vient de le dire ici, demandez le nombre de barres, également quelques cycles.
S'il y a un appel de la fonction Bars() après une longue période d'inactivité, le démarrage de l'indicateur - est-ce que cela revient à vérifier SymbolIsSynchronized() ?