Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Bibliotecas

Tela otimizada para saída de texto de gráfico do tipo console - biblioteca para MetaTrader 5

Visualizações:
152
Avaliação:
(17)
Publicado:
2025.04.04 10:53
\MQL5\Experts\canvas-vs-labels\demo\cyberdev\ \MQL5\Experts\canvas-vs-labels\demo\ \MQL5\Experts\canvas-vs-labels\measurement\cyberdev\ \MQL5\Experts\canvas-vs-labels\measurement\
Freelance MQL5 Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

A biblioteca contém dois tipos de displays. O primeiro, LabelsDisplay, é baseado no CChartObjectLabel. O segundo, CanvasDisplay, é baseado em CCanvas. As exibições são otimizadas para a frequência de renderização. Além do Expert Advisor principal que demonstra o trabalho dos displays Demo.mq5, há mais duas variantes, CanvasVsLabelsTester.mq5, para realizar medições exclusivamente no testador, em ticks. E o CanvasVsLabels.mq5 universal, que realiza medições no testador e no gráfico. Essas medições podem ser comparadas entre si. Para obter mais detalhes sobre a comparação da velocidade das exibições, consulte o link Canvas vs Labels.

Medições da velocidade de desenho no gráfico

Método de entrada no gráfico

//+------------------------------------------------------------------+
//|ChartDisplayDemo.mq5
//|Direitos autorais 2021, © Cyberdev |
//| https://www.mql5.com/en/users/cyberdev/seller |
//+------------------------------------------------------------------+
#property copyright "Direitos autorais 2021, © Cyberdev."
#property link      "https://www.mql5.com/en/users/cyberdev/seller"
#property version   "1.00"

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
#include "cyberdev\ChartDisplay.mqh"

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
enum OutType { 
  otCanvas, // Tela
  otLabels  // Etiquetas
};

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
input OutType outType = otLabels; // outType - tipo de exibição
input int nLines = 50; // nLines - número de linhas na tela
input bool optimizeUpdate = false; // optimiseUpdate - otimização para rótulos
input int bWidth = 406; // bWidth - largura da tela
input int lY_Dist = 14; // lY_Dist - distância entre as linhas
input bool back = false; // back - fundo para os rótulos

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

//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
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) + ".")   
  

//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
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 atualizar a linha superior, você precisa chamar o método setText da classe que estiver usando. Para deslocar o texto para a linha abaixo, o método push da classe usada é chamado . E para exibir o texto adicionado/atualizado na tela, use o método update de qualquer uma das classes. Além desse método, a classe LabelsDisplay tem um método adicional updateOne, que pode acelerar a exibição em mais de duas vezes. Ele é chamado somente quando a linha superior precisa ser atualizada. Se o método push foi chamado, depois dele você deve chamar o método update em vez de updateOne .

    Parâmetros de entrada

    • outType - tipo de exibição
    • nLines - número de linhas na tela
    • optimiseUpdate -otimizar para rótulos
    • bWidth - largura da tela
    • lY_Dist - distância entre as linhas
    • back - plano de fundo para rótulos

    Com outType , você pode selecionar o tipo de exibição entre os valores Canvas ou Labels. A alteração nLines define o número de linhas que serão salvas após a rolagem pelo método push. O parâmetro optimiseUpdate permite a atualização econômica de apenas uma linha, se o método push não tiver sido chamado e, portanto, o restante das linhas não precisar ser atualizado (veja acima). Com bWidth , você pode definir a largura da exibição (relevante para telas e rótulos que usam plano de fundo). Com o parâmetro lY_Dist , você pode obter o tamanho de fonte desejado. O tamanho da fonte é obtido a partir de lY_Dist , do qual a parte definida pelo coeficiente fDec é subtraída, o que permite alterar a altura real da linha, não o tamanho da fonte, sem levar em conta a distância entre as linhas. O parâmetro back ativa o plano de fundo no modo Labels.

    Assim, é possível exibir informações no gráfico em 5 modos diferentes.

    1. Tela
    2. Rótulos
    3. Rótulos com saída de textootimizada
    4. Rótulos com fundo de tela
    5. Rótulos com fundo, além de otimização

    O uso de um plano de fundo no modo outType: Labels fornece aproximadamente a mesma carga que o uso de outros objetos gráficos adicionais. Ou seja, aumenta ligeiramente o tempo de saída do texto para a tela.



    Traduzido do russo pela MetaQuotes Ltd.
    Publicação original: https://www.mql5.com/ru/code/33898

    MultiTester MultiTester

    Várias execuções/otimizações no Tester.

    Pan PrizMA Sem alavancagem 72 Pan PrizMA Sem alavancagem 72

    Construa uma linha móvel com um polinômio de 4 graus. Extrapola o senoidal e seu axial. As linhas construídas removem um valor em cada barra e é construída uma linha deslizante de valores extrapolados que não é redesenhada.

    Painel de rastreamento de posição manual Painel de rastreamento de posição manual

    Painel baseado na classe CDialog. Trabalhar com o símbolo atual. Exclusão, definição de Take Profit, definição de Breakeven em um grupo de posições

    Filtro iCHO Trend CCIDualOnMA Filtro iCHO Trend CCIDualOnMA

    Estratégia baseada no indicador padrão iCHO (Chaikin Oscillator, CHO) e no indicador personalizado 'CCIDualOnMA'