ObjectMove

Verändert Koordinaten des angegebenen Bezugspunktes des Objekts.

bool  ObjectMove(
   long      chart_id,        // Identifikator des Charts
   string    name,            // Objektname
   int       point_index,     // Nummer des Bezugspunktes 
   datetime  time,            // Zeit
   double    price            // Preis
   );

Parameter

chart_id

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

name

[in]  Objektname.

point_index

[in]  Nummer des Bezugspunktes. Anzahl der Bezugspunkte hängt vom Objekttyp ab.

time

[in]  Zeitkoordinate des angegebenen Bezugspunktes.

price

[in]  Preiskoordinate des angegebenen Bezugspunktes.

Rückgabewert

Gibt true zurück, wenn ein Befehl zur Warteschlange des angegebenen Charts erfolgreich hinzugefügt wurde, andernfalls false.

Hinweis

Beim Aufruf von ObjectMove() wird immer ein asynchroner Aufruf verwendet, deswegen gibt die Funktion nur das Ergebnis des Hinzufügens eines Befehls zur Warteschlange 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 eine Funktion verwenden, die die Eigenschaften des Objektes abruft, 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.

 

Beispiel:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME_ASK     "TestObjectMoveAsk"  // Name des grafischen Objekts für den Briefkurs (Ask)
#define   OBJ_NAME_BID     "TestObjectMoveBid"  // Name des grafischen Objekts für den Geldkurs (Bid)
#define   COUNT            100000000            // Anzahl der Ticks zum Laden der Historie
#define   DELAY            1                    // Verzögerung zwischen Ticks in ms
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- aktuelle Chart-ID, Chart-Symbol und Symbol-Dezimalstelle
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- Erstellen Sie zwei Preisetiketten, um den Ask-Preis und den Bid-Preis im Chart anzuzeigen
   if(!CreatePriceLabel(chart_idtrue) || !CreatePriceLabel(chart_idfalse))
      return;
   
//--- Array zum Empfangen von Ticks
   MqlTick ticks[]={};
   
//--- Anzahl der nächsten sichtbaren Balken im Chart und Öffnungszeit dieses Balkens in Millisekunden abrufen
   int   first= (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR)-1;
   ulong from = GetTime(symbolPERIOD_CURRENTfirst)*1000;
   
//--- Lade die Tick-Historie in das Array
   Print("Beginn der Tick-Erfassung...");
   if(!GetTicksToArray(symbolticks))
      return;
      
//--- Tick-Array zurücksetzen und Ticks aus dem sichtbaren Bereich der Balken im Chart abrufen
   ZeroMemory(ticks);
   if(CopyTicksRange(symbolticksCOPY_TICKS_INFOfrom)<1)
     {
      PrintFormat("CopyTicksRange() vom Datum %s fehlgeschlagen. Error %d"TimeToString(GetTime(symbolPERIOD_CURRENTfirst)), GetLastError());
      return;
     }
   
   Sleep(500);
   PrintFormat("Tick ​​visualization started at %s (%I64u), ticks total: %u"TimeToString(GetTime(symbolPERIOD_CURRENTfirst)), fromticks.Size());
   
   int count=0;                  // Anzahl der verarbeiteten Ticks
   int changes=0;                // Anzahl der verarbeiteten Preisänderungen
   int total=(int)Ticks.Size();  // Größe des Tick-Arrays
   
//--- in einer Schleife durch das Tick-Array
   for(int i=0i<total && !IsStopped(); i++)
     {
      //--- einen Tick aus dem Array holen und den Tick-Zähler erhöhen
      MqlTick  tick=ticks[i];
      count++;
      
 //--- Überprüfen der Tick-Flags für Ask und Bid
      bool ask_tick=((tick.flags &TICK_FLAG_ASK)==TICK_FLAG_ASK); 
      bool bid_tick=((tick.flags &TICK_FLAG_BID)==TICK_FLAG_BID); 
      bool done=false;
      
      //--- wenn sich der Briefkurs (Ask) ändert
      if(ask_tick)
        {
         if(Move(chart_idOBJ_NAME_ASKtick.timetick.ask))
           {
            changes++;
            done=true;
           }
        }
      //--- wenn sich der Geldkurs (Bid) ändert
      if(bid_tick)
        {
         if(Move(chart_idOBJ_NAME_BIDtick.timetick.bid))
           {
            changes++;
            done=true;
           }
        }
      //--- wenn eines (oder beide) der grafischen Objekte verschoben wurde(n), aktualisiere das Chart
      if(done)
        {
         ChartRedraw(chart_id);
         Sleep(DELAY);
        }
     }
   
//--- Am Ende der Schleife melden wir die Anzahl der verarbeiteten Ticks im Journal,
//--- warten einige Sekunden, löschen die erstellten Objekte und zeichnen das Chart neu.
   PrintFormat("Total ticks completed: %u, Total price changes: %d"countchanges);
   Sleep(2000);
   if(ObjectsDeleteAll(chart_id"TestObjectMove")>0)
      ChartRedraw(chart_id);
   /*
   Als Ergebnis der Skriptausführung wird die Bewegung der Preise Ask und Bid auf dem sichtbaren Chart angezeigt,
   beginnend am linken Rand des Charts bis zum Ende der historischen Daten.
   Die folgenden Daten werden im Journal angezeigt:
   Started collecting ticks...
   AUDUSDreceived 13726794 ticks in 969 ms
   Tick ​​visualization started at 2025.01.31 09:00 (1738314000000), ticks total44380
   Total ticks completed44380Total price changes68513
   */
  }
//+------------------------------------------------------------------+
//| Erstellen Sie ein Objekt "Price label"                           |
//+------------------------------------------------------------------+
bool CreatePriceLabel(const long chart_idconst bool obj_ask)
  {
   string obj_name=(obj_ask ? OBJ_NAME_ASK : OBJ_NAME_BID);
   ResetLastError();
   if(!ObjectCreate(chart_idobj_name, (obj_ask ? OBJ_ARROW_RIGHT_PRICE : OBJ_ARROW_LEFT_PRICE), 000))
     {
      PrintFormat("%s: ObjectCreate() fehlgeschlagen. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   return(ObjectSetInteger(chart_idobj_nameOBJPROP_COLOR, (obj_ask ? clrRed : clrBlue)));
  }
//+------------------------------------------------------------------+
//| Verschieben grafischer Objekt zu angegebenen Preis-/Zeit-Werte   |
//+------------------------------------------------------------------+
bool Move(const long chart_idconst string obj_nameconst datetime timeconst double price)
  {
   ResetLastError();
   if(!ObjectSetInteger(chart_idobj_nameOBJPROP_TIMEtime))
     {
      PrintFormat("%s: ObjectSetInteger() fehlgeschlagen. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   if(!ObjectSetDouble(chart_idobj_nameOBJPROP_PRICEprice))
     {
      PrintFormat("%s: ObjectSetDouble() fehlgeschlagen. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Ticks in das Array laden                                         |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbolMqlTick &array[])
  {
   int  attempts=0;     // Zähler für Versuche, den Tick-Verlauf abzurufen
   bool success =false// Flag für erfolgreiches Kopieren von Ticks
   
//--- 3 Versuche, Ticks abzurufen
   while(attempts<3
     {
      //--- Startzeit vor dem Empfang der Ticks messen 
      uint start=GetTickCount();
      
      //--- Anforderung der Tick-Historie seit 1970.01.01 00:00.001 (Parameter from=1 ms) 
      ResetLastError();
      int received=CopyTicks(symbolarrayCOPY_TICKS_ALL1COUNT); 
      if(received!=-1
        { 
         //--- Anzeige der Daten zur Anzahl der Ticks und zur verstrichenen Zeit 
         PrintFormat("%s: %d Ticks in %d ms empfangen"SymbolempfangenGetTickCount()-start); 
         //--- wenn der Tick-Verlauf synchronisiert ist, ist der Fehlercode gleich Null 
         if(GetLastError()==0
           { 
            success=true
            break
           } 
         else 
            PrintFormat("%s: %s Ticks sind noch nicht synchronisiert, %d Ticks in %d ms empfangen. Error=%d"
            __FUNCTION__symbolreceivedGetTickCount()-startGetLastError()); 
        } 
      //--- Versuche zählen 
      attempts++; 
      //--- eine Pause von einer Sekunde, um das Ende der Synchronisierung der Tick-Datenbank abzuwarten
      Sleep(1000); 
     } 
//--- Der Empfang der angeforderten Ticks vom Beginn der Tick-Historie ist nach drei Versuchen fehlgeschlagen.  
   if(!success
     { 
      PrintFormat("Fehler! Nach drei Versuchen konnten keine Ticks für das Symbol %s abgerufen werden"Symbol); 
      return(false); 
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Gibt die Zeit des Bar-Index zurück                               |
//+------------------------------------------------------------------+
datetime GetTime(const string symbolconst ENUM_TIMEFRAMES timeframeconst int index)
  {
   datetime array[1]={};
   ResetLastError();
   if(CopyTime(symboltimeframeindex1array)!=1)
      PrintFormat("%s: CopyTime() fehlgeschlagen. Error %d",__FUNCTION__GetLastError());
   return(array[0]);
  }