CustomRatesUpdate

Ajoute des barres manquantes dans l'historique du symbole personnalisé et remplace les données existantes avec celles du tableau de données de type MqlRates.

int  CustomRatesUpdate(
   const string     symbol,             // Nom du symbole personnalisé
   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é.

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 la mise à jour. WHOLE_ARRAY signifie que tous les éléments du tableau rates[] doivent être utilisés pour la mise à jour.

Valeur de Retour

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

Note

S'il n'y a aucune barre du tableau rates[] dans l'historique du symbole personnalisé actuel, il est ajouté.  Si une barre existe déjà, elle est remplacée. Toutes les autres barres de l'historique des prix actuel 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 :

//+------------------------------------------------------------------+
//|                                            CustomRatesUpdate.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;
 
//--- récupère et affiche dans le journal le nombre de barres du symbol standard
   int bars_origin=Bars(CUSTOM_SYMBOL_ORIGINPERIOD_M1);
   PrintFormat("The symbol '%s' from which the custom '%s' was created has %d bars of minute history."CUSTOM_SYMBOL_ORIGINCUSTOM_SYMBOL_NAMEbars_origin);
      
//--- récupère et affiche dans le journal le nombre de barres du symbole personnalisé
   int bars_custom=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   PrintFormat("Custom symbol '%s' created from symbol '%s' has %d bars of minute history"CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_ORIGINbars_custom);
      
//--- 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_M10bars_originrates)!=bars_origin)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_ORIGINbars_originGetLastError());
      return;
     }
 
//--- mets les données copiées dans l'historique 1 minute du symbole personnalisé
   ResetLastError();
   int updated=CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates);
   if(updated<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
 
//--- récupère et affiche dans le journal le nombre de barres du symbole personnalisé après l'ajout de l'historique
   bars_custom=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   PrintFormat("\nAfter CustomRatesUpdate(), the custom symbol '%s' has %d bars of minute history"CUSTOM_SYMBOL_NAMEbars_custom);
 
//--- 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_M10bars_customrates)!=bars_custom)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbars_customGetLastError());
      return;
     }
 
//--- affiche dans le journal les 4 dernières barres de l'historique 1 minute du symbole personnalisé
   int digits=(int)SymbolInfoInteger(CUSTOM_SYMBOL_NAMESYMBOL_DIGITS);
   PrintFormat("Last %d bars of the custom symbol's minute history:"DATARATES_COUNT);
   ArrayPrint(ratesdigitsNULLbars_custom-DATARATES_COUNTDATARATES_COUNT);
   
//--- remplace les données du tableau MqlRates avec celles calculées par l'équation 1.0 / NomDuSymbole
   for(int i=0i<bars_customi++)
     {
      rates[i].open  =(rates[i].open !=0  ? 1.0 / rates[i].open  : rates[i].open);
      rates[i].high  =(rates[i].high !=0  ? 1.0 / rates[i].high  : rates[i].high);
      rates[i].low   =(rates[i].low  !=0  ? 1.0 / rates[i].low   : rates[i].low);
      rates[i].close =(rates[i].close!=0  ? 1.0 / rates[i].close : rates[i].close);
     }
 
//--- mets les données modifiées dans l'historique 1 minute du symbole personnalisé
   ResetLastError();
   updated=CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates);
   if(updated<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
 
//--- récupère à nouveau 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_M10bars_customrates)!=bars_custom)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbars_customGetLastError());
      return;
     }
 
//--- affiche les 4 dernières barres de l'historique 1 minute du symbole personnalisé dans le journal
   Print("\nLast %d bars after changing the custom symbol calculation formula:"DATARATES_COUNT);
   ArrayPrint(ratesdigitsNULLbars_custom-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 :
   The symbol 'EURUSDfrom which the custom 'EURUSD.Cwas created has 250488 bars of minute history.
   Custom symbol 'EURUSD.Ccreated from symbol 'EURUSDhas 0 bars of minute history
   
   After CustomRatesUpdate(), the custom symbol 'EURUSD.Chas 250488 bars of minute history
   Last 4 bars of the custom symbol's minute history:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [02024.06.18 11:14:00 1.07235 1.07239 1.07232 1.07239            24        0             0
   [12024.06.18 11:15:00 1.07238 1.07239 1.07232 1.07235            44        0             0
   [22024.06.18 11:16:00 1.07234 1.07238 1.07227 1.07234            37        0             0
   [32024.06.18 11:17:00 1.07234 1.07234 1.07217 1.07225            41        0             0
   
   Last 4 bars after changing the custom symbol calculation formula:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [02024.06.18 11:14:00 0.93253 0.93250 0.93256 0.93250            24        0             0
   [12024.06.18 11:15:00 0.93251 0.93250 0.93256 0.93253            44        0             0
   [22024.06.18 11:16:00 0.93254 0.93251 0.93260 0.93254            37        0             0
   [32024.06.18 11:17:00 0.93254 0.93254 0.93269 0.93262            41        0             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

CustomRatesReplace, CustomRatesDelete, CopyRates