ObjectMove

A função altera as coordenadas do ponto de ancoragem do objeto específico.

bool  ObjectMove(
   long      chart_id,        // identificador gráfico
   string    name,            // nome objeto
   int       point_index,     // número ponto ancoragem
   datetime  time,            // Tempo
   double    price            // Preço
   );

Parâmetros

chart_id

[in]  Identificador do gráfico. Significa o gráfico atual.

nome

[in]  Nome do objeto.

point_index

[in]  Índice do ponto de ancoragem. O número de pontos de ancoragem depende do tipo de objeto.

time

[in]  Coordenada de tempo do ponto de ancoragem selecionado.

price

[in]  Coordenada de preço do ponto de ancoragem selecionado.

Valor do Retorno

Retorna true, se a colocação do comando na fila do gráfico especificado for bem-sucedida, caso contrário, false.

Observação

Ao chamar ObjectMove(), sempre é usada uma chamada assíncrona, portanto a função retorna apenas o resultado da colocação do comando na fila do gráfico. Neste caso, true indica apenas que o comando está na fila com sucesso; e em si o resultado de sua execução não é conhecido.

Para verificar o resultado da execução, pode-se usar a função que solicita as propriedades do objeto, por exemplo, do tipo ObjectGetXXX. Mas, ao fazer isto, deve-se ter em mente que estas funções são colocadas na fila de espera dos comandos do gráfico e são esperados os resultados da execução (uma vez que são chamadas síncronas), isso quer dizer que não podem consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande número de objetos no gráfico.

 

Exemplo:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME_ASK     "TestObjectMoveAsk"  // nome do objeto gráfico para o preço Ask
#define   OBJ_NAME_BID     "TestObjectMoveBid"  // nome do objeto gráfico para o preço Bid
#define   COUNT            100000000            // quantidade de ticks para carregar o histórico
#define   DELAY            1                    // atraso entre ticks em ms
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- identificador do gráfico atual, símbolo desse gráfico e Digits do símbolo
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- criamos duas marcações de preço para exibir o preço Ask e o preço Bid no gráfico
   if(!CreatePriceLabel(chart_idtrue) || !CreatePriceLabel(chart_idfalse))
      return;
   
//--- array para receber os ticks
   MqlTick ticks[]={};
   
//--- obtemos o número da barra seguinte à primeira barra visível no gráfico e o tempo de abertura dessa barra em milissegundos
   int   first= (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR)-1;
   ulong from = GetTime(symbolPERIOD_CURRENTfirst)*1000;
   
//--- carregamos no array o histórico de ticks
   Print("Started collecting ticks...");
   if(!GetTicksToArray(symbolticks))
      return;
      
//--- zeramos o array de ticks e obtemos os ticks do intervalo visível de bars no gráfico
   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;                  // quantidade de ticks processados
   int changes=0;                // quantidade de alterações de preço processadas
   int total=(int)ticks.Size();  // tamanho do array de ticks
   
//--- em laço pelo array de ticks
   for(int i=0i<total && !IsStopped(); i++)
     {
      //--- obtemos um tick do array e incrementamos o contador de ticks
      MqlTick  tick=ticks[i];
      count++;
      
      //--- verificamos as flags Ask e Bid do tick
      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 houver alteração do preço Ask
      if(ask_tick)
        {
         if(Move(chart_idOBJ_NAME_ASKtick.timetick.ask))
           {
            changes++;
            done=true;
           }
        }
      //--- se houver alteração do preço Bid
      if(bid_tick)
        {
         if(Move(chart_idOBJ_NAME_BIDtick.timetick.bid))
           {
            changes++;
            done=true;
           }
        }
      //--- se qualquer um dos objetos gráficos for movido (ou ambos), atualizamos o gráfico
      if(done)
        {
         ChartRedraw(chart_id);
         Sleep(DELAY);
        }
     }
   
//--- ao final do laço informamos no log a quantidade de ticks processados,
//--- aguardamos alguns segundos, removemos os objetos criados e redesenhamos o gráfico
   PrintFormat("Total ticks completed: %u, Total price changes: %d"countchanges);
   Sleep(2000);
   if(ObjectsDeleteAll(chart_id"TestObjectMove")>0)
      ChartRedraw(chart_id);
   /*
   como resultado da execução do script no gráfico visível será exibido o movimento dos preços Ask e Bid,
   começando a partir da borda esquerda do gráfico e até o fim dos dados históricos,
   será exibida no log a informação:
   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
   */
  }
//+------------------------------------------------------------------+
//| Cria o objeto "Marca de Preço"                                   |
//+------------------------------------------------------------------+
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)));
  }
//+------------------------------------------------------------------+
//| Move o objeto gráfico para as coordenadas preço/tempo indicadas  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Carrega ticks no array                                           |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbolMqlTick &array[])
  {
   int  attempts=0;     // contador de tentativas de obtenção do histórico de ticks
   bool success =false// flag de execução bem-sucedida da cópia de ticks 
   
//--- fazemos 3 tentativas de obter ticks
   while(attempts<3
     {
 //--- medimos o tempo de início antes de obter ticks
      uint start=GetTickCount();
      
 //--- solicitamos a histórico de ticks desde 1970.01.01 00:00.001 (parâmetro from=1 ms)
      ResetLastError();
      int received=CopyTicks(symbolarrayCOPY_TICKS_ALL1COUNT); 
      if(received!=-1
        { 
         //--- exibimos informação sobre a quantidade de ticks e o tempo gasto 
         PrintFormat("%s: received %d ticks in %d ms"symbolreceivedGetTickCount()-start); 
         //--- se o histórico de ticks estiver sincronizado, então o código de erro é 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()); 
        } 
 //--- contamos as tentativas
      attempts++; 
 //--- pausa de 1 segundo aguardando a conclusão da sincronização da base de ticks
      Sleep(1000); 
     } 
//--- não foi possível obter os ticks solicitados desde o início do histórico após três tentativas  
   if(!success
     { 
      PrintFormat("Error! Failed to get ticks for symbol %s after three attempts"symbol); 
      return(false); 
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Retorna o tempo pelo índice da 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]);
  }