CustomSymbolSetDouble

Establece para el símbolo personalizado el valor de propiedad de tipo real.

bool  CustomSymbolSetDouble(
   const string              symbol_name,      // nombre del símbolo
   ENUM_SYMBOL_INFO_DOUBLE   property_id,      // identificador de la propiedad
   double                    property_value    // valor de la propiedad
   );

Parámetros

symbol_name

[in]  Nombre del símbolo personalizado.

property_id

[in]  Identificador de la propiedad del símbolo. El valor puede ser uno de los valores de la enumeración ENUM_SYMBOL_INFO_DOUBLE.

property_value

[in]  Variable del tipo double, que contiene el valor de la propiedad.

Valor devuelto

true — en caso de éxito, de lo contrario, false. Para obtener la información sobre el error, hay que llamar la función GetLastError().

Nota

La historia de minutos y ticks del símbolo personalizado se eliminará por completo, si en las especificaciones del símbolo se cambia cualquiera de estas propiedades:

  • SYMBOL_POINT — valor de un punto
  • SYMBOL_TRADE_TICK_SIZE — valor de un tick, que especifica el cambio mínimo permitido del precio
  • SYMBOL_TRADE_TICK_VALUE — coste del cambio de precio en un tick para una posición con beneficios

Después de eliminar la historia del símbolo personalizado, el terminal intentará crear una nueva historia usando las propiedades actualizadas. Lo mismo sucede al cambiar manualmente las propiedades del símbolo personalizado.

 

Ejemplo:

//+------------------------------------------------------------------+
//|                                        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"  // 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
 
//+------------------------------------------------------------------+
//| 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 e imprimimos en el registro las propiedades del símbolo en base al cual se ha creado el símbolo personalizado
//--- (volumen mínimo, volumen máximo, paso de cambio de volumen mínimo para cerrar una transacción)
   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);
   
//--- establecemos estas propiedades del símbolo personalizado en valores diferentes
   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);
 
//--- si se ha producido un error al configurar alguna de las propiedades, mostraremos un mensaje en el registro
   if(!res)
      Print("CustomSymbolSetDouble() failed. Error "GetLastError());
   
//--- obtenemos e imprimimos en el registro las propiedades modificadas del símbolo personalizado
//--- (volumen mínimo, volumen máximo, paso de cambio de volumen mínimo para cerrar una transacción)
   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);
   
//--- 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);
      //--- pulsando Del, eliminaremos el símbolo personalizado creado
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
        {
         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:
   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
   */
  }
//+------------------------------------------------------------------+
//| 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

SymbolInfoDouble