CustomSymbolCreate

Crea un símbolo personalizado con el nombre indicado en el grupo indicado.

bool  CustomSymbolCreate(
   const string     symbol_name,         // nombre del símbolo personalizado
   const string     symbol_path="",      // nombre del grupo en el que se creará el símbolo
   const string     symbol_origin=NULL   // nombre del símbolo sobre cuya base se creará el símbolo personalizado
   );

Parámetros

symbol_name

[in]  Nombre del símbolo personalizado. No debe contener el grupo o subgrupo en el que se encuentra el símbolo.

symbol_path=""

[in]  Nombre del grupo en el que se crea el símbolo.

symbol_origin=NULL

[in]  Nombre del símbolo del que se copiarán las propiedades del símbolo personalizado creado. Después de crear un símbolo personalizado, podremos cambiar cualquier propiedad por el valor necesario con las funciones correspondientes.

Valor retornado

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

Observación

Todos los símbolos personalizados se crean en el apartado especial Custom. Si no se ha establecido el nombre del grupo (el parámetro symbol_path en la función CustomSymbolCreate contiene una línea vacía o NULL), el símbolo personalizado se creará en la carpeta raíz del apartado Custom. Aquí podemos hacer una analogía con un sistema de archivos, donde todos los grupos-subgrupos pueden comprenderse como carpetas-subcarpetas

Tanto el nombre del símbolo como el del grupo se indicará solo con letras latinas, sin signos de puntuación, espacios en blanco o símbolos especiales (están permitidos ".", "_", "&" y "#"). No se recomienda usar en el nombre los símbolos <, >, :, ", /, |, ?, *.

El nombre del símbolo personalizado deberá ser único, independientemente del nombre del grupo en el que se cree. Si ya existe un símbolo con ese nombre, la función CustomSymbolCreate() retornará false, y la siguiente llamada de GetLastError() dará el código de error 5300 (ERR_NOT_CUSTOM_SYMBOL) o 5304 (ERR_CUSTOM_SYMBOL_EXIST).

La longitud del nombre del símbolo no deberá superar los 31 caracteres, en caso contrario, CustomSymbolCreate() retornará false y se generará el error 5302 — ERR_CUSTOM_SYMBOL_NAME_LONG.

El parámetro symbol_path se puede indicar de dos formas:

  • solo el nombre del grupo sin el nombre del símbolo personalizado, por ejemplo, "CFD\\Metals". Es mejor usar precisamente esta opción, para evitar errores.
  • o bien el nombre <grupo> + separador de grupos "\\"+<nombre del símbolo personalizado>, por ejemplo, "CFD\\Metals\\Platinum". En este caso, el nombre del grupo deberá terminar con el nombre exacto del símbolo personalizado. En el caso de incompatibilidad, el símbolo personalizado se creará igualmente, pero no en el grupo en el que se pretendía. Por ejemplo, si symbol_path="CFD\\Metals\\Platinum" y symbol_name="platinum" (error en el registro), se creará un símbolo personalizado con el nombre "platinum" en el grupo "Custom\CFD\Metals\Platinum". En este caso, además, la función SymbolInfoGetString("platinum",SYMBOL_PATH) retornará el valor "Custom\CFD\Metals\Platinum\platinum".

 

Es necesario tener en cuenta que la propiedad SYMBOL_PATH retorna la ruta junto con el nombre del símbolo al final. Por eso, no podemos copiarla simplemente sin cambios, si deseamos crear el símbolo personalizado precisamente en el mismo grupo. En este caso, será necesario cortar el nombre del símbolo, para así no obtener el resultado explicado anteriormente.

Si hemos establecido como parámetro symbol_origin un símbolo inexistente, el símbolo personalizado se creará vacío, como si el parámetro symbol_origin no hubiera sido indicado. En este caso, además, se generará el error 4301 — ERR_MARKET_UNKNOWN_SYMBOL.

La longitud del parámetro symbol_path no deberá superar los 127 caracteres, incluyendo "Custom\\", los separadores de grupos "\\" y el nombre del símbolo, si este se ha indicado al final.

 

Ejemplo:

//+------------------------------------------------------------------+
//|                                           CustomSymbolCreate.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()
  {
//--- si no se ha podido crear el símbolo personalizado, informaremos de ello en el registro
   if(!CustomSymbolCreate(CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_PATHCUSTOM_SYMBOL_ORIGIN))
     {
      Print("CustomSymbolCreate() failed. Error "GetLastError());
      return;
     }
 
//--- comprobamos la existencia del símbolo creado y obtenemos el grupo en el que se ha creado
   bool   customfalse;
   bool   exist = SymbolExist(CUSTOM_SYMBOL_NAMEcustom);
   string path  = SymbolInfoString(CUSTOM_SYMBOL_NAMESYMBOL_PATH);
 
//--- imprimimos en el registro el resultado de la creación del símbolo y el nombre del grupo, especificado y obtenido de las propiedades del símbolo
   PrintFormat("Custom symbol '%s' created\n"+
               "Symbol '%s' is exist: %s\n"+
               "Symbol '%s' is custom: %s\n"+
               "Path specified in the settings: '%s'\n"+
               "Path returned from the 'SYMBOL_PATH' property: '%s'",
               CUSTOM_SYMBOL_NAME
               CUSTOM_SYMBOL_NAME, (string)exist
               CUSTOM_SYMBOL_NAME, (string)custom,
               CUSTOM_SYMBOL_PATH,
               path);
 
//--- esperamos dos segundos y borramos el símbolo creado con un mensaje sobre el resultado en el registro
   Sleep(2000);
   ResetLastError();
   bool deleted = CustomSymbolDelete(CUSTOM_SYMBOL_NAME);
   Print(deleted ? StringFormat("Custom symbol '%s' removed"CUSTOM_SYMBOL_NAME) : StringFormat("CustomSymbolDelete() failed. Error ",GetLastError()));
   /*
   resultado:
   Custom symbol 'EURUSD.Ccreated
   Symbol 'EURUSD.Cis existtrue
   Symbol 'EURUSD.Cis customtrue
   Path specified in the settings: 'Forex'
   Path returned from the 'SYMBOL_PATHproperty: 'Custom\Forex\EURUSD.C'
   Custom symbol 'EURUSD.Cremoved
   */
  }

 

Ver también

SymbolName, SymbolSelect, CustomSymbolDelete