ObjectCreate

Erzeugt ein Objekt mit dem angegebenen Namen, Typ und ursprünglichen Koordinaten im angegebenen Subfenster des Charts. Bei der Erzeugung kann man bis zu 30 Koordinaten angeben.

bool  ObjectCreate(
   long         chart_id,      // Identifikator des Charts
   string       name,          // Objektname
   ENUM_OBJECT  type,          // Objekttyp
   int          sub_window,    // Index des Fensters
   datetime     time1,         // Zeit des ersten Ankerpunktes 
   double       price1,        // Preis des ersten Ankerpunktes 
   ...
   datetime     timeN=0,       // Zeit des N-Ankerpunktes
   double       priceN=0,      // Preis des N-Ankerpunktes
   ...
   datetime     time30=0,      // Zeit des 30. Ankerpunktes
   double       price30=0      // Preis des 30. Ankerpunktes
   );

Parameter

chart_id

[in]  Identifikator des Charts. 0 bedeutet den laufenden Chart.

name

[in]  Objektname. Name muss unikal im Rahmen eines Charts und seiner Subfenster sein.

type

[in]  Objekttyp. Wert kann der einer der Enumerationswerte ENUM_OBJECT sein.

sub_window

[in]  Nummer des Subfensters des Charts. Das angegebene Subfenster muss existieren, anderenfalls gibt die Funktion false zurück. .

time1

[in]  Zeitkoordinate des ersten Ankerpunktes.

price1

[in]  Preiskoordinate des ersten Ankerpunktes.

timeN=0

[in]  Zeitkoordinate des N-Ankerpunktes.

priceN=0

[in]  Preiskoordinate des N-Ankerpunktes.

time30=0

[in]  Zeikoordinate des 30. Ankerpunktes.

price30=0

[in]  Preiskoordinate des 30. Ankerpunktes.

Rückgabewert

Gibt true zurück, wenn ein Befehl zur Warteschlange des angegebenen Charts erfolgreich hinzugefügt wurde, andernfalls false. Wenn das Objekt bereits früher erstellt wurde, wird versucht, seine Koordinaten zu ändern.

Hinweis

Beim Aufruf von ObjectCreate() wird immer ein asynchroner Aufruf verwendet, deswegen gibt die Funktion nur das Ergebnis des Hinzufügens eines Befehls zur Warteschlange des Charts zurück. In diesem Fall bedeutet true nur, dass der Befehl zur Warteschlange erfolgreich hinzugefügt wurde, das Ergebnis der Ausführung ist unbekannt.

Für die Überprüfung des Ergebnisses der Ausführung kann man die Funktion ObjectFind() oder andere Funktionen verwenden, die die Eigenschaften des Objektes abrufen, z.B. vom Typ ObjectGetXXX. Dabei muss man beachten, dass solche Funktionen am Ende der Warteschlange hinzugefügt werden und auf das Ergebnis der Ausführung warten (weil sie synchrone Aufrufe sind). D.h. sie können viel Zeit in Anspruch nehmen.  Dies muss man beachten, wenn man mit vielen Objekten im Chart arbeitet.

Der Name des grafischen Objekts darf nicht länger als 63 Symbole sein.

Die Nummerierung der Subfenster des Chart (wenn es auf dem Chart Subfenster mit Indikatoren gibt) fängt mit 1 an. Hauptfenster eines Charts gibt es immer und hat Index 0.

Die große Anzahl von Ankerpunkten (bis zu 30) ist für die weitere Verwendung vorgesehen. Die Einschränkung auf 30 Ankerpunkte ist damit verbunden, dass die Anzahl der Parameter beim Funktionsaufruf nicht mehr als 64 betragen darf.

Bei der Umbenennung des graphischen Objekts werden gleichzeitig zwei Ereignisse formiert, die im Experten oder im Indikator durch die Funktion OnChartEvent() verarbeitet werden können:

  • Entfernung eines Objektes mit dem alten Namen;
  • Erzeugung eines graphischen Objektes mit dem neuen Namen.

Für die Erzeugung jedes der Objekttypen ist es erforderlich, eine bestimmte Anzahl der Bezugspunkte anzugeben:

Identifikator

Beschreibung

Bezugspunkte

OBJ_VLINE

Senkrechte Linie

Ein Ankerpunkt. Tatsächlich wird nur die Koordinate der Zeitachse entlang verwendet.

OBJ_HLINE

Horizontale Linie

Ein Ankerpunkt. Tatsächlich wird nur die Koordinate der Preisachse entlang verwendet.

OBJ_TREND

Trendlinie

Zwei Ankerpunkte.

OBJ_TRENDBYANGLE

Trendlinie nach Winkel

Zwei Ankerpunkte.

OBJ_CYCLES

Zykluslinien

Zwei Ankerpunkte.

OBJ_ARROWED_LINE

Objekt "Linie mit einem Pfeil"

Zwei Ankerpunkte.

OBJ_CHANNEL

Abstandsgleicher Kanal

Drei Ankerpunkte.

OBJ_STDDEVCHANNEL

Kanal der Standardabweichung

Zwei Ankerpunkte.

OBJ_REGRESSION

Kanal der linearen Regression

Zwei Ankerpunkte.

OBJ_PITCHFORK

Andrews’ Pitchfork

Drei Ankerpunkte.

OBJ_GANNLINE

Gannlinie

Zwei Ankerpunkte.

OBJ_GANNFAN

Gannfan

Zwei Ankerpunkte.

OBJ_GANNGRID

Ganngrid

Zwei Ankerpunkte.

OBJ_FIBO

Fibonacci Retracement

Zwei Ankerpunkte.

OBJ_FIBOTIMES

Zeitzonen Fibonacci

Zwei Ankerpunkte.

OBJ_FIBOFAN

Fibonacci Fan

Zwei Ankerpunkte.

OBJ_FIBOARC

Fibonacci Arcs

Zwei Ankerpunkte.

OBJ_FIBOCHANNEL

Kanal Fibonacci

Drei Ankerpunkte.

OBJ_EXPANSION

Erweiterung Fibonacci

Drei Ankerpunkte.

OBJ_ELLIOTWAVE5

Elliott Motive Wave

Fünf Ankerpunkte.

OBJ_ELLIOTWAVE3

Elliott Correction Wave

Drei Ankerpunkte.

OBJ_RECTANGLE

Rechteck

Zwei Ankerpunkte.

OBJ_TRIANGLE

Dreieck

Drei Ankerpunkte.

OBJ_ELLIPSE

Ellipse

Drei Ankerpunkte.

OBJ_ARROW_THUMB_UP

Zeichen "Gut" (Daumen oben)

Ein Ankerpunkt.

OBJ_ARROW_THUMB_DOWN

Zeichen "Schlecht" (Daumen unten)

Ein Ankerpunkt.

OBJ_ARROW_UP

Zeichen "Weiche oben"

Ein Ankerpunkt.

OBJ_ARROW_DOWN

Zeichen "Weich unten"

Ein Ankerpunkt.

OBJ_ARROW_STOP

Zeichen "Stop"

Ein Ankerpunkt.

OBJ_ARROW_CHECK

Zeichen "Kontrollmarke"

Ein Ankerpunkt.

OBJ_ARROW_LEFT_PRICE

linke Preismarke

Ein Ankerpunkt.

OBJ_ARROW_RIGHT_PRICE

Rechte Preismarke

Ein Ankerpunkt.

OBJ_ARROW_BUY

Zeichen "Buy"

Ein Ankerpunkt.

OBJ_ARROW_SELL

Zeichen "Sell"

Ein Ankerpunkt.

OBJ_ARROW

Objekt "Weiche"

Ein Ankerpunkt.

OBJ_TEXT

Objekt "Text"

Ein Ankerpunkt.

OBJ_LABEL

Objekt "Textmarke"

Die Position wird durch Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE angegeben.

OBJ_BUTTON

Objekt "Schaltfläche"

Die Position wird durch Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE angegeben.

OBJ_CHART

Objekt "Chart"

Die Position wird durch Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE angegeben.

OBJ_BITMAP

Objekt "Bild"

Ein Ankerpunkt.

OBJ_BITMAP_LABEL

Objekt "graphische Marke"

Die Position wird durch Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE angegeben.

OBJ_EDIT

Objekt "Eingabefeld"

Die Position wird durch Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE angegeben.

OBJ_EVENT

Objekt "Ereignis", das einem Ereignis in der wirtschaftlichen Kalender entspricht

Ein Ankerpunkt. Tatsächlich wird nur die Koordinate der Zeitachse entlang verwendet.

OBJ_RECTANGLE_LABEL

Objekt "Rechteckige Marke" um eigene grafische Benutzeroberfläche zu entwerten.

Die Position wird durch Eigenschaften OBJPROP_XDISTANCE und OBJPROP_YDISTANCE angegeben.

 

Beispiel:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property script_show_inputs
 
#define   OBJ_NAME   "TestObjectCreate"            // Objekt-Name
#define   OBJ_X      40                            // Objekt X-Koordinate
#define   OBJ_Y      40                            // Objekt Y-Koordinate
#define   OBJ_WIDTH  300                           // Objekt-Breite
#define   OBJ_HEIGHT 200                           // Objekt-Höhe
#define   WND        0                             // Unterfenster des Charts
 
input ENUM_OBJECT InpObjectToCreate =  OBJ_VLINE;  /* zu erstellender Objekttyp   */ // Objekttyp, der im Chart dargestellt werden soll
 
struct SPoint                                      // Struktur des Ankerpunkts
  {
   double   price;
   datetime time;
  };
 
SPoint   ExtAnchorPoints[5];                       // Array von Ankerpunkten grafischer Objekte
long     ExtChartID;                               // ID 
 
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Anzahl der verfügbaren Balken überprüfen
   int bars=Bars(_Symbol,_Period);
   if(bars<7)
     {
      PrintFormat("The number of available bars (%d) is not enough to create some graphical objects",bars);
      return;
     }
//--- aktuelle Chart-ID
   ExtChartID=ChartID();
 
//--- zuvor erstelltes Objekt löschen
   ObjectDelete(ExtChartIDOBJ_NAME);
 
//--- fünf Ankerpunkte (Zeit/Preis) festlegen
   SetAnchorPointsData();
 
//--- Preis/Zeit der Ankerpunkte
   datetime tm0=ExtAnchorPoints[0].time;
   double   pr0=ExtAnchorPoints[0].price;
   datetime tm1=ExtAnchorPoints[1].time;
   double   pr1=ExtAnchorPoints[1].price;
   datetime tm2=ExtAnchorPoints[2].time;
   double   pr2=ExtAnchorPoints[2].price;
   datetime tm3=ExtAnchorPoints[3].time;
   double   pr3=ExtAnchorPoints[3].price;
   datetime tm4=ExtAnchorPoints[4].time;
   double   pr4=ExtAnchorPoints[4].price;
   
//--- Wenn das Objekt erfolgreich erstellt wurde, lege die restlichen Parameter fest:
   if(ObjectCreate(ExtChartID,OBJ_NAME,InpObjectToCreate,WND,tm0,pr0,tm1,pr1,tm2,pr2,tm3,pr3,tm4,pr4))
     {
 //--- Objekt auswählbar machen und auswählen
      ObjectSetInteger(ExtChartIDOBJ_NAMEOBJPROP_SELECTABLEtrue);
      ObjectSetInteger(ExtChartIDOBJ_NAMEOBJPROP_SELECTEDtrue);
      
 //--- für Objekte, die anhand von Chart-Koordinaten positioniert sind
      ENUM_OBJECT obj=InpObjectToCreate;
      if(obj==OBJ_LABEL || obj==OBJ_BUTTON || obj==OBJ_CHART || obj==OBJ_BITMAP_LABEL || obj==OBJ_EDIT || obj==OBJ_RECTANGLE_LABEL)
        {
 //--- Objektkoordinaten festlegen 
         ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_XDISTANCE,OBJ_X);
         ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_YDISTANCE,OBJ_Y);
         //--- Objektgröße festlegen 
         ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_XSIZE,OBJ_WIDTH); 
         ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_YSIZE,OBJ_HEIGHT);
        }
      //--- Aktualisieren des Charts, um die Änderungen anzuzeigen
      ChartRedraw(ExtChartID);
     }
  }
//+------------------------------------------------------------------+
//| Füllen des Arrays der Objektankerpunkte                          |
//+------------------------------------------------------------------+
void SetAnchorPointsData(void)
  {
//--- linker Ankerpunktbalken (mit Index 0)
   int bar_first=(int)ChartGetInteger(ExtChartID,CHART_FIRST_VISIBLE_BAR)-1;
   
//--- Festlegen von Preis/Zeit des ersten Ankerpunkts (mit Index 0)
   ExtAnchorPoints[0].price=iOpen(_Symbol,_Period,bar_first);
   ExtAnchorPoints[0].time =iTime(_Symbol,_Period,bar_first);
   
//--- Festlegen von Preis/Zeit der Ankerpunkte mit den Indizes 1 - 3
   int distance=(int)round(bar_first/4);  // Abstand in Balken zwischen den Ankerpunkten
   for(int i=1;i<4;i++)
     {
      ExtAnchorPoints[i].price=iOpen(_Symbol,_Period,bar_first-i*distance);
      ExtAnchorPoints[i].time =iTime(_Symbol,_Period,bar_first-i*distance);
     }
   
//--- Festlegen von Preis/Zeit des letzten Ankerpunkts (mit Index 4)
   ExtAnchorPoints[4].price=iOpen(_Symbol,_Period,1);
   ExtAnchorPoints[4].time =iTime(_Symbol,_Period,1);
  }