| //+------------------------------------------------------------------+
//|                                        CustomSymbolSetString.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 personnalisé sera créé
 #define   CUSTOM_SYMBOL_ORIGIN   Symbol()       // nom d'un symbole qui servira de base au symbole personnalisé à créer
 
 //+------------------------------------------------------------------+
 //| 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_NAME, CUSTOM_SYMBOL_PATH, CUSTOM_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 les propriétés du symbole sur lequel le symbole personnalisé est basé
 //--- (volume minimum, volume maximum, le pas de changement du volume minimum pour l'exécution d'une transaction)
 string origin_basis    = SymbolInfoString(CUSTOM_SYMBOL_ORIGIN, SYMBOL_BASIS);
 string origin_category = SymbolInfoString(CUSTOM_SYMBOL_ORIGIN, SYMBOL_CATEGORY);
 string origin_formula  = SymbolInfoString(CUSTOM_SYMBOL_ORIGIN, SYMBOL_FORMULA);
 
 PrintFormat("The '%s' symbol from which the custom '%s' was created:\n"+
 "  Basis: %s\n  Category: %s\n  Formula: %s",
 CUSTOM_SYMBOL_ORIGIN, CUSTOM_SYMBOL_NAME,
 origin_basis, origin_category, origin_formula);
 
 //--- définit les autres valeurs pour les propriétés du symbole personnalisé
 ResetLastError();
 bool res=true;
 res &=CustomSymbolSetString(CUSTOM_SYMBOL_NAME, SYMBOL_BASIS, CUSTOM_SYMBOL_ORIGIN);
 res &=CustomSymbolSetString(CUSTOM_SYMBOL_NAME, SYMBOL_CATEGORY, "FX");
 res &=CustomSymbolSetString(CUSTOM_SYMBOL_NAME, SYMBOL_FORMULA, ("1.0 / "+CUSTOM_SYMBOL_ORIGIN));
 
 //--- s'il y a eu une erreur lors de la définition d'une des propriétés, affiche un message correspondant dans le journal
 if(!res)
 Print("CustomSymbolSetString() failed. Error ", GetLastError());
 
 //--- récupère et affiche dans le journal les propriétés modifiées du symbole personnalisé
 //--- (volume minimum, volume maximum, le pas de changement du volume minimum pour l'exécution d'une transaction)
 string custom_basis    = SymbolInfoString(CUSTOM_SYMBOL_NAME, SYMBOL_BASIS);
 string custom_category = SymbolInfoString(CUSTOM_SYMBOL_NAME, SYMBOL_CATEGORY);
 string custom_formula  = SymbolInfoString(CUSTOM_SYMBOL_NAME, SYMBOL_FORMULA);
 
 PrintFormat("Custom symbol '%s' based on '%s':\n"+
 "  Basis: %s\n  Category: %s\n  Formula: %s",
 CUSTOM_SYMBOL_ORIGIN, CUSTOM_SYMBOL_NAME,
 custom_basis, custom_category, custom_formula);
 
 //--- 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);
 //--- lors de l'appui sur la touche Suppr, le symbole personnalisé est supprimé
 if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
 {
 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 'EURUSD' symbol from which the custom 'EURUSD.C' was created:
 Basis:
 Category:
 Formula:
 Custom symbol 'EURUSD' based on 'EURUSD.C':
 Basis: EURUSD
 Category: FX
 Formula: 1.0 / EURUSD
 */
 }
 //+------------------------------------------------------------------+
 //| Crée un symbole personnalisé, retourne un code d'erreur          |
 //+------------------------------------------------------------------+
 int CreateCustomSymbol(const string symbol_name, const string symbol_path, const 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_name, symbol_path, origin))
 {
 error=GetLastError();
 if(error!=5304)
 PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d", symbol_name, symbol_path, origin, error);
 }
 //--- 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_name, false))
 {
 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_name, GetLastError());
 return(false);
 }
 //--- succès
 return(true);
 }
 |