Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Telegram!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

Optimierte Anzeige für konsolenartige Diagrammtextausgabe - Bibliothek für den MetaTrader 5

Ansichten:
71
Rating:
(17)
Veröffentlicht:
\MQL5\Experts\canvas-vs-labels\demo\cyberdev\ \MQL5\Experts\canvas-vs-labels\demo\
Demo.mq5 (9.48 KB) ansehen
\MQL5\Experts\canvas-vs-labels\measurement\cyberdev\ \MQL5\Experts\canvas-vs-labels\measurement\
MQL5 Freelance 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.

Messungen der Ziehgeschwindigkeit im Diagramm

Art der Eingabe der Karte

//+------------------------------------------------------------------+
//|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.

    1. Leinwand
    2. Beschriftungen
    3. Beschriftungen mit optimierter Textausgabe
    4. Etiketten mit Canvas-Hintergrund
    5. 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

    MultiTester MultiTester

    Mehrere Durchläufe/Optimierungen im Tester.

    Pan PrizMA No leverage 72 Pan PrizMA No leverage 72

    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 für manuelle Positionsverfolgung Panel für manuelle Positionsverfolgung

    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

    iCHO Trend CCIDualOnMA Filter iCHO Trend CCIDualOnMA Filter

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