Discusión sobre el artículo "Distribuciones Estadísticas en MQL5: tomando lo mejor de R" - página 11

 
¿Es sólo en el cinco? ¿Hay planes para un cuatro?
 
Stanislav Korotky:
¿Es sólo en el 5? ¿Está previsto para el 4?

Así que todo debería funcionar en MT4. Es un estándar OBJ_BITMAP_LABEL + recurso personalizado.

Por cierto, MT4 compilador es más inteligente que MT5

// MT5 no dice nada, MT4 avisa - compruebe la precedencia del operador para un posible error; utilice paréntesis para aclarar la precedencia Canvas.mqh
m_pixels[y*m_width+x]=(r<<16|g<<8|b<<0|255<<24) &0xffffffff;


Y ha aparecido un bug (no funciona en MT5, pero funciona en 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 - verdadero
  }
}

void OnStart()
  {
   GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      
   SaveObjects();
  }
 
Haz la corrección.
//+------------------------------------------------------------------+
//| Actualizar objeto en pantalla (redibujar)|
//+------------------------------------------------------------------+
void CCanvas::Update(const bool redraw)
  {
//--- comprobar
   if(m_rcname==NULL)
      return;
//--- actualizar recurso y redibujar
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw(this.m_chart_id);
  }
 

Aquí es donde

//+------------------------------------------------------------------+
//| Dibuja la polilínea de Wu|
//+------------------------------------------------------------------+
void CCanvas::PolylineWu(int &x[],int &y[],const uint clr,const uint style=UINT_MAX);

hay divisiones por cero.

 
Si la matriz tiene una longitud mayor que la anchura (en píxeles) del gráfico, mala suerte.
 

Les pido que mejoren CGraphic y CCurve. Son clases débiles. Y es casi imposible heredar de ellas, porque lo que necesitas es privado. Tardé mucho en ponerme a ello, pero tuve que reescribir las clases yo mismo para que funcionaran correctamente.

Quería hacer un gráfico de ticks interactivo - me salió muy crudo (sin reescribir las clases)

#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);
}

Sin DeleteCurve, ChangeCurve, etc.

 
fxsaber:

Les pido que mejoren CGraphic y CCurve. Son clases débiles. Y es casi imposible heredar de ellas, porque lo que necesitas es privado. Tardé mucho en ponerme a ello, pero tuve que reescribir las clases yo mismo para que funcionaran correctamente.

Quería hacer un gráfico de ticks interactivo - me salió muy crudo (sin reescribir las clases)

#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);
}

Sin DeleteCurve, ChangeCurve, etc.

¿Es este un código tan corto? Por alguna razón, pensé que era una hoja. ¿Es posible hacer una visualización de un vaso con un número determinado de bandas combinadas con una cinta de oficios? Como he mostrado un ejemplo de visualización en otro software.
 
Stanislav Korotky:
¿Es sólo en el cinco? ¿Hay planes para un cuatro?

Sólo el cinco.

El cuatro está hecho.

 
ivanivan_11:
¿Es posible hacer una visualización de una pila con un número determinado de bandas, combinada con una cinta de operaciones? Como he mostrado un ejemplo de visualización en otro software.

Es posible dibujar interactivamente cualquier cosa desde hace muchos años. Sólo que nadie (públicamente seguro) lo utiliza.

El código no es corto, sino largo y muy torcido (así como el resultado - parpadeos). La librería necesita ser seriamente mejorada.

 

Sí, la biblioteca aún está en fase de pruebas.

Vamos a ponerla en orden, permitir la herencia, añadir métodos y deshacernos de los bloqueos debidos a una indexación incorrecta.