CustomSymbolSetDouble

Sets the real type property value for a custom symbol.

bool  CustomSymbolSetDouble(
   const string              symbol_name,      // symbol name
   ENUM_SYMBOL_INFO_DOUBLE   property_id,      // property ID
   double                    property_value    // property value
   );

Parameters

symbol_name

[in]  Custom symbol name.

property_id

[in]  Symbol property ID. The value can be one of the values of the ENUM_SYMBOL_INFO_DOUBLE enumeration.

property_value

[in]  A double type variable containing the property value.

Return Value

true – success, otherwise – false. To get information about the error, call the GetLastError() function.

Note

The minute and tick history of the custom symbol is completely removed if any of these properties is changed in the symbol specification:

  • SYMBOL_POINT – one point value
  • SYMBOL_TRADE_TICK_SIZE – value of a tick that specifies the minimum allowable price change
  • SYMBOL_TRADE_TICK_VALUE – one-tick price change value for a profitable position

After deleting the custom symbol history, the terminal attempts to create a new history using the updated properties. The same happens when the custom symbol properties are changed manually.

 

Example:

//+------------------------------------------------------------------+
//|                                        CustomSymbolSetDouble.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"  // custom symbol name
#define   CUSTOM_SYMBOL_PATH     "Forex"        // name of the group, in which a symbol is to be created
#define   CUSTOM_SYMBOL_ORIGIN   Symbol()       // name of a symbol a custom one is to be based on
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- get the error code when creating a custom symbol
   int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_PATHCUSTOM_SYMBOL_ORIGIN);
   
//--- if the error code is not 0 (successful symbol creation) and not 5304 (symbol has already been created) - leave
   if(create!=0 && create!=5304)
      return;
      
//--- get and print in the journal the properties of the symbol the custom one is based on
//--- (minimum volume, maximum volume, minimum volume change step for deal execution)
   double origin_vol_min = SymbolInfoDouble(CUSTOM_SYMBOL_ORIGINSYMBOL_VOLUME_MIN);
   double origin_vol_max = SymbolInfoDouble(CUSTOM_SYMBOL_ORIGINSYMBOL_VOLUME_MAX);
   double origin_vol_stepSymbolInfoDouble(CUSTOM_SYMBOL_ORIGINSYMBOL_VOLUME_STEP);
   
   PrintFormat("The '%s' symbol from which the custom '%s' was created:\n"+
               "  Volume Min: %.2f\n  Volume Max: %.2f\n  Volume Step: %.2f",
               CUSTOM_SYMBOL_ORIGINCUSTOM_SYMBOL_NAME,
               origin_vol_minorigin_vol_maxorigin_vol_step);
   
//--- set other values for the custom symbol properties
   ResetLastError();
   bool res=true;
   res &=CustomSymbolSetDouble(CUSTOM_SYMBOL_NAMESYMBOL_VOLUME_MIN0.1);
   res &=CustomSymbolSetDouble(CUSTOM_SYMBOL_NAMESYMBOL_VOLUME_MAX1000);
   res &=CustomSymbolSetDouble(CUSTOM_SYMBOL_NAMESYMBOL_VOLUME_STEP0.1);
 
//--- if there was an error when setting any of the properties, display an appropriate message in the journal
   if(!res)
      Print("CustomSymbolSetDouble() failed. Error "GetLastError());
   
//--- get and print in the journal the modified custom symbol properties
//--- (minimum volume, maximum volume, minimum volume change step for deal execution)
   double custom_vol_min = SymbolInfoDouble(CUSTOM_SYMBOL_NAMESYMBOL_VOLUME_MIN);
   double custom_vol_max = SymbolInfoDouble(CUSTOM_SYMBOL_NAMESYMBOL_VOLUME_MAX);
   double custom_vol_stepSymbolInfoDouble(CUSTOM_SYMBOL_NAMESYMBOL_VOLUME_STEP);
   
   PrintFormat("Custom symbol '%s' based on '%s':\n"+
               "  Volume Min: %.2f\n  Volume Max: %.2f\n  Volume Step: %.2f",
               CUSTOM_SYMBOL_ORIGINCUSTOM_SYMBOL_NAME,
               custom_vol_mincustom_vol_maxcustom_vol_step);
   
//--- display a hint about the script termination keys on the chart comment
   Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit"CUSTOM_SYMBOL_NAME));
 
//--- wait for pressing the Esc or Del keys to exit in an endless loop
   while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0)
     {
      Sleep(16);
      //--- when pressing Del, delete the created custom symbol
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
        {
         if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME))
            PrintFormat("Custom symbol '%s' deleted successfully"CUSTOM_SYMBOL_NAME);
         break;
        }
     }
//--- clear the chart before exiting
   Comment("");
   /*
   result:
   The 'EURUSDsymbol from which the custom 'EURUSD.Cwas created:
     Volume Min0.01
     Volume Max500.00
     Volume Step0.01
   Custom symbol 'EURUSDbased on 'EURUSD.C':
     Volume Min0.10
     Volume Max1000.00
     Volume Step0.10
   */
  }
//+------------------------------------------------------------------+
//| Create a custom symbol, return an error code                     |
//+------------------------------------------------------------------+
int CreateCustomSymbol(const string symbol_nameconst string symbol_pathconst string symbol_origin=NULL)
  {
//--- define the name of a symbol a custom one is to be based on
   string origin=(symbol_origin==NULL ? Symbol() : symbol_origin);
   
//--- if failed to create a custom symbol and this is not error 5304, report this in the 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);
     }
//--- successful
   return(error);
  }
//+------------------------------------------------------------------+
//| Remove a custom symbol                                           |
//+------------------------------------------------------------------+
bool DeleteCustomSymbol(const string symbol_name)
  {
//--- hide the symbol from the Market Watch window
   ResetLastError();
   if(!SymbolSelect(symbol_namefalse))
     {
      PrintFormat("SymbolSelect(%s, false) failed. Error %d"GetLastError());
      return(false);
     }
      
//--- if failed to delete a custom symbol, report this in the journal and return 'false'
   ResetLastError();
   if(!CustomSymbolDelete(symbol_name))
     {
      PrintFormat("CustomSymbolDelete(%s) failed. Error %d"symbol_nameGetLastError());
      return(false);
     }
//--- successful
   return(true);
  }

 

See also

SymbolInfoDouble