Fehler, Irrtümer, Fragen - Seite 2995

 
   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Kann jemand beantworten, warum dieser Code nur bei Minuten korrekt funktioniert?

Dies ist ein Indikator.


P. S.

Bei anderen Zeitrahmen als dem Minuten-Zeitrahmen gibt er falsche Werte aus.

 
Francuz:


Kann jemand beantworten, warum dieser Code nur bei Minuten korrekt funktioniert?

Dies ist ein Indikator.

P. S.

Bei anderen Zeitrahmen als Minuten gibt er falsche Werte aus.

Denn Sie haben nur beim allerersten Besuch von OnCalculate eine einzige Iteration durchgeführt, als prev_calculated = 0 war. Zu diesem Zeitpunkt sind die Stäbe möglicherweise noch nicht geformt worden. Und alle TFs werden aus 1M TFs gebildet.
In den Scheck einfügen:

if(prev_calculated>0 && handle != INVALID_HANDLE)

Und alles wird funktionieren.

 

Es sind zwei EA-Registerkarten in ME geöffnet, beide haben ungespeicherte Änderungen, wir drücken die Schaltfläche Kompilieren auf einer von ihnen und sehen, dass ME die Änderungen in beiden EAs speichert. Warum? Wer hat ihn gebeten, das zu tun?

Wenn ME die Änderungen in den verknüpften Dateien vor dem Kompilieren speichern würde, wäre das ein logisches Verhalten, aber so.... Natürlich ist es viel einfacher, alle geöffneten Dateien zu speichern und damit fertig zu werden.....

 
Andrey Dik:
In ME sind die Registerkarten von zwei EAs geöffnet, beide haben ungespeicherte Änderungen, drücken Sie den Kompilieren-Button von einem von ihnen und sehen Sie, dass ME die Änderungen in beiden EAs speichert. Und warum? Wer hat ihn gebeten, das zu tun?
Wie könnte es sonst geschehen?
Das ist der einzige Weg.
Dies ist bei allen IDEs der Fall.
 
Nikolai Semko:
Wie sonst?
Das ist der einzige Weg.
Das ist bei allen IDEs der Fall.

Ist das in allen IDEs sicher?

Ich habe gerade VS ausprobiert, ja, das Verhalten ist dasselbe. Aber sollte das zurückgebliebene Verhalten eines Produkts, selbst des berühmtesten, als Maßstab gelten? Kopieren wir alle Bugs und Missverständnisse von VS, warum?

))

 
Andrey Dik:

ist sie in allen Fällen korrekt?

Ich habe gerade VS ausprobiert, ja, das Verhalten ist das gleiche. aber das zurückgebliebene Verhalten eines Produktes, selbst des bekanntesten, soll als Maßstab gelten? lasst uns dann alle Bugs und Missverständnisse von VS kopieren, warum.

))

Ich habe im letzten Jahr mindestens 9 verschiedene IDEs verwendet. Das ist überall so.
Nun, denken Sie logisch: Wie viele Probleme kann es geben, wenn eine Datei mehrere Master hat, die die Änderungen der anderen nicht sehen. Wenn eine mit einem Code und eine andere mit einem anderen Code kompiliert wurde, müssen Sie bereits zwei ex5-Dateien mit demselben Namen erstellen usw.
 

Warum wird der Navigator nicht als Tabelle nach dem Vorbild des Market Watch-Fensters gestaltet? TheMarket Watch hat die Sortierung eingeführt, Hut ab! - Wir haben das schon lange gefordert.

Jetzt kommt die Ära unseres neuen Traums von mega cooler Benutzerfreundlichkeit, den Inhalt des Navigators anzuzeigen und nach Spalten zu sortieren: Titel, Autor, Kompilierungsdatum, Datum der letzten Ausführung, Verfügbarkeit der Quelle, Programmtyp (und die Sortierung zu deaktivieren und zur aktuellen Ansicht zurückzukehren)

 
Nikolai Semko:
Ich habe im vergangenen Jahr mindestens 9 verschiedene IDEs verwendet. Überall ist es so.
Denken Sie logisch: Wie viele Probleme kann es geben, wenn eine Datei mehrere Hosts hat, die die Änderungen der anderen nicht sehen. Wenn einer mit einem Code und ein anderer mit einem anderen Code kompiliert, müssen Sie bereits zwei ex5-Dateien mit demselben Namen erstellen usw.

Wenn zwei verschiedene EAs geöffnet werden, welche Verbindung kann es zwischen ihnen geben? Nur Inludes, die Teil der Eulen sind, sollten gespeichert werden, und es spielt keine Rolle, wem diese Inludes sonst gehören.

Wenn Sie zum Beispiel eine *txt-Datei öffnen, die nicht gespeichert ist, hat sie nichts mit der kompilierten Datei und/oder dem Projekt zu tun, warum also speichern?

 
Nikolai Semko:

weil Sie nur eine einzige Iteration beim allerersten OnCalculate-Eintrag durchführen, wenn prev_calculated = 0 ist. Zu diesem Zeitpunkt sind die Stäbe möglicherweise noch nicht geformt worden. Und alle TFs werden aus 1M TFs gebildet.
In den Scheck einfügen:

und alles wird funktionieren.

Sie haben das Thema verfehlt. Der Code sollte nur einmal funktionieren. Sie soll zeigen, dass der genannte Indikator nicht funktioniert. Das Problem ist, dass in allen Varianten der Indikator aufgerufen wird nicht funktionieren, wenn es (und der Aufrufer) hat eine andere TimeFrame von der Minute ein. Ich habe herausgefunden, dass es sich um einen Fehlervon MetaTrader handelt, der nur mit Krücken gelöst werden kann. Und dieses Problem ist ziemlich alt. Einzelheiten können Sie unter "Ich kann keine Indikatordaten von der älteren TF 123 abrufen" nachlesen.

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Francuz:

Sie verstehen nicht, worum es geht. Der Code sollte nur einmal funktionieren. Er soll deutlich machen, dass der genannte Indikator nicht funktioniert. Das Problem ist, dass der aufgerufene Indikator nicht funktioniert, wenn er (und der Aufrufer) einen anderen TimeFrame hat als der Minuten-Indikator. Ich habe herausgefunden, dass es sich um einen Fehlervon MetaTrader handelt, der nur mit Krücken gelöst werden kann. Und dieses Problem ist ziemlich alt. Sie können die Einzelheiten in "Ich kann keine Indikatordaten von der großen TF 123 erhalten" nachlesen.

Das ist schon lange her. Das Problem ist schon längst gelöst. Sie müssen mindestens einmal alle zwei Minuten auf die Daten eines nicht-nativen Zeitrahmens/Symbols zugreifen. Wenn in der Hauptschleife noch keine Daten aus dem angeforderten Zeitrahmen vorliegen, müssen Sie die Schleife verlassen - geben Sie einfach Null zurück, um auf den nächsten Tick zu warten, und der Indikator weiß, dass die historischen Daten noch nicht berechnet wurden.