Prüfung von CGraphic - Fragen und Anregungen

 

Suche nach Anwendungen für neue Funktionen - insbesondere für die Grahic-Bibliothek (wissenschaftliche Graphen).

Als Beispiel wählen wir einen Bereich in einem Diagramm mit einem Rechteckobjekt aus und führen das Script aus:

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string   rectangle_name="RECTANGLE";   // rectangle name
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int result_find=ObjectFind(0,rectangle_name);
   Print("result_find: ",result_find);
   if(result_find!=-1)
     {
      datetime from  = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
      datetime to    = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
      MqlTick tick_array_range[];   // массив для приема тиков
      ResetLastError();
      CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
      Print("Error: ",GetLastError());
      if(GetLastError()!=0)
         return;

      double   arr_ask[];
      int size=ArraySize(tick_array_range);
      ArrayResize(arr_ask,size);
      for(int i=0;i<size;i++)
         arr_ask[i]=tick_array_range[i].ask;

      GraphPlot(arr_ask,1);
      m_graphic.Destroy();
      Sleep(sleeping);
      ObjectsDeleteAll(0,"Graphic",0,OBJ_BITMAP_LABEL);
      ChartRedraw();
     }
  }
//+------------------------------------------------------------------+

Das Ergebnis ist ein Diagramm, das von Ask in Form von Ticks dargestellt wird:

1

Dateien:
 

Wenn ich versuche, die CGraphic.Erstellen, ich bekomme ein Malewitsch-Quadrat:

Malewitschs Quadrat

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string   rectangle_name="RECTANGLE";   // rectangle name
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int result_find=ObjectFind(0,rectangle_name);
   Print("result_find: ",result_find);
   if(result_find!=-1)
     {
      datetime from  = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
      datetime to    = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
      MqlTick tick_array_range[];   // массив для приема тиков
      ResetLastError();
      CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
      Print("Error: ",GetLastError());
      if(GetLastError()!=0)
         return;

      double   arr_ask[];
      int size=ArraySize(tick_array_range);
      ArrayResize(arr_ask,size);
      for(int i=0;i<size;i++)
         arr_ask[i]=tick_array_range[i].ask;

      m_graphic.Create(0,"Deals",0,30,30,500,300);
      m_graphic.CurveAdd(arr_ask,1);
      Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
      m_graphic.Update();
      Print("Цвет фона после \"Update\": ",m_graphic.BackgroundColor());
      Sleep(sleeping);
      m_graphic.Destroy();
     }
  }
//+------------------------------------------------------------------+


2016.12.11 09:06:02.528 Terminal        MetaTrader 5 x64 build 1495 started (MetaQuotes Software Corp.)
2016.12.11 09:06:02.531 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 4882 / 8077 Mb, HDD: 357683 / 476372 Mb, GMT+02:00
2016.12.11 09:06:02.531 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Weder in "Experten" noch in "Journal" gibt es Fehler.

Dateien:
 
Vladimir Karputov:

Suche nach Anwendungen für neue Funktionen - insbesondere für die Grahic-Bibliothek (wissenschaftliche Graphen).

Wählen Sie zum Beispiel einen Bereich in einem Diagramm mit einem Rechteckobjekt aus und führen Sie das Script aus:

Für Nicht-Programmierer sollte das Rechteck RECTANGLE genannt werden.

Frage: Was wird auf der X-Achse angezeigt? Ich habe 2 Balken M1 markiert, die Anzahl der Ticks gezählt, es passt nicht, die Sekunden stimmen auch nicht überein.

 
Vladimir Karputov:

Wenn ich versuche, die CGraphic.Erstellen, ich bekomme ein Malewitsch-Quadrat:


Sie haben Redraw() nicht vor Update() ausgeführt.
 
o_O:
Sie haben Redraw() nicht vor Update() ausgeführt.

Erledigt, zeichnet einen Diagrammrahmen, Achsen. Es gibt kein eigenes Diagramm.

Außerdem wurde hinzugefügt, dass es so gezeichnet wird.

....
      m_graphic.Create(0,"Deals",0,30,30,500,300);
      CCurve* curve = m_graphic.CurveAdd(arr_ask,CURVE_LINES);
      curve.Color(clrBlack);
      curve.Visible(true);
      Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
      m_graphic.Redraw();
      m_graphic.Update();
....

***

 
Alexey Volchanskiy:

Erledigt, zeichnet einen Diagrammrahmen, Achsen. Es gibt kein eigenes Diagramm.

Auch ergänzt, zieht es auf diese Weise.

....
      m_graphic.Create(0,"Deals",0,30,30,500,300);
      CCurve* curve = m_graphic.CurveAdd(arr_ask,CURVE_LINES);
      curve.Color(clrBlack);
      curve.Visible(true);
      Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
      m_graphic.Redraw();
      m_graphic.Update();
....

***

Ich danke Ihnen!

Arbeitsversion (Version "1.003"):

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.003"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string   rectangle_name="RECTANGLE";   // rectangle name
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   ResetLastError();
   int result_find=ObjectFind(0,rectangle_name);
   if(result_find<0)
     {
      Print("ObjectFind Error: ",GetLastError());
      return;
     }
   datetime from  = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
   datetime to    = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
   MqlTick tick_array_range[];                  // массив для приема тиков
   ResetLastError();
   CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
   if(GetLastError()!=0)
      return;

   double   arr_ask[];
   int size=ArraySize(tick_array_range);
   ArrayResize(arr_ask,size);
   for(int i=0;i<size;i++)
      arr_ask[i]=tick_array_range[i].ask;

   m_graphic.Create(0,"Deals",0,30,30,500,300); // создает графический ресурс, привязанный к объекту чарта

   CCurve *curve=m_graphic.CurveAdd(arr_ask,1); // создает и добавляет кривую (CCurve) на график
   curve.Visible(true);                         // отображает кривую

   m_graphic.Redraw();                          // redraw grahic
   m_graphic.Update();                          // отображает на экране сделанные изменения
   Sleep(sleeping);
   m_graphic.Destroy();                         // удаляет с чарта график и уничтожает графический ресурс
  }
//+------------------------------------------------------------------+


Version 1.003

Dateien:
 

Die Klasse CGraphic hat ein sehr unglückliches (oder schlecht durchdachtes) Design mit ihrer Leinwand.

In seiner jetzigen Form dient es lediglich zu Demonstrationszwecken. Für andere Zwecke ist sie kaum geeignet. Da es nicht möglich ist, Position und Größe der Zeichnung auf einem eigenen Objekt zu verwalten, nimmt m_canvas ungerechterweise das gesamte grafische Objekt ein.
Und aufgrund der Tatsache, dass m_canvas privat ist, ist es unmöglich, etwas Eigenes zu erben und zu ändern.

Im Allgemeinen, bitte ändern Sie es.
, so dass die Leinwand entweder verfügbar wäre, wenn die Vererbung oder es wäre möglich, mit dieser m_canvas ohne reales Objekt auf dem Diagramm zu arbeiten und dann nehmen Sie die gemachte Konstruktion nach eigenem Ermessen.

 

Und der zweite Punkt - in CGraphic sind nicht alle Funktionen virtuell.

Warum haben Sie den Entwicklern verboten, diese zu überschreiben?

 
      //--- trim the name
      m_canvas.FontSizeSet(m_history.name_size);
      if(m_canvas.TextWidth(name)>m_history.name_width)
        {
         while(m_canvas.TextWidth(name+"...")>m_history.name_width)
            name=StringSubstr(name,0,StringLen(name)-1);
         name+="...";
        }

Fehler gefunden - unendliche while-Schleife, wenn m_history.name_width klein ist


Wie kann ich den Verlauf auf der rechten Seite ganz deaktivieren?

 

Soweit es mich betrifft:

GetX

Schreibt die X-Koordinaten für alle Kurvenpunkte in ein Array


Ich sollte die "x"-Koordinaten - Koordinaten in Pixeln - aller gezeichneten Punkte auf dem Diagramm in ein Array bekommen?

Prüfen:

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input int      m_width=500;                  // ширина
input int      m_height=300;                 // высота
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double   arr_example[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

   m_graphic.Create(0,"Example",0,30,30,m_width,m_height); // создает графический ресурс, привязанный к объекту чарта

   CCurve *curve=m_graphic.CurveAdd(arr_example,1); // создает и добавляет кривую (CCurve) на график
   curve.Visible(true);                         // отображает кривую
   m_graphic.Redraw();                          // redraw grahic

   double arr_get_x[];
   curve.GetX(arr_get_x);                       // записываем координаты X для всех точек кривой в массив

   ArrayPrint(arr_get_x);                       // распечатываем массив

   m_graphic.Update();                          // отображает на экране сделанные изменения
   Sleep(sleeping);
   m_graphic.Destroy();                         // удаляет с чарта график и уничтожает графический ресурс
  }
//+------------------------------------------------------------------+


Das Diagramm wird gezeichnet:

CCurve

Und hier ist ein Ausdruck des Arrays - es stellte sich heraus, dass es die Daten enthält, für die das Diagramm gezeichnet wurde, aber nicht die "x"-Koordinaten in Pixeln:

2016.12.11 19:03:09.691 GetX (EURUSD,M1)             0.0  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000 11.00000 12.00000 13.00000 14.00000
Dateien:
GetX.mq5  4 kb
 
Vladimir Karputov:

Ich muss die "x"-Koordinaten - Koordinaten in Pixeln - aller gezeichneten Punkte im Diagramm in ein Array übertragen?

Ich habe nichts über "Pixel" gesagt.

Sie haben nur ein Y-Array eingereicht. x ist also eine einfache Ordnungszahl. GetX ist richtig.