Diskussion zum Artikel "Statistische Verteilungen in MQL5 - Nur das Beste aus R" - Seite 11

 
Gibt es das nur für den Fünfer? Gibt es Pläne für eine 4?
 
Stanislav Korotky:
Ist dies nur in der 5? Ist es für 4 geplant?

Also sollte alles in MT4 funktionieren. Es ist ein Standard OBJ_BITMAP_LABEL + benutzerdefinierte Ressource.

Übrigens, MT4 Compiler ist intelligenter als MT5

// MT5 schweigt, MT4 warnt - prüfen Sie den Vorrang der Operatoren auf mögliche Fehler; verwenden Sie Klammern, um den Vorrang zu verdeutlichen Canvas.mqh
m_pixels[y*m_width+x]=(r<<16|g<<8|b<<0|255<<24) &0xffffffff;


Und es ist ein Fehler aufgetreten (es funktioniert nicht in MT5, aber es funktioniert in 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 - falsch, MT4 - wahr
  }
}

void OnStart()
  {
   GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      
   SaveObjects();
  }
 
Nehmen Sie die Korrektur vor.
//+------------------------------------------------------------------+
//| Objekt auf dem Bildschirm aktualisieren (neu zeichnen)|
//+------------------------------------------------------------------+
void CCanvas::Update(const bool redraw)
  {
//--- prüfen
   if(m_rcname==NULL)
      return;
//--- Ressource aktualisieren und neu zeichnen
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw(this.m_chart_id);
  }
 

Dies ist der Fall, wenn

//+------------------------------------------------------------------+
//| Polylinie von Wu zeichnen|
//+------------------------------------------------------------------+
void CCanvas::PolylineWu(int &x[],int &y[],const uint clr,const uint style=UINT_MAX);

gibt es Divisionen durch Null.

 
Wenn die Länge des Arrays größer ist als die Breite (in Pixeln) des Diagramms, ist es schade.
 

Ich bitte Sie, CGraphic und CCurve zu verbessern. Sie sind schwache Klassen. Und es ist fast unmöglich, von ihnen zu erben, denn was man braucht, ist privat. Es hat lange gedauert, bis ich mich damit beschäftigt habe, aber ich musste die Klassen selbst umschreiben, damit sie richtig funktionieren.

Ich wollte ein interaktives Tick-Chart erstellen - es kam nur grob heraus (ohne Umschreiben von Klassen)

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

Keine DeleteCurve, ChangeCurve, etc.

 
fxsaber:

Ich bitte Sie, CGraphic und CCurve zu verbessern. Sie sind schwache Klassen. Und es ist fast unmöglich, von ihnen zu erben, denn was man braucht, ist privat. Es hat lange gedauert, bis ich mich damit beschäftigt habe, aber ich musste die Klassen selbst umschreiben, damit sie richtig funktionieren.

Ich wollte ein interaktives Tick-Chart erstellen - es kam nur grob heraus (ohne Umschreiben von Klassen)

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

Keine DeleteCurve, ChangeCurve, etc.

Ist das so ein kurzer Code? Aus irgendeinem Grund dachte ich, es sei ein Blatt. Ist es möglich, eine Visualisierung eines Glases mit einer bestimmten Anzahl von Bändern in Kombination mit einem Band von Trades zu machen? Wie ich ein Beispiel für die Visualisierung in einer anderen Software gezeigt habe.
 
Stanislav Korotky:
Gibt es das nur für den Fünfer? Gibt es Pläne für einen vierten?

Nur für die Fünf.

Der Vierte ist fertig.

 
ivanivan_11:
Ist das so ein kurzer Code? Aus irgendeinem Grund dachte ich, es sei ein Blatt. Ist es möglich, eine Visualisierung eines Stapels mit einer bestimmten Anzahl von Bändern zu erstellen, kombiniert mit einem Band von Trades? Ich habe ein Beispiel für eine Visualisierung in einer anderen Software gezeigt.

Es ist schon seit vielen Jahren möglich, interaktiv etwas zu zeichnen. Nur nutzt es niemand (sicher nicht öffentlich).

Der Code ist nicht kurz, sondern lang und sehr krumm (wie auch das Ergebnis - flackert). Die Bibliothek muss ernsthaft verbessert werden.

 

Ja, die Bibliothek ist immer noch nur ein Testlauf.

Wir werden sie aufräumen, Vererbung zulassen, Methoden hinzufügen und Abstürze aufgrund falscher Indizierung beseitigen.