Discussão do artigo "Distribuições estatísticas no MQL5 - tirando o melhor de R" - página 11

 
Isso ocorre apenas no modelo cinco? Há planos para um quatro?
 
Stanislav Korotky:
Isso é apenas no 5? Está planejado para o 4?

Portanto, tudo deve funcionar no MT4. É um OBJ_BITMAP_LABEL padrão + recurso personalizado.

A propósito, o compilador do MT4 é mais inteligente que o do MT5

// O MT5 é silencioso, o MT4 avisa - verifique a precedência do operador quanto a um possível erro; use parênteses para esclarecer a precedência Canvas.mqh
m_pixels[y*m_width+x]=(r<<16|g<<8|b<<0|255<<24) &0xffffffff;


E apareceu um bug (não funciona no MT5, mas funciona no MT4).

#property strict

#include <Graphics/Graphic.mqh>

double Func1(double x) { return MathPow(x,2); }
double Func2(double x) { return MathPow(x,3); }
double Func3(double x) { return MathPow(x,4); }

void SaveObjects( const long chart_id = 0, const int SubWindow = -1 )
{
  const int Total = ObjectsTotal(chart_id, SubWindow, OBJ_BITMAP_LABEL);
  
  for (int i = 0; i < Total; i++)
  {
    const string Name = ObjectName(chart_id, i, SubWindow, OBJ_BITMAP_LABEL);

    string ResourceName;
    
    if (ObjectGetString(chart_id, Name, OBJPROP_BMPFILE, 0, ResourceName))
      ResourceSave(ResourceName, Name + ".bmp"); // MT5 - falso, MT4 - verdadeiro
  }
}

void OnStart()
  {
   GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      
   SaveObjects();
  }
 
Faça a correção.
//+------------------------------------------------------------------+
//| Atualizar o objeto na tela (redesenhar)|
//+------------------------------------------------------------------+
void CCanvas::Update(const bool redraw)
  {
//--- verificação
   if(m_rcname==NULL)
      return;
//--- atualizar o recurso e redesenhar
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw(this.m_chart_id);
  }
 

É aqui que

//+------------------------------------------------------------------+
//| Desenhar a polilinha de Wu|
//+------------------------------------------------------------------+
void CCanvas::PolylineWu(int &x[],int &y[],const uint clr,const uint style=UINT_MAX);

divisões por zero.

 
Se a matriz tiver um comprimento maior do que a largura (em pixels) do gráfico, será um problema.
 

Peço que você melhore a CGraphic e a CCurve. Elas são classes fracas. E é quase impossível herdar delas, porque o que você precisa é privado. Levei muito tempo para entender, mas tive que reescrever as classes para que funcionassem corretamente.

Eu queria criar um gráfico de ticks interativo, que foi criado de forma grosseira (sem reescrever as classes)

#include <Graphics/Graphic.mqh>

void GetPrices( double &Bids[], double &Asks[], const int Count = 100 )
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  ArrayResize(Bids, Amount);
  ArrayResize(Asks, Amount);
  
  for (int i = 0; i < Amount; i++)
  {
    Bids[i] = Ticks[i].bid;
    Asks[i] = Ticks[i].ask;
  }
}

CGraphic* Graphic = new CGraphic;
const string Name = "Graphic" +(string)(GetTickCount() + MathRand());

void OnDeinit( const int Reason )
{
  Graphic.Destroy();
  delete Graphic;
  
  ChartRedraw();
}

void GraphTicks( const double &Price1[], const double &Price2[] )
{
   Graphic.Destroy();
   delete Graphic;

   Graphic = new CGraphic;  
   Graphic.Create(0, Name, 0, 0, 0, (int)(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) * 0.8), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));

   Graphic.AddCurve(Price1, CURVE_LINES);
   Graphic.AddCurve(Price2, CURVE_LINES);
  
   Graphic.PlotAllCurves();
   Graphic.Update();
}

void OnTick()
{
  double Bids[], Asks[];
  GetPrices(Bids, Asks);
  
  GraphTicks(Bids, Asks);
}

Sem DeleteCurve, ChangeCurve, etc.

 
fxsaber:

Peço que você melhore a CGraphic e a CCurve. Elas são classes fracas. E é quase impossível herdar delas, porque o que você precisa é privado. Levei muito tempo para entender, mas tive que reescrever as classes para que funcionassem corretamente.

Eu queria fazer um gráfico de ticks interativo, que foi criado de forma grosseira (sem reescrever as classes)

#include <Graphics/Graphic.mqh>

void GetPrices( double &Bids[], double &Asks[], const int Count = 100 )
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  ArrayResize(Bids, Amount);
  ArrayResize(Asks, Amount);
  
  for (int i = 0; i < Amount; i++)
  {
    Bids[i] = Ticks[i].bid;
    Asks[i] = Ticks[i].ask;
  }
}

CGraphic* Graphic = new CGraphic;
const string Name = "Graphic" +(string)(GetTickCount() + MathRand());

void OnDeinit( const int Reason )
{
  Graphic.Destroy();
  delete Graphic;
  
  ChartRedraw();
}

void GraphTicks( const double &Price1[], const double &Price2[] )
{
   Graphic.Destroy();
   delete Graphic;

   Graphic = new CGraphic;  
   Graphic.Create(0, Name, 0, 0, 0, (int)(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) * 0.8), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));

   Graphic.AddCurve(Price1, CURVE_LINES);
   Graphic.AddCurve(Price2, CURVE_LINES);
  
   Graphic.PlotAllCurves();
   Graphic.Update();
}

void OnTick()
{
  double Bids[], Asks[];
  GetPrices(Bids, Asks);
  
  GraphTicks(Bids, Asks);
}

Sem DeleteCurve, ChangeCurve, etc.

Por algum motivo, pensei que fosse uma planilha. É possível fazer uma visualização de uma pilha com um determinado número de bandas combinada com uma fita de negociações? como mostrei um exemplo de visualização em outro software.
 
Stanislav Korotky:
Isso ocorre apenas no modelo cinco? Há planos para um quatro?

Apenas o cinco.

O quatro está pronto.

 
ivanivan_11:
É possível fazer uma visualização de uma pilha com um determinado número de bandas, combinada com uma fita de negociações? Como mostrei um exemplo de visualização em outro software.

Há muitos anos é possível desenhar qualquer coisa de forma interativa. Somente ninguém (publicamente, com certeza) o utiliza.

O código não é curto, mas longo e muito torto (assim como o resultado - cintilações). A biblioteca precisa ser seriamente aprimorada.

 

Sim, a biblioteca ainda é apenas uma execução de teste.

Nós a arrumaremos, permitiremos herança, adicionaremos métodos e nos livraremos de falhas devido à indexação incorreta.