Graficos com Canvas CLinechart

 

Boa tarde,

alguém já trabalhou com esta biblioteca para fazer gráficos de linha?

não estou conseguindo criar a linha do array selecionado

estou usando como base esta documentação


https://www.mql5.com/pt/docs/standardlibrary/canvasgraphics/clinechart


Mas sem sucesso ainda

Documentação sobre MQL5: Biblioteca Padrão / Gráficos personalizados / CLineChart
Documentação sobre MQL5: Biblioteca Padrão / Gráficos personalizados / CLineChart
  • www.mql5.com
CLineChart - Gráficos personalizados - Biblioteca Padrão - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Gustavo Barbeiro Alonso:

Boa tarde,

alguém já trabalhou com esta biblioteca para fazer gráficos de linha?

não estou conseguindo criar a linha do array selecionado

estou usando como base esta documentação


https://www.mql5.com/pt/docs/standardlibrary/canvasgraphics/clinechart


Mas sem sucesso ainda

Posta seu código para tentarmos ver onde está o erro, pode ser apenas algum erro de digitação, no próprio link que você passou tem um exemplo.
 
Alexandre Borela #:
Posta seu código para tentarmos ver onde está o erro, pode ser apenas algum erro de digitação, no próprio link que você passou tem um exemplo.
//+------------------------------------------------------------------+
//|                                                        forum.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0

#include <Canvas\Charts\LineChart.mqh>
CLineChart Chart;

double ya[];
MqlRates rates[];

input datetime init = D'2021.09.22 00:00:00';//inicio
input datetime end = D'2021.09.22 23:00:00';//fim


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!Chart.CreateBitmapLabel("SampleHistogrammChart",10,10,600,450))
     {
      Print("Erro: ",GetLastError());
      return(-1);
     }
   else
     {
      Chart.SeriesAdd(ya,"Last");
     }

   EventSetTimer(2);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   CopyRates(_Symbol,_Period,init,end,rates);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   int size = ArraySize(rates);
   Print("Size: ", size);
   
   ArrayResize(ya,size);
   for(int i=0;i<size;i++)
     {
      ya[i] = rates[i].close;
     }
     
   Chart.SeriesUpdate(0,ya);
   
  }
void OnDeinit(const int reason)
  {
   Chart.Destroy();
  }
//+------------------------------------------------------------------+

Fiz um mais resumido, que está com o mesmo problema não consigo plotar os dados nem atualiza-los 
não entendi bem os exemplos da documentação

 
Gustavo Barbeiro Alonso #:

Fiz um mais resumido, que está com o mesmo problema não consigo plotar os dados nem atualiza-los 
não entendi bem os exemplos da documentação

O seu código teoricamente funciona, eu adicionei:

Chart.VScaleMax(6000);
E como estava olhando o dolar, fez uma linha aparecer, porém quando adicionei o:

Chart.VScaleMin(4000);
Ferrou tudo de novo, não sei se é bug no cálculo da escala ou se tem algum segredo pra usar essa classe.
 
Alexandre Borela #:
O seu código teoricamente funciona, eu adicionei:

E como estava olhando o dolar, fez uma linha aparecer, porém quando adicionei o:

Ferrou tudo de novo, não sei se é bug no cálculo da escala ou se tem algum segredo pra usar essa classe.

Cara é bem complicada essa biblioteca será que ela não usa uma auto escala igual a Cgraphic?

 
Gustavo Barbeiro Alonso #:

Cara é bem complicada essa biblioteca será que ela não usa uma auto escala igual a Cgraphic?

Aparentemente ela tem, ela herda da classe CChartCanvas e o cálculo de escala é feito na linha 841.
Teria tirar um tempo pra debugar pra ver se ta com bug nos cálculos.

 
Alexandre Borela #:

Aparentemente ela tem, ela herda da classe CChartCanvas e o cálculo de escala é feito na linha 841.
Teria tirar um tempo pra debugar pra ver se ta com bug nos cálculos.

Deve ser algum bug na escala mesmo, quando vc define um minimo ele parece pegar os valores da linha e adicionar + o valor minimo

 

Eu uso o grupo de objetos de gráficos científicos , veja um exemplo de plot do preço de fechamento das ultimas 100 barras.

//+------------------------------------------------------------------+
//|                                                         T001.mq5 |
//|                                     Copyright 2021, Lethan Corp. |
//|                           https://www.mql5.com/pt/users/14134597 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Lethan Corp."
#property link      "https://www.mql5.com/pt/users/14134597"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0

#include <Graphics\Graphic.mqh>
CGraphic m_graphic;
CCurve *m_plot;

/+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int m_width = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
int m_height = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ResetLastError();
   int width = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS)-800;
   int height = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS)-550;

   if(!m_graphic.Create(0,"Close",0,20,20,500,200))
     {
      Print("Error creating chart: ",GetLastError());
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   int total = 100;
   double   temp_close[];

   while(total>0)
     {
      ArrayResize(temp_close, ArraySize(temp_close)+1);
      temp_close[ArraySize(temp_close)-1] = close[(rates_total-1)-total--];
     }

   m_graphic.CurveRemoveByName("Close");
   m_plot = m_graphic.CurveAdd(temp_close, clrBlueViolet, CURVE_LINES, "Close");
   m_graphic.ScaleX(100);

   m_graphic.CurvePlotAll();
   m_graphic.Update();

   Sleep(1000);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   m_graphic.CurveRemoveByName("Close");
   m_graphic.Destroy();
  }
//+------------------------------------------------------------------+
Documentação sobre MQL5: Biblioteca Padrão / Gráficos científicos
Documentação sobre MQL5: Biblioteca Padrão / Gráficos científicos
  • www.mql5.com
Gráficos científicos - Biblioteca Padrão - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Jonathan Pereira #:

Eu uso o grupo de objetos de gráficos científicos , veja um exemplo de plot do preço de fechamento das ultimas 100 barras.

então o primeiro usei esse, consegui fazer oq estava precisando, porém queria fazer aparecerem uns círculos no gráfico com diferença de tamanho e cor , ai vi oq complicava nessa biblioteca  que quando vc usa o scatter vc define um estilo para cada curva e eu precisava diferenciar cor e tamanho