ObjectMove

Change les coordonnées du point d'ancrage indiqué de l'objet.

bool  ObjectMove(
   long      chart_id,        // identificateur du graphique
   string    name,            // nom de l'objet
   int       point_index,     // numéro du point d'ancrage
   datetime  time,            // temps
   double    price            // prix
   );

Paramètres

chart_id

[in]  L'identificateur du graphique. 0 signifie le graphique courant.

name

[in]  Le nom de l'objet.

point_index

[in]  Le numéro du point d'ancrage. Le nombre de points d'ancrage dépend du type de l'objet.

time

[in] La coordonnée temporaire du point d'ancrage indiqué.

price

[in]  La coordonnée de prix du point d'ancrage indiqué.

Valeur de Retour

La fonction retourne true si la commande a été ajoutée avec succès dans la queue du graphique spécifié, ou sinon false.

Note

Un appel asynchrone est toujours effectué pour ObjectMove(), c'est pourquoi la fonction ne retourne que le résultat de l'ajout de la commande dans la queue du graphique. Dans ce cas, true signifie que la commande a été placée dans queue avec succès, mais le rsultat de son exécution est inconnu.

Pour vérifier le résultat de l'exécution de la commande, vous pouvez utiliser une fonction demandant les propriétés de l'objet, telle que ObjectGetXXX. Vous devriez cependant conserver à l'esprit que ce genre de fonctions sont ajoutées à la fin de la queue de ce graphique, et qu'elles attendent le résultat de l'exécution (en raison de l'appel synchrone), et peuvent donc être consommatrices en terme de temps. Cette caractéristique doit être prise en compte lors de l'utilisation d'un grand nombre d'objets sur un graphique.

 

Exemple :

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME_ASK     "TestObjectMoveAsk"  // nom de l'objet graphique pour le prix Ask (Demande)
#define   OBJ_NAME_BID     "TestObjectMoveBid"  // nom de l'objet graphique pour le prix Bid (Offre)
#define   COUNT            100000000            // nombre de ticks à charger depuis l'historique
#define   DELAY            1                    // délai entre les ticks en ms
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- id du graphique actuel, le symbole du graphique et les décimales du symbole
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- crée deux étiquettes de prix pour afficher le prix de vente et le prix d'achat sur le graphique
   if(!CreatePriceLabel(chart_idtrue) || !CreatePriceLabel(chart_idfalse))
      return;
   
//--- tableau pour recevoir les ticks
   MqlTick ticks[]={};
   
//--- récupère le numéro de la prochaine barre visible sur le graphique et l'heure d'ouverture de cette barre en millisecondes
   int   first= (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR)-1;
   ulong from = GetTime(symbolPERIOD_CURRENTfirst)*1000;
   
//--- charge l'historique des ticks dans le tableau
   Print("Started collecting ticks...");
   if(!GetTicksToArray(symbolticks))
      return;
      
//--- réinitialise le tableau des ticks et récupère les ticks de la plage de barres visibles sur le graphique
   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;                  // nombre de ticks traités
   int changes=0;                // nombre de changements de prix effectués
   int total=(int)ticks.Size();  // taille du tableau de ticks
   
//--- en boucle sur le tableau de ticks
   for(int i=0i<total && !IsStopped(); i++)
     {
      //--- prends un tick du tableau et incrémente le compteur de ticks
      MqlTick  tick=ticks[i];
      count++;
      
      //--- vérifie les flags des prix Ask et 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;
      
      //--- si le prix de la demande (Ask) change
      if(ask_tick)
        {
         if(Move(chart_idOBJ_NAME_ASKtick.timetick.ask))
           {
            changes++;
            done=true;
           }
        }
      //--- si le prix de l'offre (Bid) change
      if(bid_tick)
        {
         if(Move(chart_idOBJ_NAME_BIDtick.timetick.bid))
           {
            changes++;
            done=true;
           }
        }
      //--- si l'un (ou les deux) des objets graphiques a été déplacé, met à jour le graphique
      if(done)
        {
         ChartRedraw(chart_id);
         Sleep(DELAY);
        }
     }
   
//--- à la fin de la boucle, nous écrirons dans le journal le nombre de ticks traités.,
//--- attends 2 secondes, supprime les objets créés et redessine le graphique
   PrintFormat("Total ticks completed: %u, Total price changes: %d"countchanges);
   Sleep(2000);
   if(ObjectsDeleteAll(chart_id"TestObjectMove")>0)
      ChartRedraw(chart_id);
   /*
   à la suite de l'exécution du script, les mouvements des prix Ask et Bid seront affichés sur le graphique visible,
   en partant du bord gauche du graphique et jusqu'à la fin des données historiques,
   les données suivantes seront écrites dans le journal :
   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
   */
  }
//+------------------------------------------------------------------+
//| Crée un objet "Etiquette de prix"                                |
//+------------------------------------------------------------------+
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)));
  }
//+------------------------------------------------------------------+
//| Déplace l'objet graphique aux coordonnées prix/heure spécifiées  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Charge les ticks dans le tableau                                 |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbolMqlTick &array[])
  {
   int  attempts=0;     // compteur des tentatives d'obtention de l'historique des ticks
   bool success =false// flag de copie réussie des ticks
   
//--- effectue 3 tentatives pour recevoir les ticks
   while(attempts<3
     {
      //--- mesure l'heure de départ avant de recevoir les ticks 
      uint start=GetTickCount();
      
      //--- demande l'historique des ticks depuis le 01/01/1970 00:00.001 (paramètre from=1 ms) 
      ResetLastError();
      int received=CopyTicks(symbolarrayCOPY_TICKS_ALL1COUNT); 
      if(received!=-1
        { 
         //--- afffiche le nombre de ticks et le temps passé
         PrintFormat("%s: received %d ticks in %d ms"symbolreceivedGetTickCount()-start); 
         //--- si l'historique des ticks est synchronisé, le code d'erreur est égal à 0
         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()); 
        } 
      //--- comptage des tentatives
      attempts++; 
      //--- une pause d'1 seconde pour attendre la fin de la synchronisation de la base de données des ticks
      Sleep(1000); 
     } 
//--- la réception des ticks demandés depuis le début de l'historique des ticks a échoué en trois tentatives.  
   if(!success
     { 
      PrintFormat("Error! Failed to get ticks for symbol %s after three attempts"symbol); 
      return(false); 
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Renvoie l'heure de la barre à l'index                           |
//+------------------------------------------------------------------+
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]);
  }