ObjectMove

La funzione cambia le coordinate del punto di ancoraggio specificato dell'oggetto.

bool  ObjectMove(
   long      chart_id,        // identificatore del grafico
   string    name,            // nome dell'oggetto
   int       point_index,     // numero del punto di ancoraggio
   datetime  time,            // Tempo
   double    price            // Prezzo
   );

Parametri

chart_id

[in] Identificatore del Grafico. 0 significa il grafico corrente.

name

[in] Nome dell'oggetto.

point_index

[in] Indice del punto di ancoraggio. Il numero di punti di ancoraggio dipende dal tipo di oggetto.

time

[in] Coordinate temporali del punto di ancoraggio selezionato.

price

[in] Prezzo coordinate del punto di ancoraggio selezionato.

Valore restituito

La funzione restituisce true se il comando è stato aggiunto con successo alla coda del chart specificato, altrimenti false.

Note

Una chiamata asincrona viene sempre utilizzata per ObjectMove(), che è ciò per cui la funzione restituisce solo i risultati di aggiunta comando ad una coda(queue) chart. In questo caso, true significa solo che il comando è stato accodato correttamente, ma il risultato della sua esecuzione non è noto.

Per verificare il risultato di esecuzione del comando, è possibile utilizzare una funzione che richiede le proprietà dell'oggetto, ad esempio ObjectGetXXX. Tuttavia, dovresti tenere presente che tali funzioni vengono aggiunte alla fine della coda di quel grafico ed aspettano il risultato dell'esecuzione (dovuto alla chiamata sincrona) e quindi possono richiedere molto tempo. Questa funzione deve essere presa in considerazione quando si lavora con un gran numero di oggetti su un chart.

 

Esempio:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME_ASK     "TestObjectMoveAsk"  // nome dell'oggetto grafico per il prezzo Ask
#define   OBJ_NAME_BID     "TestObjectMoveBid"  // nome dell'oggetto grafico per il prezzo Bid
#define   COUNT            100000000            // numero di tick per caricare la cronologia
#define   DELAY            1                    // ritardo tra i tick in ms
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- ID grafico corrente, simbolo del grafico e Cifre del simbolo
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- creare due etichette di prezzo per visualizzare il prezzo Ask e il prezzo Bid sul grafico
   if(!CreatePriceLabel(chart_idtrue) || !CreatePriceLabel(chart_idfalse))
      return;
   
//--- array per la ricezione dei tick
   MqlTick ticks[]={};
   
//--- ottenere il numero della barra visibile successiva sul grafico e l'ora di apertura di questa barra in millisecondi
   int   first= (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR)-1;
   ulong from = GetTime(symbolPERIOD_CURRENTfirst)*1000;
   
//--- caricare la cronologia dei tick nell'array
   Print("Started collecting ticks...");
   if(!GetTicksToArray(symbolticks))
      return;
      
//--- Azzerare l'array dei tick e ottenere i tick dall'intervallo visibile di barre sul grafico
   ZeroMemory(ticks);
   if(CopyTicksRange(symbolticksCOPY_TICKS_INFOfrom)<1)
     {
      PrintFormat("CopyTicksRange() from date %s failed. 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;                  // numero di tick elaborati
   int changes=0;                // numero di variazioni di prezzo elaborati
   int total=(int)ticks.Size();  // tick array size
   
//--- in un ciclo attraverso l'array dei tick
   for(int i=0i<total && !IsStopped(); i++)
     {
      //--- ottieni un tick dall'array e incrementa il contatore dei tick
      MqlTick  tick=ticks[i];
      count++;
      
      //--- seleziona i flag Ask e 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;
      
      //--- se il prezzo Ask cambia
      if(ask_tick)
        {
         if(Move(chart_idOBJ_NAME_ASKtick.timetick.ask))
           {
            changes++;
            done=true;
           }
        }
      //--- se il prezzo Bid cambia
      if(bid_tick)
        {
         if(Move(chart_idOBJ_NAME_BIDtick.timetick.bid))
           {
            changes++;
            done=true;
           }
        }
      //--- se uno (o entrambi) gli oggetti grafici sono stati spostati, aggiornare il grafico
      if(done)
        {
         ChartRedraw(chart_id);
         Sleep(DELAY);
        }
     }
   
//--- alla fine del ciclo, riporteremo nel journal il numero di tick elaborati,
//--- attendere un paio di secondi, eliminare gli oggetti creati e ridisegnare il grafico
   PrintFormat("Total ticks completed: %u, Total price changes: %d"countchanges);
   Sleep(2000);
   if(ObjectsDeleteAll(chart_id"TestObjectMove")>0)
      ChartRedraw(chart_id);
   /*
   come risultato dell'esecuzione dello script, il movimento dei prezzi Ask e Bid verrà visualizzato sul grafico visibile,
   partendo dal bordo sinistro del grafico e fino alla fine dei dati storici,
   nel journal verranno visualizzati i seguenti dati:
   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
   */
  }
//+------------------------------------------------------------------+
//| Creare un oggetto "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() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   return(ObjectSetInteger(chart_idobj_nameOBJPROP_COLOR, (obj_ask ? clrRed : clrBlue)));
  }
//+-------------------------------------------------------------------------------------------+
//| Sposta l'oggetto grafico nelle coordinate prezzo/tempo specificate|
//+-------------------------------------------------------------------------------------------+
bool Move(const long chart_idconst string obj_nameconst datetime timeconst double price)
  {
   ResetLastError();
   if(!ObjectSetInteger(chart_idobj_nameOBJPROP_TIMEtime))
     {
      PrintFormat("%s: ObjectSetInteger() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   if(!ObjectSetDouble(chart_idobj_nameOBJPROP_PRICEprice))
     {
      PrintFormat("%s: ObjectSetDouble() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Carica i tick nell'array                                         |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbolMqlTick &array[])
  {
   int  attempts=0;     // contatore dei tentativi di ottenere la cronologia dei tick
   bool success =false// flag di copia riuscita dei tick
   
//--- fare 3 tentativi per ricevere i tick
   while(attempts<3
     {
      //--- rilevare l'ora di inizio prima di ricevere i tick 
      uint start=GetTickCount();
      
      //--- richiedere la cronologia dei tick dal 1970.01.01 00:00.001 (parametro da=1 ms) 
      ResetLastError();
      int received=CopyTicks(symbolarrayCOPY_TICKS_ALL1COUNT); 
      if(received!=-1
        { 
         //--- visualizzare i dati sul numero di tick e sul tempo trascorso 
         PrintFormat("%s: received %d ticks in %d ms"symbolreceivedGetTickCount()-start); 
         //--- se la cronologia dei tick è sincronizzata, il codice di errore è uguale a zero 
         if(GetLastError()==0
           { 
            success=true
            break
           } 
         else 
            PrintFormat("%s: %s ticks are not synchronized yet, %d ticks received for %d ms. Error=%d"
            __FUNCTION__symbolreceivedGetTickCount()-startGetLastError()); 
        } 
      //--- conteggio dei tentativi 
      attempts++; 
      //--- una pausa di un secondo per attendere la fine della sincronizzazione del database dei tick
      Sleep(1000); 
     } 
//--- la ricezione dei tick richiesti dall'inizio della cronologia dei tick non è riuscita in tre tentativi  
   if(!success
     { 
      PrintFormat("Error! Failed to get ticks for symbol %s after three attempts"symbol); 
      return(false); 
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Restituire l'ora tramite l'indice della barra                    |
//+------------------------------------------------------------------+
datetime GetTime(const string symbolconst ENUM_TIMEFRAMES timeframeconst int index)
  {
   datetime array[1]={};
   ResetLastError();
   if(CopyTime(symboltimeframeindex1array)!=1)
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__GetLastError());
   return(array[0]);
  }