und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5

Optimierte Anzeige für konsolenartige Diagrammtextausgabe - Bibliothek für den MetaTrader 5
- Ansichten:
- 71
- Rating:
- Veröffentlicht:
-
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Die Bibliothek enthält zwei Arten von Anzeigen. Die erste, LabelsDisplay, basiert auf CChartObjectLabel. Die zweite, CanvasDisplay, basiert auf CCanvas. Die Anzeigen sind für die Rendering-Frequenz optimiert. Neben dem Haupt-Expert Advisor, der die Arbeit der Displays Demo.mq5 demonstriert, gibt es zwei weitere Varianten, CanvasVsLabelsTester.mq5, um Messungen ausschließlich im Tester auf Ticks durchzuführen. Und die universelle CanvasVsLabels.mq5, die Messungen sowohl im Tester als auch auf dem Chart durchführt. Diese Messungen können miteinander verglichen werden. Weitere Einzelheiten zum Vergleich der Geschwindigkeit von Anzeigen finden Sie unter dem Link Canvas vs Labels.
//+------------------------------------------------------------------+ //|ChartDisplayDemo.mq5 | //|Urheberrecht 2021, © Cyberdev | //| https://www.mql5.com/en/users/cyberdev/seller | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, © Cyberdev". #property link "https://www.mql5.com/en/users/cyberdev/seller" #property version "1.00" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #include "cyberdev\ChartDisplay.mqh" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ enum OutType { otCanvas, // Leinwand otLabels // Etiketten }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ input OutType outType = otLabels; // outType - Art der Anzeige input int nLines = 50; // nLines - Anzahl der Zeilen auf dem Display input bool optimizeUpdate = false; // optimiseUpdate - Optimierung für Etiketten input int bWidth = 406; // bWidth - Breite der Anzeige input int lY_Dist = 14; // lY_Dist - Abstand zwischen den Linien input bool back = false; // Rückseite - Hintergrund für Etiketten //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ Strings * display; CChart Chart; //+------------------------------------------------------------------+ //| Experteninitialisierungsfunktion| //+------------------------------------------------------------------+ int OnInit() { Chart.Attach(ChartID()); Chart.ShowGrid(false); Chart.ColorBackground(C'194,231,197'); Chart.ColorBarUp(clrDodgerBlue); Chart.ColorBarDown(clrBlueViolet); Chart.ColorCandleBull(clrDodgerBlue); Chart.ColorCandleBear(clrBlueViolet); Chart.ColorForeground(clrBlack); switch (outType) { case otCanvas: display = new CanvasDisplay(); break; case otLabels: display = new LabelsDisplay(); break; default: return INIT_FAILED; } if ((outType == otLabels && back && !dynamic_cast<LabelsDisplay *>(display).createExt(nLines, 10, 10, bWidth, lY_Dist)) || !display.create(nLines, 10, 15, bWidth, lY_Dist)) return INIT_FAILED; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Experten-Deinitialisierungsfunktion| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if (CheckPointer(display) == POINTER_DYNAMIC) delete display; Chart.Detach(); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #define concatenate(_rate) \ ("Open: " + DoubleToString(rates[_rate].open, digits) + \ "; High: " + DoubleToString(rates[_rate].high, digits) + \ "; Low: " + DoubleToString(rates[_rate].low, digits) + \ "; Close: " + DoubleToString(rates[_rate].close, digits) + ".") //+------------------------------------------------------------------+ //| Experten-Tick-Funktion| //+------------------------------------------------------------------+ void OnTick() { MqlRates rates[]; int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); static datetime time = 0; datetime cTime; static bool firstRun = true; bool triggered = false; if (CopyRates(NULL, PERIOD_CURRENT, 0, 2, rates) != 2) return; display.setText(concatenate(1)); cTime = rates[0].time; if (cTime != time) { if (!firstRun) { display.push(); display.setText(concatenate(0)); } time = cTime; firstRun = false; triggered = true; } if(outType == otLabels && optimizeUpdate) { if (triggered) display.update(); else dynamic_cast<LabelsDisplay *>(display).updateOne(); } else display.update(); } //+------------------------------------------------------------------+
Um die oberste Zeile zu aktualisieren, müssen Sie die setText-Methode der Klasse, die Sie verwenden, aufrufen. Um den Text in die darunter liegende Zeile zu verschieben, wird die push-Methode der verwendeten Klasse aufgerufen . Und um den hinzugefügten/aktualisierten Text auf dem Display anzuzeigen, verwenden Sie die update-Methode einer der Klassen. Zusätzlich zu dieser Methode verfügt die Klasse LabelsDisplay über eine weitere Methode updateOne, die die Anzeige um mehr als das Doppelte beschleunigen kann. Sie wird nur dann aufgerufen, wenn die oberste Zeile aktualisiert werden muss. Wenn die Push-Methode aufgerufen wurde, sollte man danach die Update-Methode anstelle von updateOne aufrufen .
Eingabeparameter
- outType - Art der Anzeige
- nLines - Anzahl der Zeilen auf dem Display
- optimiseUpdate - Optimierung für Labels
- bWidth - Breite der Anzeige
- lY_Dist - Abstand zwischen den Zeilen
- back - Hintergrund für Etiketten
Mit outType können Sie den Anzeigetyp aus den Werten für Canvas oder Labels auswählen. Die Änderung nLines legt die Anzahl der Zeilen fest, die nach dem Scrollen durch die Push-Methode gespeichert werden sollen. Der Parameter optimiseUpdate ermöglicht die sparsame Aktualisierung von nur einer Zeile, wenn die Push-Methode nicht aufgerufen wurde und daher die restlichen Zeilen nicht aktualisiert werden müssen (siehe oben). Mit bWidth können Sie die Breite der Anzeige einstellen (relevant für Canvas und Labels mit Hintergrund). Mit dem Parameter lY_Dist können Sie die gewünschte Schriftgröße einstellen. Die Schriftgröße ergibt sich aus lY_Dist , wovon der durch den Koeffizienten fDec festgelegte Teil abgezogen wird, was es ermöglicht, die tatsächliche Zeilenhöhe und nicht die Schriftgröße zu ändern, ohne den Abstand zwischen den Zeilen zu berücksichtigen. Der Parameter back aktiviert den Hintergrund im Modus Labels.
Es ist also möglich, die Informationen im Diagramm in 5 verschiedenen Modi anzuzeigen.
- Leinwand
- Beschriftungen
- Beschriftungen mit optimierter Textausgabe
- Etiketten mit Canvas-Hintergrund
- Beschriftungen mit Hintergrund, plus, Optimierung
Die Verwendung eines Hintergrunds im Modus outType: Etiketten führt zu etwa der gleichen Belastung wie die Verwendung anderer zusätzlicher Diagrammobjekte. Das bedeutet, dass sich die Zeit für die Textausgabe auf dem Display leicht erhöht.
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/33898

Mehrere Durchläufe/Optimierungen im Tester.

Konstruiert eine bewegliche Linie mit einem Polynom von 4 Grad. Extrapoliert die Sinuskurve und ihre Achse. Die konstruierten Linien entfernen bei jedem Balken einen Wert und es wird eine gleitende Linie aus extrapolierten Werten konstruiert, die nicht neu gezeichnet wird.

Panel basierend auf der Klasse CDialog. Arbeit am aktuellen Symbol. Löschen, Einstellen von Take Profit, Einstellen von Breakeven für eine Gruppe von Positionen

Strategie basierend auf dem Standardindikator iCHO (Chaikin Oscillator, CHO) und dem benutzerdefinierten Indikator 'CCIDualOnMA'.