CustomRatesReplace

Sustituye totalmente la historia de precios del instrumento personalizado en el intervalo temporal indicado, con los datos de la matriz MqlRates.

int  CustomRatesReplace(
   const string     symbol,             // nombre del símbolo
   datetime         from,               // desde qué fecha
   datetime         to,                 // hasta qué fecha
   const MqlRates&  rates[],            // matriz con los datos que necesitamos aplicar al instrumento personalizado
   uint             count=WHOLE_ARRAY   // número de elementos que se usarán de la matriz rates[]
   );

Parámetros

symbol

[in]  Nombre del instrumento personalizado.

from

[in]  Hora de la primera barra en la historia de precios del diapasón indicado, que debe ser actualizada.

to

[in]  Hora de la última barra en la historia de precios del diapasón indicado, que debe ser actualizada.

rates[]

[in]   Matriz de datos históricos del tipo MqlRates para el marco temporal M1.

count=WHOLE_ARRAY

[in]  Número de elementos de la matriz rates[] que se usarán para la sustitución. El valor WHOLE_ARRAY indica que para la sustitución se debe usar todos los elementos de la matriz rates[].

Valor devuelto

Número de barras actualizadas o bien -1 en caso de error.

Nota

Si una barra de la matriz rates[] se sale de los límites del diapasón, entonces será ignorada. Si ya disponemos de esa barra en la historia de precios y entra en el diapasón indicado, entonces será sustituida. El resto de las barras en la historia de precios actual fuera de los límites del diapasón indicado permanecerá sin cambios. Los datos en la matriz rates[] deberán ser correctos en cuanto a los precios OHLC, y la hora de apertura de las barras deberá corresponderse con el marco temporal M1.

 

Ejemplo:

//+------------------------------------------------------------------+
//|                                           CustomRatesReplace.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   CUSTOM_SYMBOL_NAME     Symbol()+".C"     // nombre del símbolo personalizado
#define   CUSTOM_SYMBOL_PATH     "Forex"           // nombre del grupo en el que se creará el símbolo
#define   CUSTOM_SYMBOL_ORIGIN   Symbol()          // nombre del símbolo a partir del cual se creará el símbolo personalizado
 
#define   DATARATES_COUNT        4                 // número de barras a mostrar en el registro
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- obtenemos el código de error al crear un símbolo personalizado
   int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_PATHCUSTOM_SYMBOL_ORIGIN);
   
//--- si el código de error no es 0 (el símbolo se ha creado con éxito) y no es 5304 (símbolo ya creado), salimos.
   if(create!=0 && create!=5304)
      return;
 
//--- obtenemos el número de barras del símbolo estándar
   int bars=Bars(CUSTOM_SYMBOL_ORIGINPERIOD_M1);
      
//--- obtenemos la matriz MqlRates los datos de todas las barras del marco temporal de minutos de un símbolo estándar
   MqlRates rates[]={};
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_ORIGINPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_ORIGINbarsGetLastError());
      return;
     }
 
//--- establecemos los datos copiados en la historia de minutos del símbolo personalizado
   ResetLastError();
   if(CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates)<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
     
//--- después de actualizar los datos históricos obtenemos el número de barras del símbolo personalizado
   bars=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   
//--- obtenemos en la matriz MqlRates los datos de todas las barras del marco temporal de minutos del símbolo personalizado
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_NAMEPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbarsGetLastError());
      return;
     }
 
//--- imprimimos las últimas barras DATARATES_COUNT de la historia de minutos del símbolo personalizado en el registro
   int digits=(int)SymbolInfoInteger(CUSTOM_SYMBOL_NAMESYMBOL_DIGITS);
   PrintFormat("Last %d bars of the custom symbol's minute history:"DATARATES_COUNT);
   ArrayPrint(ratesdigitsNULLbars-DATARATES_COUNTDATARATES_COUNT);
   
//--- cambiamos las dos penúltimas barras de datos de la historia de minutos del símbolo personalizado
   datetime time_fromrates[bars-3].time;
   datetime time_to  = rates[bars-2].time;
   
//--- en la matriz rates hacemos que todos los precios de las dos barras precedentes sean iguales a los precios de apertura de estas barras
   rates[bars-3].high=rates[bars-3].open;
   rates[bars-3].low=rates[bars-3].open;
   rates[bars-3].close=rates[bars-3].open;
   
   rates[bars-2].high=rates[bars-2].open;
   rates[bars-2].low=rates[bars-2].open;
   rates[bars-2].close=rates[bars-2].open;
   
//--- sustituimos las barras existentes por los datos de la matriz modificada rates
   ResetLastError();
   int replaced=CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates);
   if(replaced<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
     
//--- después de cambiar dos barras de datos históricos, obtendremos de nuevo el número de barras del símbolo personalizado
   bars=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   
//--- obtenemos nuevamente los datos de todas las barras del marco temporal de minutos del símbolo personalizado
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_NAMEPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbarsGetLastError());
      return;
     }
 
//--- imprimimos las últimas barras DATARATES_COUNT de la historia de minutos actualizada del símbolo personalizado en el registro
   PrintFormat("\nLast %d bars after applying CustomRatesUpdate() with %d replaced bars:"DATARATES_COUNTreplaced);
   ArrayPrint(ratesdigitsNULLbars-DATARATES_COUNTDATARATES_COUNT);
     
//--- mostramos en el gráfico en el comentario la pista sobre las teclas de finalización del script
   Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit"CUSTOM_SYMBOL_NAME));
//--- en un ciclo infinito esperamos que Esc o Del para la salida
   while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0)
     {
      Sleep(16);
      //--- al presionar Supr, eliminamos el símbolo personalizado creado y sus datos
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
        {
         //--- eliminamos los datos de las barras
         int deleted=CustomRatesDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history bars of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- eliminamos los datos de ticks
         deleted=CustomTicksDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history ticks of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- eliminamos el símbolo
         if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME))
            PrintFormat("Custom symbol '%s' deleted successfully"CUSTOM_SYMBOL_NAME);
         break;
        }
     }
//--- antes de la salida, limpiamos el gráfico
   Comment("");
   /*
   resultado:
   Last 4 bars of the custom symbol's minute history:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [0] 2024.07.29 13:37:00 1.08394 1.08396 1.08388 1.08390            16        1             0
   [1] 2024.07.29 13:38:00 1.08389 1.08400 1.08389 1.08398            35        1             0
   [2] 2024.07.29 13:39:00 1.08398 1.08410 1.08394 1.08410            29        1             0
   [3] 2024.07.29 13:40:00 1.08409 1.08414 1.08408 1.08414            14        1             0
   
   Last 4 bars after applying CustomRatesUpdate() with 250820 replaced bars:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [0] 2024.07.29 13:37:00 1.08394 1.08396 1.08388 1.08390            16        1             0
   [1] 2024.07.29 13:38:00 1.08389 1.08389 1.08389 1.08389            35        1             0
   [2] 2024.07.29 13:39:00 1.08398 1.08398 1.08398 1.08398            29        1             0
   [3] 2024.07.29 13:40:00 1.08409 1.08414 1.08408 1.08414            14        1             0
   */
  }
//+------------------------------------------------------------------+
//| Crea un símbolo personalizado, devuelve el código de error       |
//+------------------------------------------------------------------+
int CreateCustomSymbol(const string symbol_nameconst string symbol_pathconst string symbol_origin=NULL)
  {
//--- determinamos el nombre del símbolo a partir del cual se creará uno personalizado
   string origin=(symbol_origin==NULL ? Symbol() : symbol_origin);
   
//--- si no hemos podido crear el símbolo personalizado, y no se trata de un error 5304, informaremos sobre ello en el registro
   ResetLastError();
   int error=0;
   if(!CustomSymbolCreate(symbol_namesymbol_pathorigin))
     {
      error=GetLastError();
      if(error!=5304)
         PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d"symbol_namesymbol_pathoriginerror);
     }
//--- con éxito
   return(error);
  }
//+------------------------------------------------------------------+
//| Elimina el símbolo personalizado                                |
//+------------------------------------------------------------------+
bool DeleteCustomSymbol(const string symbol_name)
  {
//--- ocultamos el símbolo de la ventana de Observación de mercado
   ResetLastError();
   if(!SymbolSelect(symbol_namefalse))
     {
      PrintFormat("SymbolSelect(%s, false) failed. Error %d"GetLastError());
      return(false);
     }
      
//--- si no se ha podido eliminar el símbolo personalizado, informaremos de ello en el registro y retornaremos false
   ResetLastError();
   if(!CustomSymbolDelete(symbol_name))
     {
      PrintFormat("CustomSymbolDelete(%s) failed. Error %d"symbol_nameGetLastError());
      return(false);
     }
//--- con éxito
   return(true);
  }

 

Vea también

CustomRatesDelete, CustomRatesUpdate, CopyRates