Fehler, Irrtümer, Fragen - Seite 1802

 
Alexey Kozitsyn:
Soll das bei jedem Tick gemacht werden?
Ich unterstütze die Synchronisierung bei jedem Trigger von OnBookEvent() :(
 
prostotrader:
Ich unterstütze die Synchronisierung bei jedem Auslösen von OnBookEvent() :(
Keine Fragen hier, die Frage ist, dass zusätzlich zu diesem, es wird vorgeschlagen, CopyRates().... jedes Mal aufrufen. Das scheint mir eine Art Wutanfall zu sein...
 
Alexey Kozitsyn:
Keine Fragen hier, die Frage ist, dass zusätzlich zu diesem, wird vorgeschlagen, jedes Mal die CopyRates().... Funktion aufrufen. Das scheint mir ein Wutanfall zu sein...

:)

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

So wurde es mir in SD beigebracht

 
prostotrader:

:)

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

Wenn Sie etwas sagen oder zeigen wollen, zeigen Sie es bitte richtig... Ich möchte nicht raten, welche Funktion Sie hier haben und was sie tut.

Hinzugefügt:

Haben Sie mich unterrichtet? Und Sie haben keine Umsetzung angegeben?

 
Alexey Kozitsyn:

Wenn Sie etwas sagen oder zeigen wollen, zeigen Sie es bitte richtig... Ich möchte nicht raten, welche Funktion Sie hier haben und was sie tut.

Hinzugefügt:

Haben Sie mich unterrichtet? Und Sie haben keine Umsetzung angegeben?

Was ist normal?

Sie sagten, dass die Daten in zwei Minuten entladen werden und die Synchronisation aufrechterhalten wird

Sie sagten mir, ich solle Bars anrufen.

//+------------------------------------------------------------------+
//| 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);
}
Ich werde nach der vollständigen Umsetzung suchen.
 

Hier ist

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


Durch den Aufruf von GetBars wird die Synchronisation gesichert oder es wird versucht, Daten abzurufen

 
prostotrader:

Was ist normal?

Sie sagten, dass die Daten nach zwei Minuten entladen werden und dass sie synchronisiert werden müssen.

Sie sagten, ich solle Bars anrufen.

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

Sind das nicht die Entsprechungen:

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

Ja, ich hatte den Eindruck, dass Bars() 0 zurückgibt, wenn es keine Synchronisierung gibt... Ich werde einen Test machen müssen...

 
Alexey Kozitsyn:
Wollen Sie damit sagen, dass dies bei jeder Zecke gemacht werden sollte?
Und warum? Eine einzige Aktion ist ausreichend.

Solange das Symbol in der Marktübersicht ausgewählt ist und die Historie für das Symbol im Expert Advisor vorhanden ist, wird es synchron gehalten. Das Halten durch den Expert Advisor bedeutet, dass Sie mindestens einmal alle 2 Minuten auf diese Historie zugreifen müssen, indem Sie z.B. einen Balken kopieren. Wenn die Historie synchronisiert ist, wird für das Kopieren eines Taktes keine Zeit aufgewendet - nur ein paar Prozessorzyklen. Oder, wie es hier gerade gesagt wurde, fragen Sie nach der Anzahl der Takte, auch ein paar Taktzyklen
 
Slawa:
Warum? Eine einzige Aktion ist ausreichend.

Solange das Symbol in der Marktübersicht ausgewählt ist und die Historie des Symbols im Expert Advisor gespeichert ist, wird es synchronisiert. Das Halten des Expert Advisors bedeutet, dass Sie mindestens einmal alle 2 Minuten auf diese Historie zugreifen müssen, indem Sie zum Beispiel einen Balken kopieren. Wenn der Verlauf synchronisiert ist, wird keine Zeit für das Kopieren eines Taktes aufgewendet, sondern nur ein paar Prozessor-Takte.

Enthalten die Indikatoren einen Abstand von 2 Minuten?

Ja, und wird bei der Überprüfung der Synchronisierung auch die Synchronisierung beibehalten?

 
Alexey Kozitsyn:

Enthalten die Indikatoren einen Abstand von 2 Minuten?

Ja, und wird durch die Überprüfung der Synchronisierung auch die Synchronisierung beibehalten?

Dies gilt auch für Indikatoren. Erstellen Sie einen 1-Minuten-Timer und fragen Sie die Anzahl der Balken aller Zeitreihen ab, an denen Sie interessiert sind.

Die Synchronisierung wird nicht durch die Überprüfung der Tatsache der Synchronisierung gehalten.