Was RefreshRates() aktualisiert - Seite 2

 
iClose: Null - Fehler. Die Funktion gibt keinen Fehler aus. Sie gibt einen Wert an, der derzeit veraltet ist.
 
Ich habe hier gelesen, dass " iClose() den Wert vom Server des Brokers abruft". Wenn die Daten dieser Funktionen von ehrlichen Brokern generiert werden, dann passt alles zusammen.))) Es stellt sich heraus, dass wir nur dem aktuellen Tick vertrauen können.
 
Artyom Trishkin:
Nein, das ist es nicht. Was steht in der Funktionshilfe über den Rückgabewert?
iClose

Zurückgegebener Wert

Wert des Bar-Close-Preises (angegeben durch den Shift-Parameter) des entsprechenden Charts oder 0 im Falle eines Fehlers. Rufen Sie GetLastError() auf, um weitere Informationen über den Fehler zu erhalten.

Wenn der Wert nicht 0 ist, liegt kein Fehler vor. Aber der Wert ändert sich auch nicht..., also wird er ohne RefreshRates(); nicht aktualisiert, was mich überrascht hat.
 
Mikhail Nazarenko:

Und wenn Sie den Zeitrahmen auf einen anderen als den aktuellen ändern, werden die Daten auch mit RefreshRates() nicht rechtzeitig aktualisiert. Die grundlegenden Funktionen von iClose etc. in MT4 produzieren also irrelevanten Blödsinn. Ich bin mir sicher, dass 80% der Infos diese einzigartigen Eigenschaften von MT4 nicht berücksichtigen. Wie soll man leben?)))

Eine Änderung des Zeitrahmens wird nichts bewirken. Der aktuelle iClose-Wert ist unabhängig von der Chartperiode gleich dem Bid-Wert.
 
Alexey Viktorov:
Die Ablösung wird nichts bringen. Der aktuelle Wert von iClose entspricht unabhängig von der Chartperiode dem Bid-Wert.

Ich habe einen EA erstellt und ihn einen Tag lang auf M5 laufen lassen. Beim Stundenwechsel werden für jeden der Werte horizontale Linien gezeichnet: iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M5,1), iClose(symbol, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - es wurde genau wie auf dem Chart angezeigt
  2. Das Gebot war knapp, das ist der nächste Tick
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - manchmal waren sie gleich, und manchmal, vor allem in den Abendstunden, zeigten sie einen kompletten Scheiß an, selbst nachdem RefreshRates() angeschlossen war.

Frage an die Entwickler. Wozu brauchen wir die FunktioniClose in MQL4, wenn sie nicht die richtigen Informationen liefert und es keine Möglichkeit gibt, ihre Daten zu aktualisieren?

 
Mikhail Nazarenko:

Ich habe einen EA erstellt und ihn einen Tag lang auf M5 laufen lassen. Beim Stundenwechsel werden für jeden der Werte horizontale Linien gezeichnet: iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M5,1), iClose(symbol, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - es wurde genau wie auf dem Chart angezeigt
  2. Das Gebot war knapp, das ist der nächste Tick
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - manchmal waren sie gleich, und manchmal, vor allem in den Abendstunden, zeigten sie einen kompletten Scheiß an, selbst nachdem RefreshRates() angeschlossen war.

Frage an die Entwickler. Wozu braucht MQL4iClose-Funktionen, wenn sie keine zuverlässigen Informationen liefern und es keine Möglichkeit gibt, ihre Daten zu aktualisieren?

Das ist Unsinn. Der Aufruf RefreshRates() ist nur erforderlich, wenn die Ausführung aus irgendeinem Grund verzögert wurde. Dies kann z.B. bei langen Zyklen der Fall sein oder bei der Aktualisierung der Preise zum Zeitpunkt des Absendens eines Auftrags, um einen Auftrag zu eröffnen. Bei Ihrer Variante sollte es keine Probleme geben. Geben Sie lieber ein Beispiel für einen Code an, bei dem die Preiswerte so falsch sind.

Ich führe jetzt den folgenden Code aus

double close_H1,
       close_M1;

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

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\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;
 }/******************************************************************/
In der Tat sollte der Minutenschluss mit einer Hochphase auf dem Chart zusammenfallen. Ich werde später nachsehen, ob etwas im Protokoll steht.
 
Mikhail Nazarenko:

Und wenn Sie den Zeitrahmen auf einen anderen als den aktuellen ändern, werden die Daten nicht mehr rechtzeitig aktualisiert, auch nicht mit RefreshRates().

Gibt es einen Testcode, der diese Aussage bestätigt? Ich selbst habe es nicht bemerkt. Beim TF-Wechsel warten wir einfach darauf, dass die Geschichte ausgetauscht wird und arbeiten dann.


So produzieren iClose und andere grundlegende Funktionen in MT4 irrelevanten Unsinn.

Das ist eine zu laute Behauptung. Manchmal ist das möglich, aber dafür gibt es ja Fehlercodes. Wenn Sie sie nicht überprüfen, werden Sie nie wissen, ob Sie das Ergebnis, das Sie erhalten, verwenden können.


Ich bin sicher, dass 80% der Infoprodukte diese einzigartigen Eigenschaften von MT4 nicht berücksichtigen. Wie soll man leben?)))

Ich will noch mehr sagen: Fast alle Programme berücksichtigen diese Merkmale nicht. Aus diesem Grund werden neue Versionen veröffentlicht. Sobald ein Produkt nicht mehr unterstützt wird, ist es unbrauchbar geworden.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Das ist Unsinn. Ein Aufruf von RefreshRates() ist nur dann erforderlich, wenn es aus irgendeinem Grund zu einer Verzögerung der Ausführung gekommen ist. Fälle wie ein langer Zyklus oder nur die Aktualisierung der Preise zum Zeitpunkt des Absendens eines Auftrags zur Eröffnung eines Auftrags. Bei Ihrer Variante sollte es keine Probleme geben. Geben Sie lieber ein Beispiel für einen Code an, bei dem die Preiswerte so falsch sind.

Ich führe diesen Code jetzt aus

Im Wesentlichen sollte der Minutenschluss mit einer Hochphase auf dem Chart zusammenfallen. Ich werde später nachsehen, ob etwas im Protokoll steht.

Mein Code ist ähnlich wie dieser hier. Es gibt einen Fehler in OnTick.

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

Es sollte sein

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
 if(close_H1 != close_M5)
	 Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	 Print(close_M1, " != ", close_M5);


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 habe es auf Alpari real EURCHF M5 überprüft, aber statt Print habe ich horizontale Balken auf jedem der Niveaus gezeichnet.

 
Ihor Herasko:

Gibt es einen Testcode, der diese Aussage unterstützt? Bei mir selbst habe ich das nicht bemerkt. Wenn wir die TFs wechseln, warten wir einfach, bis die Geschichte ausgetauscht ist und arbeiten dann.


Das ist eine zu laute Aussage. In einigen Fällen ist dies möglich, aber dafür gibt es ja Fehlercodes. Wenn Sie sie nicht überprüfen, werden Sie nie wissen, ob Sie das erhaltene Ergebnis verwenden können.


Ich will mehr sagen: Fast alle Programme berücksichtigen etwas nicht. Aus diesem Grund werden neue Versionen veröffentlicht. Sobald ein Produkt nicht mehr unterstützt wird, kann es nicht mehr verwendet werden.

Hier ist der Code, geben Sie ihn ein und probieren Sie es aus. Ich habe nicht an jeder Kerze ein Streichholz. Alpari real EURCHF M5.

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);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\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;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose: Null - Fehler. Die Funktion meldet keinen Fehler. Gibt einen Wert aus, der derzeit veraltet ist.

Wenn Sie Fehler in den iXXXXXXX-Funktionen vermuten, verwenden Sie die SymbolInfoXXXXXX-Funktionen