Mira cómo descargar robots gratis
¡Búscanos en Facebook!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

Pantalla optimizada para la salida de texto de gráficos de tipo consola - librería para MetaTrader 5

Visualizaciones:
88
Ranking:
(17)
Publicado:
2025.04.04 10:53
\MQL5\Experts\canvas-vs-labels\demo\cyberdev\
ChartDisplay.mqh (12.77 KB) ver
\MQL5\Experts\canvas-vs-labels\demo\
Demo.mq5 (9.48 KB) ver
\MQL5\Experts\canvas-vs-labels\measurement\cyberdev\
ChartDisplay.mqh (12.97 KB) ver
\MQL5\Experts\canvas-vs-labels\measurement\
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

La biblioteca contiene dos tipos de visualizaciones. El primero, LabelsDisplay, se basa en CChartObjectLabel. El segundo, CanvasDisplay, se basa en CCanvas. Las pantallas están optimizadas para la frecuencia de renderizado. Además del Asesor Experto principal que demuestra el trabajo de las visualizaciones Demo.mq5, hay dos variantes más, CanvasVsLabelsTester.mq5, para realizar mediciones exclusivamente en el probador, en ticks. Y el universal CanvasVsLabels.mq5, que realiza mediciones tanto en el comprobador como en el gráfico. Estas mediciones pueden compararse entre sí. Para más detalles sobre la comparación de la velocidad de las pantallas, consulte el enlace Canvas vs Labels.

Medidas de la velocidad de dibujo en el gráfico

Método de introducción del gráfico

//+------------------------------------------------------------------+
//|ChartDisplayDemo.mq5
//|Copyright 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, // Lienzo
  otLabels  // Etiquetas
};

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
input OutType outType = otLabels; // outType - tipo de visualización
input int nLines = 50; // nLines - número de líneas de la pantalla
input bool optimizeUpdate = false; // optimiseUpdate - optimización para etiquetas
input int bWidth = 406; // bWidth - anchura de visualización
input int lY_Dist = 14; // lY_Dist - distancia entre líneas
input bool back = false; // atrás - fondo para Etiquetas

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
Strings * display;
CChart Chart;

//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
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) + ".")   
  

//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
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();
}
//+------------------------------------------------------------------+

    Para actualizar la línea superior, debe llamar al método setText de la clase que esté utilizando. Para desplazar el texto a la línea inferior, se llama al método push de la clase utilizada. Y para mostrar el texto añadido/actualizado en la pantalla se utiliza el método update de cualquiera de las clases. Además de este método, la clase LabelsDisplay tiene un método adicional updateOne, que puede acelerar la visualización más de 2 veces. Se llama sólo cuando la línea superior necesita ser actualizada. Si se ha llamado al método push, después de él se debe llamar al método update en lugar de updateOne .

    Parámetros de entrada

    • outType - tipo de visualización
    • nLines - número de líneas de la pantalla
    • optimiseUpdate -optimizar para Etiquetas
    • bWidth - ancho de la pantalla
    • lY_Dist - distancia entre líneas
    • back - fondo de las etiquetas

    Con outType puede seleccionar el tipo de visualización entre los valores Canvas o Labels. El cambio nLines establece el número de líneas que se guardarán después del desplazamiento mediante el método push. El parámetro optimiseUpdate permite la actualización económica de una sola línea, si no se ha llamado al método push y, por tanto, no es necesario actualizar el resto de líneas (véase más arriba). Con bWidth puede establecer el ancho de la pantalla (relevante para Canvas y Labels que utilizan background). Con el parámetro lY_Dist puede conseguir el tamaño de fuente deseado. El tamaño de la fuente se toma de lY_Dist , al que se le resta la parte fijada por el coeficiente fDec, lo que permite cambiar la altura real de la línea, no el tamaño de la fuente, sin tener en cuenta la distancia entre líneas. El parámetro back habilita el fondo en el modo Etiquetas.

    Así, es posible mostrar información en el gráfico en 5 modos diferentes.

    1. Lienzo
    2. Etiquetas
    3. Etiquetas con salida de textooptimizada
    4. Etiquetas con fondo Canvas
    5. Etiquetas con fondo, más, optimización

    El uso de un fondo en el modo outType: Labels proporciona aproximadamente la misma carga que el uso de otros objetos de gráfico adicionales. Es decir, aumenta ligeramente el tiempo de salida del texto en la pantalla.



    Traducción del ruso realizada por MetaQuotes Ltd
    Artículo original: https://www.mql5.com/ru/code/33898

    MultiTester MultiTester

    Múltiples ejecuciones/optimizaciones en Tester.

    Detección del inicio de una nueva barra o vela Detección del inicio de una nueva barra o vela

    Detección del inicio de una nueva barra o vela en el manejador de eventos OnTick() de un Asesor Experto.

    Panel de seguimiento de posición manual Panel de seguimiento de posición manual

    Panel basado en la clase CDialog. Trabaja sobre el símbolo actual. Borrar, establecer Take Profit, establecer Breakeven en un grupo de posiciones.

    Filtro iCHO Trend CCIDualOnMA Filtro iCHO Trend CCIDualOnMA

    Estrategia basada en el indicador estándar iCHO (Chaikin Oscillator, CHO) y el indicador personalizado 'CCIDualOnMA'.