CustomRatesReplace

Remplace toutes les barres de l'historique des prix du symbole personnalisé dans l'intervalle de temps spécifié avec les données du tableau de données de type MqlRates.

int  CustomRatesReplace(
   const string     symbol,             // nom du symbole
   datetime         from,               // date de début
   datetime         to,                 // date de fin
   const MqlRates&  rates[],            // tableau pour les données à appliquer à un symbole personnalisé
   uint             count=WHOLE_ARRAY   // nombre d'éléments du tableau rates[] à utiliser
   );

Paramètres

symbol

[in]  Nom du symbole personnalisé.

from

[in]  Date/heure de la première barre à mettre à jour de l'historique des prix dans l'intervalle spécifié.

to

[in]  Date/heure de la dernière barre à mettre à jour de l'historique des prix dans l'intervalle spécifié.

rates[]

[in]   Tableau de données d'historique de type MqlRates pour M1.

count=WHOLE_ARRAY

[in]  Nombre d'éléments du tableau rates[] à utiliser pour le remplacement. WHOLE_ARRAY signifie que tous les éléments du tableau rates[] doivent être utilisés pour le remplacement.

Valeur de Retour

Nombre de barres mises à jour ou -1 en cas d'erreur.

Note

Si une barre du tableau rates[] va au-delà de l'intervalle spécifié, elle est ignorée. Si une barre est déjà présente dans l'historique des prix et entre dans l'intervalle donné, elle est remplacée. Toutes les autres barres de l'historique des prix actuel situées en dehors de l'intervalle spécifié restent inchangées. Le tableau de données rates[] doit être correct au regard des prix OHLC, et les heures d'ouverture des barres doivent correspondre à la période M1.

 

Exemple :

//+------------------------------------------------------------------+
//|                                           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"     // nom du symbole personnalisé
#define   CUSTOM_SYMBOL_PATH     "Forex"           // nom du groupe dans lequel le symbole sera créé
#define   CUSTOM_SYMBOL_ORIGIN   Symbol()          // nom d'un symbole sur lequel le symbole personnalisé sera construit
 
#define   DATARATES_COUNT        4                 // le nombre de barres envoyées au journal
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- obtient le code d'erreur lors de la création d'un symbole personnalisé
   int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_PATHCUSTOM_SYMBOL_ORIGIN);
   
//--- si le code d'erreur est différent de 0 (symbole créé avec succès) et pas 5304 (le symbole a déjà été créé) - on sort
   if(create!=0 && create!=5304)
      return;
 
//--- obtient le nombre de barres d'un symbole standard
   int bars=Bars(CUSTOM_SYMBOL_ORIGINPERIOD_M1);
      
//--- obtient les données de toutes les barres en 1 minute du symbole standard, dans le tableau de MqlRates array
   MqlRates rates[]={};
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_ORIGINPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_ORIGINbarsGetLastError());
      return;
     }
 
//--- mets les données copiées dans l'historique 1 minute du symbole personnalisé
   ResetLastError();
   if(CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates)<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
     
//--- après avoir mis à jour l'historique, récupère le nombre de barres du symbole personnalisé
   bars=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   
//--- récupère les données de toutes les barres de la période 1 minute du symbole personnalisé dans le tableau de MqlRates
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_NAMEPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbarsGetLastError());
      return;
     }
 
//--- affiche les dernières DATARATES_COUNT barres de l'historique 1 minute du symbole personnalisé dans le journal
   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);
   
//--- change les données des 2 dernières barres de l'historique 1 minute du symbole personnalisé
   datetime time_fromrates[bars-3].time;
   datetime time_to  = rates[bars-2].time;
   
//--- mets tous les prix des 2 dernières barres aux prix d'ouverture de ces barres dans le tableau 'rates'
   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;
   
//--- remplace les barres existantes avec les données modifiées du tableau 'rates'
   ResetLastError();
   int replaced=CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates);
   if(replaced<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
     
//--- après avoir changé les 2 barres de l'historique, récupère à nouveau le nombre de barres du symbole personalisé
   bars=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   
//--- récupère à nouveau les données de toutes les barres de la période 1 minute
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_NAMEPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbarsGetLastError());
      return;
     }
 
//--- affiche les dernières DATARATES_COUNT barres de l'historique à la minute du symbole personnalisé mis à jour dans le journal
   PrintFormat("\nLast %d bars after applying CustomRatesUpdate() with %d replaced bars:"DATARATES_COUNTreplaced);
   ArrayPrint(ratesdigitsNULLbars-DATARATES_COUNTDATARATES_COUNT);
     
//--- affiche une infobulle sur les touches de fin de script dans le commentaire du graphique
   Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit"CUSTOM_SYMBOL_NAME));
//--- attend que la touche Echap ou Suppr soit appuyée pour sortir de la boucle sans fin
   while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0)
     {
      Sleep(16);
      //--- si on appuie sur la touche Suppr, efface le symbole personnalisé créé et ses données
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
        {
         //--- efface les données de la barre
         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);
         
         //--- efface les données du tick
         deleted=CustomTicksDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history ticks of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- supprime le symbole
         if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME))
            PrintFormat("Custom symbol '%s' deleted successfully"CUSTOM_SYMBOL_NAME);
         break;
        }
     }
//--- efface le graphique avant de sortir
   Comment("");
   /*
   résultat :
   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
   */
  }
//+------------------------------------------------------------------+
//| Crée un symbole personnalisé, retourne un code d'erreur          |
//+------------------------------------------------------------------+
int CreateCustomSymbol(const string symbol_nameconst string symbol_pathconst string symbol_origin=NULL)
  {
//--- définit le nom du symbole à partir duquel le symbole personnalisé sera construit
   string origin=(symbol_origin==NULL ? Symbol() : symbol_origin);
   
//--- si le symbole personnalisé n'a pas pu être créé et que le code de l'erreur n'est pas 5304, rapporte cette erreur dans le journal
   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);
     }
//--- succès
   return(error);
  }
//+------------------------------------------------------------------+
//| Supprime un symbole personnalisé                                 |
//+------------------------------------------------------------------+
bool DeleteCustomSymbol(const string symbol_name)
  {
//--- cache le symbole de la fenêtre du Market Watch
   ResetLastError();
   if(!SymbolSelect(symbol_namefalse))
     {
      PrintFormat("SymbolSelect(%s, false) failed. Error %d"GetLastError());
      return(false);
     }
      
//--- en cas d'échec de la suppression du symbole personnalisé, rapporte cette erreur dans le journal et retourne 'false'
   ResetLastError();
   if(!CustomSymbolDelete(symbol_name))
     {
      PrintFormat("CustomSymbolDelete(%s) failed. Error %d"symbol_nameGetLastError());
      return(false);
     }
//--- succès
   return(true);
  }

 

Voir aussi

CustomRatesDelete, CustomRatesUpdate, CopyRates