Was RefreshRates() aktualisiert - Seite 3

 
Artyom Trishkin:

Wenn Sie Fehler in iXXXXX-Funktionen vermuten, verwenden Sie SymbolInfoXXXXXX-Funktionen

Kann ein Beispiel für das Ersetzen von iXXXXX durch SymbolInfoXXXXXX.

 
Mikhail Nazarenko:

Mein Code ist ähnlich. Fehler in OnTick

sollte es sein

Wenn wir den aktuellen Zeitrahmen M5 haben, sollten wir M5 mit H1 und M1 vergleichen

Der aktuelle Zeitrahmen M5 wird korrekt angezeigt. Das Problem lag bei H1 und M1.

Ich überprüfte auf Alpari realen EURCHF M5 nur anstelle von Print Ich zog horizontale Balken auf jeder der Ebenen.

Ja, ich hatte H1 zuerst so formuliert, aber dann beschlossen, dass es zu seltene Vergleiche sein würden. Also habe ich es in M5 geändert.

Mikhail Nazarenko:

Darf ich Ihnen ein Beispiel für die Ersetzung von iXXXXXXX durch SymbolInfoXXXXXX geben?

Artyom hat einen kleinen Fehler gemacht...

Anstelle von iClose können Sie auch

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

etwas wie dies

double close_M5[];
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);

Auf diese Weise können Sie mit einer Bewegung des Zauberstabs Werte für mehrere Takte erhalten.

Die Funktion gibt true oder false zurück, aber ich habe es in diesem Beispiel nicht überprüft. Sie können es selbst erraten...

 
Alexey Viktorov:
Ja, so hatte ich H1 zuerst formuliert, aber dann habe ich beschlossen, dass es zu seltene Vergleiche sein würden. Also habe ich es in M5 geändert.

Ich habe Ihren Code dort fertiggestellt und ihn oben gepostet. Ich habe Ihre Version in meine eingefügt, und das Ergebnis ist das gleiche. Bei fast jeder M5-Kerze gibt es eine Unstimmigkeit. Wie lauten Ihre Ergebnisse?

 
Mikhail Nazarenko:

Ich habe Ihren Code dort fertiggestellt und ihn oben gepostet. Ich habe Ihre Version in meine eingefügt, und das Ergebnis ist das gleiche. Bei fast jeder M5-Kerze gibt es eine Unstimmigkeit. Wie lauten Ihre Ergebnisse?

Hier müssen wir ändern

if(NewBar(PERIOD_M5))

zu

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

Hier müssen wir ändern

zu

Nein, besser _Period. Denn wir werden zwangsweise auf die Null-Notierung von H1 warten, während der aktuelle Zeitraum korrekt aktualisiert wird. Die Daten sollten in den ersten Sekunden der Stunde empfangen werden, nicht wenn die Stunde aktualisiert wird.

Ich möchte das Beispiel ergänzen und
double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 
überprüfen.

 
Alexey Viktorov:

Hier müssen wir ändern

zu

Das Ergebnis ist dasselbe wie bei iClose(); iClose und CopyClose scheinen Daten von derselben Stelle zu beziehen.

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

Nein, besser _Period. Denn wir werden zwangsweise auf die Null-Notierung von H1 warten, während der aktuelle Zeitraum korrekt aktualisiert wird. Die Daten sollten in den ersten Sekunden der Stunde empfangen werden, nicht wenn die Stunde aktualisiert wird.

Ich möchte das Beispiel ergänzen und prüfen

Es scheint, dass Sie überhaupt nicht verstehen, wie die Funktion des Erscheinens eines neuen Balkens funktioniert.

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

Und folglich.

Mikhail Nazarenko:

Das Ergebnis ist dasselbe wie bei iClose(); iClose und CopyClose scheinen Daten von derselben Stelle zu beziehen.

Beim Empfang von Bar Closure-Werten und anderen von OHLC, wenn ein neuer TIKA-Wert empfangen wird, gibt es immer kein Problem.
 
Alexey Viktorov:

Sie scheinen überhaupt nicht zu verstehen, wie die neue Balkenfunktion funktioniert.

Und folglich.

Beim Abrufen von Bar-Close-Werten und anderen von OHLC, wenn ein neuer TIKA eintrifft, sind die Werte immer ohne Probleme.

Beantworten Sie die Frage. Warum gibt die Funktion iClose(1) bei einer neuen Kerze veraltete Informationen und keine aktualisierten Daten oder einen Fehler zurück? Dies ist ein Fehler.

 
Mikhail Nazarenko:

Beantworten Sie die Frage. Warum gibt die Funktion iClose(1) bei einer neuen Kerze veraltete Informationen zurück und nicht aktualisierte oder einen Fehler? Dies ist ein Fehler.

Wenn es ein Fehler ist, dann sollte ihn jeder oder fast jeder haben. Wenn es nur Sie betrifft, dann ist es ein Problem im Code.

Ich habe meine EA auf M15 mit Bestimmung eines neuen Bar H1

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_H1))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M5[0], "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

Und genau das steht in dem Kommentar.

Es gibt keine Diskrepanz.

 
OK, danke an alle Entwickler für ihre Aufmerksamkeit, ich bin weg, um Krücken wie NewBar zu schaffen.))) Thema geschlossen.