Objektebene Zeichenebene von grafischen Objekten

 

Hallo zusammen

Bin noch Neuling in Sachen MQL5 also verzeiht falls die Frage nicht so anspruchsvoll ist.

Ich möchte mir im Chart einige grafische Objekte vom Typ "Rectangle Label" einzeichen was soweit auch klappt.

Einige Objekt sollen sich in Ihrer Lage überschneiden (also Rechteck 1 soll vor Rechteck 2 liegen) was aber nicht klappt.

Ich bin davon ausgegangen, dass man einfach die Aufrufreihenfolge im Code verändert und schon ist auch die Ebene entsprechend dargestellt. Aber das klappt nicht.

Auch liegt ein Text hinter dem Rechteck statt davor usw.

Wie legt man die Ebenen, also die Reihenfolge der Überdeckung, von grafischen Objekten im Chart fest?


MfG

Travez

 

Ganz versteh ich dein problem nicht,

kannst du den code mal posten und einen screenshot?

 
amando:

Ganz versteh ich dein problem nicht,

kannst du den code mal posten und einen screenshot?

Er meint das hier


 

Hier ein einfaches Beispiel.

Die Reihenfolge ist Rot, Gelb vor Rot, Grün vor Rot und Gelb und der Text "1234" liegt über alles.

Ich muss also im mq5 Coder erst das rote Rechteck, dann Gelb, dann Grün und zum Schluss den Text erzeugen richtig?

So hatte ich das gemacht aber der Text war hinter einem der farbigen Rechtecke. Erst als ich die Textfarbe geändert habe ist der Text nach ganz oben gewandert.

Dateien:
picture1.PNG  1 kb
 

Wenn mich nicht alles täuscht, kann man programmtechnisch nur sagen, im Hintergrund, mehr hat man da nicht.

die fügen sich dann in programmreihenfolge ein

 

Ja das kling so auch logisch. Einfach in der gewünschten Reihenfolge im Programm erzeugen lassen.

Hatte bei mir nur nach Veränderung im Programm keine Änderung auf dem Chart erzeugt. Erst als ich zusätzlich die Objekteigenschaften (Farbe) geändert habe ist die richtige Reihenfolge erschienen.

Keine Ahnung woran das liegt.

Dachte das es da eine Objekteigenschaft (wie Ebene) gibt die man dem Objekt mitteilt und hatte etwas gegooglet aber nichts gefunden.

 
Travez :

Ja das kling so auch logisch. Einfach in der gewünschten Reihenfolge im Programm erzeugen lassen.

Hatte bei mir nur nach Veränderung im Programm keine Änderung auf dem Chart erzeugt. Erst als ich zusätzlich die Objekteigenschaften (Farbe) geändert habe ist die richtige Reihenfolge erschienen.

Keine Ahnung woran das liegt.

Dachte das es da eine Objekteigenschaft (wie Ebene) gibt die man dem Objekt mitteilt und hatte etwas gegooglet aber nichts gefunden.

Zeigen Sie bitte Ihren Code.
 

Hier gibt es eine Übersicht über eine ganze Reihe von Artikeln über Grafische Interfaces: https://www.mql5.com/de/users/tol64/publications

Mit ein bisschen Suchen findet sicherlich einer, der viel Code bietet, den man nur kopieren müsste.

Jede GUI beginnt mit einem Rechteck mit Hintergrund und Farbe...

Anatoli Kazharski
Anatoli Kazharski
  • www.mql5.com
Viele Forscher schenken dem Erkennen des Preisverhaltens nicht genügend Aufmerksamkeit. Gleichzeitig werden komplexe Methoden eingesetzt, die sehr oft nur "Black Boxes" sind, wie z.B. maschinelles Lernen oder neuronale Netze. Die wichtigste Frage, die sich in diesem Fall stellt, ist, welche Daten Ein universeller RSI-Indikator für das...
 

Hallo nochmal

Aus Zeitgründen konnte ich jetzt erst weitermachen.

@Alain Verleyen

Habe den Code mal hinten angefügt aber da gibt es nichts spektakuläres zu sehen. Es werden einfach 3 Rectangle Grafiken der Reihe nach erzeugt.Diese werden auch entsprechend der Aufrufreihenfolge im Code im Chartfenster gezeichnet. Warum das anfangs nicht geklappt hatte weiß ich nicht. Aber das funktioniert jetzt.

@All

Wenn ich jetzt im Chart eine horizontale Line einzeichne ist diese auf der obersten Ebene und überdeckt die bunten Kästchen. Das liegt daran das unter den Eigenschaften der Linie der Haken "Objekt im Hintergrund zeichnen" nicht aktiv ist. Ich möchte aber das zyklisch meine Kästchen immer wieder neu gezeichnet werden und somit zwangläufig wieder in oberster Ebene sind. Die "ChartRedraw" Funktion im zyklischen Aufruf der "OnTimer" Funktion bringt nichts.

Wie schaft man es das die vom Programm erzeugten Objekte immer in den Vordergrund liegen?

Bilder im Anhang


//+------------------------------------------------------------------+
//|                                                  Testprojekt.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   ObjectDelete(0,"Rect_1");
   ObjectDelete(0,"Rect_2");
   ObjectDelete(0,"Rect_3");     
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {

   ObjectCreate(0,"Rect_1",OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,"Rect_1",OBJPROP_XDISTANCE,100);    
   ObjectSetInteger(0,"Rect_1",OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,"Rect_1",OBJPROP_XSIZE,50);    
   ObjectSetInteger(0,"Rect_1",OBJPROP_YSIZE,50);
   ObjectSetInteger(0,"Rect_1",OBJPROP_CORNER,CORNER_LEFT_UPPER); 
   ObjectSetInteger(0,"Rect_1",OBJPROP_BGCOLOR,clrRed);
   ObjectSetInteger(0,"Rect_1",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"Rect_1",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Rect_1",OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,"Rect_1",OBJPROP_WIDTH,1);
   ObjectSetInteger(0,"Rect_1",OBJPROP_BACK,false);
   ObjectSetInteger(0,"Rect_1",OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,"Rect_1",OBJPROP_SELECTED,false);
   ObjectSetInteger(0,"Rect_1",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"Rect_1",OBJPROP_ZORDER,0);
   
   ObjectCreate(0,"Rect_2",OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,"Rect_2",OBJPROP_XDISTANCE,110);    
   ObjectSetInteger(0,"Rect_2",OBJPROP_YDISTANCE,110);
   ObjectSetInteger(0,"Rect_2",OBJPROP_XSIZE,50);    
   ObjectSetInteger(0,"Rect_2",OBJPROP_YSIZE,50);
   ObjectSetInteger(0,"Rect_2",OBJPROP_CORNER,CORNER_LEFT_UPPER); 
   ObjectSetInteger(0,"Rect_2",OBJPROP_BGCOLOR,clrYellow);
   ObjectSetInteger(0,"Rect_2",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"Rect_2",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Rect_2",OBJPROP_COLOR,clrYellow);
   ObjectSetInteger(0,"Rect_2",OBJPROP_WIDTH,1);
   ObjectSetInteger(0,"Rect_2",OBJPROP_BACK,false);
   ObjectSetInteger(0,"Rect_2",OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,"Rect_2",OBJPROP_SELECTED,false);
   ObjectSetInteger(0,"Rect_2",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"Rect_2",OBJPROP_ZORDER,0);
   
   ObjectCreate(0,"Rect_3",OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,"Rect_3",OBJPROP_XDISTANCE,120);    
   ObjectSetInteger(0,"Rect_3",OBJPROP_YDISTANCE,120);
   ObjectSetInteger(0,"Rect_3",OBJPROP_XSIZE,50);    
   ObjectSetInteger(0,"Rect_3",OBJPROP_YSIZE,50);
   ObjectSetInteger(0,"Rect_3",OBJPROP_CORNER,CORNER_LEFT_UPPER); 
   ObjectSetInteger(0,"Rect_3",OBJPROP_BGCOLOR,clrGreen);
   ObjectSetInteger(0,"Rect_3",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"Rect_3",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Rect_3",OBJPROP_COLOR,clrGreen);
   ObjectSetInteger(0,"Rect_3",OBJPROP_WIDTH,1);
   ObjectSetInteger(0,"Rect_3",OBJPROP_BACK,false);
   ObjectSetInteger(0,"Rect_3",OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,"Rect_3",OBJPROP_SELECTED,false);
   ObjectSetInteger(0,"Rect_3",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"Rect_3",OBJPROP_ZORDER,0);
   
   ChartRedraw();    
  }
//+------------------------------------------------------------------+
 
Travez :

Hallo nochmal

Aus Zeitgründen konnte ich jetzt erst weitermachen.

@ Alain Verleyen

Habe den Code mal hinten angefügt aber da gibt es nichts spektakuläres zu sehen. Es werden einfach 3 Rectangle Grafiken der Reihe nach erzeugt.Diese werden auch entsprechend der Aufrufreihenfolge im Code im Chartfenster gezeichnet. Warum das anfangs nicht geklappt hatte weiß ich nicht. Aber das funktioniert jetzt.

@All

Wenn ich jetzt im Chart eine horizontale Line einzeichne ist diese auf der obersten Ebene und überdeckt die bunten Kästchen. Das liegt daran das unter den Eigenschaften der Linie der Haken "Objekt im Hintergrund zeichnen" nicht aktiv ist. Ich möchte aber das zyklisch meine Kästchen immer wieder neu gezeichnet werden und somit zwangläufig wieder in oberster Ebene sind. Die "ChartRedraw" Funktion im zyklischen Aufruf der "OnTimer" Funktion bringt nichts.

Wie schaft man es das die vom Programm erzeugten Objekte immer in den Vordergrund liegen?

Bilder im Anhang


Warum willst du das tun?

Warum sollten Sie Ihren Code in OnTimer () platzieren, damit er jede Sekunde ausgeführt wird? Macht keinen Sinn und ist sehr ineffizient. Zeichnen Sie Ihre Objekte einmal und aktualisieren Sie sie dann bei Bedarf (ändern Sie Farbe oder Text oder was auch immer).

Und bitte schreibe nicht, denke wie "funktioniert nicht", erkläre, was du erwartest und was du wirklich bekommst. Funktioniert nicht ist bedeutungslos.

 

Alain ,so wie Travez verstanden habe meint er das hier:

Ich habe nie Objekte gezeichnet, kann daher nicht helfen.