Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5

Tela otimizada para saída de texto de gráfico do tipo console - biblioteca para MetaTrader 5
- Visualizações:
- 152
- Avaliação:
- Publicado:
- 2025.04.04 10:53
-
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.
//+------------------------------------------------------------------+ //|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.
- Tela
- Rótulos
- Rótulos com saída de textootimizada
- Rótulos com fundo de tela
- 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

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

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 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

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