Diskussion zum Artikel "Nutzerdefinierte Symbole: Praktische Grundlagen" - Seite 6

 
Mr David Frederick Roberts #: Danke Fernando, ich vermutete, dass ich etwas Dummes tat, aber ich konnte es einfach nicht sehen! Wie ich schon sagte, bin ich viel vertrauter mit MT4 (etwa 8 Jahre) und ich hatte nicht bemerkt, dass es zwei "£Every Tick"-Optionen in MT5 gab. Ich startete sie einfach, sah, dass sie auf "Every Tick" eingestellt war und nahm an, dass, wenn sie echte Ticks hatte, sie diese verwenden würde. Es musste etwas Einfaches sein, und ich danke Ihnen nochmals, dass Sie es entdeckt haben.
Gern geschehen!
 

Vielleicht gibt es irgendwo eine neue Version von EqualVolumeBars? Ich habe 2 Probleme bei der Verwendung dieses EA gefunden:

1. Beim Kompilieren von EqualVolumeBars erscheint eine Warnung (die in Symbol.mqh leicht behoben werden kann, indem man z.B. time durch _time ersetzt):

declaration of 'time' hides global variable	Symbol.mqh	28	47

2. die Balken verschwinden. So wie ich es verstanden habe, passiert es, wenn ein neuer Tag im Terminal gekommen ist. Zum Beispiel ist das Datum in TimeCurrent() 2023.06.03 (BTCUSD tickt am Wochenende), und der letzte Range-Bar wurde am 2023 .06.02 geöffnet . Alle Bars für 2023.06.02 verschwinden.

Sie können dieses Problem in nur wenigen Schritten reproduzieren:

  • Pendeln Sie die Linie 360 in EqualVolumeBars um (so dass sich das Diagramm nicht selbst aktualisiert):
//ChartSetSymbolZeitraum(id,symbolName,PERIOD_M1);
  • Fügen Sie EqualVolumeBars zum EURAUD-Chart mit den folgenden Parametern hinzu:

Erhalten Sie ein Diagramm wie dieses:

  • Klicken Sie mit der rechten Maustaste auf das Diagramm und klicken Sie auf Aktualisieren. Ergebnis:


 
Andrei Iakovlev #:

Vielleicht gibt es irgendwo eine neue Version von EqualVolumeBars? Ich fand 2 Probleme bei der Verwendung dieses Expert Advisor:

1. Bei der Kompilierung von EqualVolumeBars erscheint eine Warnung (die in Symbol.mqh leicht behoben werden kann, indem man z.B. time durch _time ersetzt):

2. die Balken verschwinden. So wie ich es verstanden habe, passiert es, wenn ein neuer Tag im Terminal gekommen ist. Zum Beispiel ist das Datum in TimeCurrent() 2023.06.03 (BTCUSD tickt am Wochenende), und der letzte Range-Bar wurde am 2023 .06.02 geöffnet . Alle Bars für 2023.06.02 verschwinden.

Sie können dieses Problem in nur wenigen Schritten reproduzieren:

  • Pendeln Sie die Linie 360 in EqualVolumeBars (damit sich der Chart nicht selbst aktualisiert):
  • Fügen Sie EqualVolumeBars zum EURAUD-Chart mit den folgenden Parametern hinzu:

Erhalten Sie ein Diagramm wie dieses:

  • Klicken Sie mit der rechten Maustaste auf das Diagramm und klicken Sie auf Aktualisieren. Ergebnis:


Es gibt keine neue Version.

Es gibt Bugs in der Implementierung von benutzerdefinierten Zeichen im Terminal, über die ich irgendwo geschrieben habe, aber sie sind nicht wirklich behoben.

In diesem Fall können Sie sich den Code ansehen - das vorhandene Symbol wird beim Starten des Expert Advisors komplett aufgefüllt, wenn also etwas übrig bleibt oder im Gegenteil, der Tagesanfang verschwindet - so funktioniert die MQL5 API.

Da der Quellcode offen ist, können Sie eine Lösung vorschlagen, um das Problem zu beheben.

 

Hallo Stanislav Korotky

Vielen Dank für alles, was Sie zum Thema "Benutzerdefinierte Symbole" auf verschiedenen Wegen und Typen getan haben.

Zweitens entschuldige ich mich dafür, dass ich auf Englisch schreibe, da ich kein Russisch kann - :)

1 Problem im "RenkoTicks" Code (eine Art Fehler)

1

Könnten Sie sich bitte die Zeit nehmen, diesen Fehler zu beheben?

Mit freundlichen Grüßen

Stanislav Korotky
Stanislav Korotky
  • 2023.04.26
  • www.mql5.com
Trader's profile
 
mntiwana #:

Könnten Sie sich bitte die Zeit nehmen, diesen Fehler zu beheben?

Entfernen Sie einfach 0 innerhalb der geschweiften Klammern. Bitte beachten Sie die MQL5-Syntaxänderungen in den Newsmeldungen. Diese ist ein bisschen alt - ich kann mich jetzt nicht mehr an die genaue Referenz erinnern.

 
Stanislav Korotky #:

Das hier ist schon etwas älter,,

Noch einmal: Ich habe 3 Jahre gebraucht, um dieses Kunstwerk zu finden. Wenn dies "alt" ist, hat alt gerade getroffen... langsam. Ha. Ich danke Ihnen.

 

In Bezug auf RenkoTicks.mq5 hatte ich ein Problem mit der Umrechnung von Punkten in Pips bei dreistelligen Preisen. Ich erlebte zuvor die gleiche Sache mit einigen Dienstprogrammen in MT4, so dass ich das gleiche fix implementiert:


//in Globals, einfügen
double _PntsToPips;

//in OnInit, einfügen
if(_Digits == 3 || _Digits == 5)
{
 PntsToPips = 10;
}
else
{
 _PntsToPips = 1;
}

//in 2 Zeilen, die _Point enthalten (nicht in sendSpread...), einfügen
* _PntsToPips //2 neue Zeilen werden sein:

double Renko::boxPoints = NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits);
Renko::setBoxPoints(NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits));


 

Hier ist eine kleine, aber wichtige Verbesserung des benutzerdefinierten Signals, das auf 2 MA-Kreuzungen basiert. Die zugrundeliegenden Indikatorobjekte unterhalten interne Puffer mit den Daten des Indikators (nicht nur im MA-Fall, sondern generell), daher führt der Aufruf von m_maFast.Main(ind) oder m_maSlow.Main(ind) zum Lesen von etwas veralteten (zwischengespeicherten) Daten aus den Objekten, nicht aus den Indikatoren selbst, wenn Ihr Handelssystem nach Ticks (!) handelt. Dies wird nun durch die folgenden Aufrufe von GetData ersetzt, das im Grunde ein Wrapper für direktes CopyBuffer ist:

class Signal2MACross : public CExpertSignal
{
    ...
    // Hilfsfunktionen zum Lesen der Daten von Indikatoren
    double FastMA(int ind) { static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer); return buffer[0]; }
    double SlowMA(int ind) { static double buffer[1]; m_maSlow.GetData(ind, 1, 0, buffer); return buffer[0]; }
};

Die aktualisierte Header-Datei ist beigefügt. Sie sollte in /MQL5/Include/Expert/Signal/MySignals/ platziert werden. Ohne diese Datei wurden die Signale von abgeschlossenen Takten erstellt.

Dateien:
 
<br/ translate="no">

Es hat sich herausgestellt, dass es noch schlimmer ist. Manchmal werden Zeitreihen noch nicht neu berechnet , wenn ein neuer Tick gefeuert wird, daher sollte der Bar-Index dynamisch für die Handelssignalanalyse angepasst werden. Zum Beispiel (grober Ansatz):

    double FastMA(int ind)
    {
      MqlTick t;
      SymbolInfoTick(m_symbol.Name(), t);
      bool correction = false;

      if(t.time / 60 * 60 != iTime(m_symbol.Name(), PERIOD_CURRENT, 0) && ind > 0)
      {
        ind--;
        correction = true;
      }
      
      static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer);
      
      if(correction)
        PrintFormat("F: %s'%03d %s %.5f", TimeToString(t.time, TIME_SECONDS), t.time_msc % 1000, TimeToString(iTime(m_symbol.Name(), PERIOD_CURRENT, 0)), buffer[0]);
        
      return buffer[0]; 
    }

Dies ist kritisch für EAs, die auf Bar Opening handeln, und für Symbole mit spärlichen Ticks.

 

Und wie erstellt man ein Online-Diagramm mit dem Durchschnittspreis nach der Formel (Geld+Brief)/2?