---
title: "MetaTrader 5 build 1640: Creación y simulación de instrumentos financieros propios - Últimas actualizaciones"
description: "Añadida la posibilidad de crear instrumentos financieros propios. Ahora usted podrá crear cualquier instrumento, establecer los ajustes... - Últimas actualizaciones"
image: "https://www.metatrader5.com/c/17/0/terminal_3__17.png"
url: "https://www.metatrader5.com/es/releasenotes/terminal/1459"
---

# MetaTrader 5 build 1640: Creación y simulación de instrumentos financieros propios

## Añadida la posibilidad de crear instrumentos financieros propios. Ahora usted podrá crear cualquier instrumento, establecer los ajustes necesarios para él, importar al mismo sus datos de precio y visu

21 julio 2017

### Terminal

1. Añadida la posibilidad de crear instrumentos financieros propios. Ahora usted podrá crear cualquier instrumento, establecer los ajustes necesarios para él, importar al mismo sus datos de precio y visualizar gráficos sobre dicho instrumento.**Crando un símbolo personalizado** Abra la ventana de gestión de símbolos a través del menú contextual "Observación del mercado" y pulse "Crear un símbolo":

   ![](https://www.metatrader5.com/c/17/0/terminal_1__43.png)

    Hay multitud de parámetros disponibles para el ajuste. Podrá ver la lista de dichos parámetros en la [documentación](https://www.metatrader5.com/es/terminal/help/trading/market_watch). Usted tendrá la posibilidad de ajustar su propio instrumento: copie los parámetros de cualquier instrumento semejante y después cambie lo que necesite. Para ello, elija el instrumento del que ya disponga en el campo "Copiar desde".

   > El nombre del símbolo personalizado no deberá coincidir con los nombres de los símbolos retransmitidos por los brókeres. Si usted se conecta al servidor y en este resulta haber un símbolo que coincide con el símbolo personalizado, el símbolo personalizado será eliminado.

    Aquí mismo están los comandos de importación y exportación de los ajustes. Podrá compartir fácilmente símbolos personalizados o transferirlos entre sus terminales. Los ajustes se exportan a archivos de texto del formato JSON.**Gestión de los símbolos personalizados** Todos los símbolos se representan en el grupo aparte Custom. Para modificar o eliminar un símbolo, use el menú contextual en la lista:

   ![](https://www.metatrader5.com/c/17/0/terminal_1_2__11.png)

   **Importando la historia de precios** Usted podrá importar los datos de precio a un símbolo propio desde cualquier archivo de texto. Elija el símbolo y pase a continuación a la pestaña "Barras".

   ![](https://c.mql5.com/3/147/terminal_3__5.png)

    En el diálogo de importación, indique la ruta al archivo con los datos y establezca la configuración:

     - Separador — elemento separador en un archivo de texto.
     - Omitir columnas y líneas — número de columnas (de izquierda a derecha) y líneas (de arriba a abajo) que se pueden omitir al realizar la importación.
     - Desplazamiento — desplazamiento temporal por horas. Esta opción se usa al importar los datos guardados en otro huso horario.
     - Usar solo las seleccionadas — esta opción permite importar solo las líneas seleccionadas en la ventana de visualización. Las líneas se pueden destacar con la ayuda del ratón, manteniendo las teclas "Ctrl" o "Shift".

    El archivo con las barras debe tener el formato: Fecha Hora Open High Low Close VolumendeTicks Spread. Ejemplo:

   2016.06.27 00:01:00 1.10024 1.10136 1.10024 1.10070 18 54000000 44 2016.06.27 00:02:00 1.10070 1.10165 1.10070 1.10165 32 55575000 46 2016.06.27 00:03:00 1.10166 1.10166 1.10136 1.10163 13 13000000 46 2016.06.27 00:04:00 1.10163 1.10204 1.10155 1.10160 23 51000000 41

    Para su propio símbolo usted podrá usar los datos de cualquier otro instrumento existente. Expórtelos (esta posibilidad se añadió en la anterior versión de la plataforma), y en caso necesario, modifíquelos e impórtelos de vuelta.

   > En MetaTrader 5 la historia de precio se guarda en forma de barras de minuto. El resto de los marcos temporales se crea sobre su base. Al realizar la importación, usted podrá usar los datos de marcos temporales mayores, pero hay que tener en cuenta que los gráficos de los marcos temporales menores, en este caso, tendrán huecos. Por ejemplo, al importar los datos de horas, en el gráfico de minutos usted podrá ver una barra cada hora.

    Los datos de precio de los símbolos de usuario se guardan en el catálogo aparte Custom (fuera de los catálogos de servidores comerciales concretos):

   C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

   **Usando símbolos propios** El uso de símbolos propios prácticamente no se diferencia del uso de aquellos que ofrece el bróker. Estos también se muestran en la ventana de "Observación de mercado", es posible abrir gráficos de ellos, y después colocar indicadores y objetos analíticos sobre los mismos. Además, en este caso, no es posible comerciar con los símbolos personalizados.**Simulación de estrategias usando símbolos propios** Los símbolos propios creados se pueden utilizar para poner a prueba los robots comerciales y los indicadores en el [simulador de estrategias](https://www.metatrader5.com/es/terminal/help/algotrading/testing). Esto permite optimizar las estrategias incluso para los instrumentos financieros que el bróker no tiene disponibles en este momento. Basta con importar correctamente la historia y configurar las propiedades del símbolo personalizado.

   ![](https://www.metatrader5.com/c/17/0/custom_symbol_testing___3.png)

    Al calcular el margen y el beneficio, el simulador de estrategias usa automáticamente los cursos cruzados disponibles. Por ejemplo, hemos creado un símbolo AUDCAD.custom propio con un tipo de cálculo del margen **[Fórex](https://www.metatrader5.com/es/terminal/help/trading_advanced/margin_forex)**, y la divisa de nuestro depósito es USD. Entonces, **basándose en el nombre del instrumento fórex**, el simulador busca los símbolos necesarios en el siguiente orden:

     1.  primero se buscan los símbolos AUDUSD.custom (para el cálculo del margen) y USDCAD.custom (para el cálculo del beneficio de las transacciones)
     2.  a continuación, si alguno de dichos instrumentos no está presente, se busca el primer símbolo cuyo nombre se corresponda con las parejas de divisas necesarias, es decir, AUDUSD y USDCAD, respectivamente. Por ejemplo, se han encontrado AUDUSD.b y NZDUSD.b, esto significa que los cursos de estos instrumentos se usarán al calcular el margen y el beneficio.

    Los instrumentos con los demás tipos de cálculo de margen (Futures,**[Stock Exchange](https://www.metatrader5.com/es/terminal/help/trading_advanced/margin_exchange)**) precisan de una pareja de divisas para convertir la divisa del instrumento en la divisa del depósito. Por ejemplo, hemos creado nuestro propio símbolo con una divisa de beneficio y una divisa de margen expresadas en libras esterlinas (GBP), mientras que la divisa del depósito es el franco suizo (CHF). Entonces, la búsqueda de instrumentos para la simulación se realizará en el siguiente orden:

     1. Se comprueba la presencia del instrumento financiero que corresponde a la pareja GBPCHF (GBP vs CHF).
     2. Si no existe tal instrumento, entonces se busca el primer instrumento financiero cuyo nombre se corresponda con la pareja de divisas, por ejemplo, GBPCHF.b o GBPCHF.def.

    Al realizar simulaciones con sus propios instrumentos, asegúrese de que en la cuenta están disponibles todas las parejas de divisas necesarias para los cálculos. De lo contrario, el cálculo de los resultados financieros y de las exigencias de depósito durante la simulación no serán posibles.**Más posibilidades en las siguientes versiones de la plataforma** El trabajo con los propios instrumentos aún no ha finalizado, en las próximas versiones de la plataforma aparecerán nuevas funciones. Usted podrá importar la historia a los símbolos personalizados directamente desde los expertos, así como retransmitir datos sobre ellos (añadir cotizaciones) en tiempo real.
2. Añadido el filtrado de la banda de transacciones según el volumen.  Es posible ocultar de la banda las transacciones con un volumen menor al indicado. De esta forma, en la banda permanecerán solo las transacciones importantes, que influyen en el mercado. Pulse dos veces sobre la primera línea de la banda de transacciones, indique el volumen mínimo en lotes, y a continuación pulse sobre cualquier otra zona de la pantalla. Las transacciones serán filtradas, y el valor actual del filtro aparecerá en el encabezamiento de la columna de volumen.

   ![](https://www.metatrader5.com/c/17/0/time_sales_filter__3.png)

    También es posible indicar el volumen mínimo a través del menú contextual de la banda de transacciones.
3. Añadida la posibilidad de vincular la profundidad de mercado al gráfico activo. Cada vez que usted pase a la visualización del gráfico de algún instrumento financiero, en la profundidad de mercado se activará de forma automática exactamente el mismo instrumento. No tendrá que abrir aparte la profundidad de mercado para cada símbolo.

   ![](https://www.metatrader5.com/c/17/0/terminal_3__17.png)
4. Corregida la actualización de los paneles de instrumentos después de ocultar y desplegar la ventana del terminal.
5. Corregida la formación de la historia comercial de las posiciones al cruzarse los tickets de las transacciones y las posiciones.

### MQL5

1. Añadida la posibilidad de perfilado de programas MQL5 sobre la historia de precios. Esto permitirá comprobar rápidamente la productividad de los programas sin tener que esperar nuevos tickets. Al perfilar con datos reales, el programa se inicia en el gráfico habitual en el terminal. Muchos programas, en especial los indicadores, ejecutan ciertos cálculos solo con la llegada de un nuevo tick ([OnTick](https://www.mql5.com/es/docs/basis/function/events#ontick), [OnCalculate](https://www.mql5.com/es/docs/basis/function/events#oncalculate)). De esta forma, para valorar la productividad debemos esperar la llegada de nuevos ticks en tiempo real. Al realizar la simulación con datos históricos, usted podrá indicar de inmediato la carga para el programa. El perfilado se inicia en el simulador de estrategias en el modo visual, después usted recibirá inmediatamente multitud de eventos de llegada de un nuevo tick.

   ![](https://www.metatrader5.com/c/17/0/terminal_4__10.png)
2. Añadido el soporte de [Unión (union)](https://www.mql5.com/es/docs/basis/types/classes#union). Se trata de un tipo especial de datos que consta de varias variables que comparten una misma zona de la memoria. Por consiguiente, la unión proporciona la posibilidad de interpretar una misma secuencia de bits con dos (o más) métodos diferentes. La declaración de una unión comienza con la palabre clave union.

   ```
   union LongDouble {   long   long_value;   double double_value; };
   ```

    A diferencia de la estructura, los diferentes miembros de una unión se relacionan con una misma zona de la memoria. En este ejemplo se ha declarado la unión LongDouble, en la que el valor del tipo long y el valor del tipo double comparten la misma zona de la memoria. Es importante comprender que no es posible hacer que la unión guarde al mismo tiempo valores de tipo entero long y reales double (como sucedía en la estructura), puesto que las variables long_value y double_value se solapan (en la memoria) una sobre otra. Sin embargo, un programa MQL5 puede en cualquier momento procesar la información que se contiene en esta unión como un valor entero (long) o como uno real (double). Por consiguiente, la unión permite obtener dos (o más) variantes de representación de una misma secuencia de datos. Al declarar una unión, el compilador delimita automáticamente una parte de la memoria que sea suficiente para guardar en una unión las variables del tipo de volumen más grande. Para acceder a un elemento de la unión, se usa la misma sintaxis que para las estructuras: el [operador "punto"](https://www.mql5.com/es/docs/basis/operations/other#operation_dot).

   ```
   union LongDouble {   long   long_value;   double double_value; }; //+------------------------------------------------------------------+ //| Script program start function                                    | //+------------------------------------------------------------------+ void OnStart()   { //---    LongDouble lb; //--- obtenemos el número no válido -nan(ind) y lo mostramos    lb.double_value=MathArcsin(2.0);    printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value); //--- valor mayor normalizado (DBL_MAX)    lb.long_value=0x7FEFFFFFFFFFFFFF;    printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value); //--- menor positivo normalizado (DBL_MIN)    lb.long_value=0x0010000000000000;        printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);   } /*  Resultado de la ejecución     1.  double=-nan(ind)                integer=FFF8000000000000     2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF     3.  double=2.2250738585072014e-308  integer=0010000000000000 */
   ```
3. Añadida la generación automática del operador implícito de copiado para los objetos de estructuras y clases. Ahora el compilador crea de forma automática operadores de copadio, lo que permite escribir para los objetos las entradas sencillas del tipo b=a:

   ```
   class Foo   {    int               value; public:    string Description(void){return IntegerToString(value);};    //--- constructor por defecto                      Foo(void){value=-1;};    //--- constructor con parámetros                         Foo(int v){value=v;};   }; //+------------------------------------------------------------------+ //|  estructura que contiene el objeto del tipo Foo                          | //+------------------------------------------------------------------+ struct MyStruct   {    string            s;    Foo               foo;   }; //+------------------------------------------------------------------+ //| Script program start function                                    | //+------------------------------------------------------------------+ void OnStart()   { //---    MyStruct a,b;    Foo an_foo(5);    a.s="test";    a.foo=an_foo;    Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());    Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); //---    Print("b=a");    b=a; //---    Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());    Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); /*    Resultado de la ejecución;    a.s=test a.foo.Description()=5    b.s= b.foo.Description()=-1    b=a    a.s=test a.foo.Description()=5    b.s=test b.foo.Description()=5 */   }
   ```

    En el operador implícito se realiza el copiado por miembros de los objetos.

     - Si el miembro es un objeto, se llama al operador de copiado correspondiente para este objeto.
     - Si el miembro es una matriz de objetos, entonces, antes de llamar el operador de copiado correspondiente para cada elemento, la matriz receptora aumenta o disminuye hasta el tamaño necesario a través de ArrayResize.
     - Si el miembro es una matriz de tipos simples, para copiar se usa la función ArrayCopy.
     - Si el miembro es un puntero a un objeto, se copia el propio puntero, y no el objeto al que señala.

    En caso necesario, podemos redefinir el comportamiento, y en lugar de un operador implícito de copiado, crear nuestra propia variedad con la ayuda de la [sobrecarga](https://www.mql5.com/es/docs/basis/function/operationoverload).
4. Optimizada la utilización de la memoria al recurrir a la historia de precios desde los expertos con la ayuda de [funciones Copy*](https://www.mql5.com/es/docs/series/copyrates). Al trabajar con grandes volúmenes de datos, el uso de la memoria se reducirá varias veces.
5. Ahora la función [TimeToStruct](https://www.mql5.com/es/docs/dateandtime/timetostruct) retorna un valor booleano, permitiendo comprobar el éxito de la conversión de datetime a [MqlDateTime](https://www.mql5.com/es/docs/constants/structures/mqldatetime).
6. Añadida la prohibición del uso de las funciones [FileWriteStruct](https://www.mql5.com/es/docs/files/filewrite) y [FileReadStruct](https://www.mql5.com/es/docs/files/filereadstruct) para las estructuras que contengan líneas, matrices dinámicas, objetos y punteros.
7. Añadidos los códigos de respuesta:

     - TRADE_RETCODE_REJECT_CANCEL — la solicitud de activación de una orden pendiente ha sido rechezada, y la propia orden ha sido cancelada
     - TRADE_RETCODE_LONG_ONLY — la solicitud ha sido rechazada, puesto que en el símbolo se ha establecido la norma "Solo se permiten posiciones largas"
     - TRADE_RETCODE_SHORT_ONLY — la solicitud ha sido rechazada, puesto que en el símbolo se ha establecido la norma "Solo se permiten posiciones cortas"
     - TRADE_RETCODE_CLOSE_ONLY — la solicitud ha sido rechazada, puesto que en el símbolo se ha establecido la norma "Solo se permite cerrar las posiciones existentes"
8. Añadido un nuevo valor, devuelto por la función [SymbolInfoInteger](https://www.mql5.com/es/docs/marketinformation/symbolinfointeger) con el parámetro [SYMBOL_ORDER_MODE](https://www.mql5.com/es/docs/constants/environment_state/marketinfoconstants#enum_symbol_info_integer). SYMBOL_ORDER_CLOSEBY — bandera sobre la posibilidad de colocar órdenes de cierre de posición con una opuesta (Close By).
9. A la enumeración ENUM_SYMBOL_INFO_INTEGER se ha añadido la propiedad boleana SYMBOL_CUSTOM. Permite saber si el símbolo es un símbolo personalizado. Para obtener la propiedad, use la función [SymbolInfoInteger](https://www.mql5.com/es/docs/marketinformation/symbolinfointeger).
10. Ahora es posible averiguar el motivo de la creación de una orden, transacción y posición.**Nuevas propiedades**

      - Para las posiciones se ha añadido la propiedad [POSITION_REASON](https://www.mql5.com/es/docs/constants/tradingconstants/positionproperties), que se puede obtener con la ayuda de [PositionGetInteger](https://www.mql5.com/es/docs/trading/positiongetinteger).
      - Para las propiedades se ha añadido la propiedad [DEAL_REASON](https://www.mql5.com/es/docs/constants/tradingconstants/dealproperties), que se puede obtener con la ayuda de [HistoryDealGetInteger](https://www.mql5.com/es/docs/trading/historydealgetinteger).
      - Para las órdenes se ha añadido la propiedad [ORDER_REASON](https://www.mql5.com/es/docs/constants/tradingconstants/orderproperties), que se puede obtener con la ayuda de [OrderGetInteger](https://www.mql5.com/es/docs/trading/ordergetinteger) y [HistoryOrderGetInteger](https://www.mql5.com/es/docs/trading/historyordergetinteger).

    **Motivos de la creación de una orden, transacción y posición** Para averiguar los motivos de la creación de las operaciones comerciales se han añadido tres enumeraciones:

    | ENUM_POSITION_REASON | ENUM_DEAL_REASON | ENUM_ORDER_REASON | Descripción de las causas |
    | --- | --- | --- | --- |
    | POSITION_REASON_CLIENT | DEAL_REASON_CLIENT | ORDER_REASON_CLIENT | La operación se ha ejecutado como resultado de la activación de una orden colocada desde el terminal de escritorio |
    | POSITION_REASON_MOBILE | DEAL_REASON_MOBILE | ORDER_REASON_MOBILE | La operación se ha ejecutado como resultado de una orden colocada desde el terminal móvil |
    | POSITION_REASON_WEB | DEAL_REASON_WEB | ORDER_REASON_WEB | La operación se ha ejecutado como resultado de la activación de una orden colocada desde la plataforma web |
    | POSITION_REASON_EXPERT | DEAL_REASON_EXPERT | ORDER_REASON_EXPERT | La operación se ha ejecutado como resultado de la activación de una orden colocada desde un programa MQL5: un asesor o script |
    | - | DEAL_REASON_SL | ORDER_REASON_SL | La operación se ha ejecutado como resultado de la activación de un Stop Loss |
    | - | DEAL_REASON_TP | ORDER_REASON_TP | La operación se ha ejecutado como resultado de la activación de un Take Profit |
    | - | DEAL_REASON_SO | ORDER_REASON_SO | La operación se ha ejecutado como resultado del evento Stop Out |
    | - | DEAL_REASON_ROLLOVER | - | La transacción se ha ejecutado a causa del traslado de una posición |
    | - | DEAL_REASON_VMARGIN | - | La transacción se ha ejecutado después de abonarse/retirarse el margen de variación |
    | - | DEAL_REASON_SPLIT | - | La transacción se ha ejecutado a causa del fraccionamiento (reducción del precio) de una acción u otro activo que tenía una posición abierta en el momento del anuncio del fraccionamiento |
11. Optimizada la sincronización y el acceso a la historia de ticks.
12. Corregido el retorno de ticks a la matriz estática en la función [CopyTicksRange](https://www.mql5.com/es/docs/series/copyticksrange). En este caso, antes simepre se retornaban 0 ticks.
13. Introducidas diferentes correcciones en la [biblioteca de lógica difusa Fuzzy](https://www.mql5.com/es/docs/standardlibrary/mathematics/fuzzy_logic).

### Signals

1. Corregida la apertura de una señal desde la página web cuando no hay conexión con la cuenta comercial.

### Tester

1. Se ha optimizado y acelerado considerablemente el funcionamiento de la historia de órdenes y transacciones. Al trabajar con un gran volumen de datos (decenas de miles de entradas en la historia y más), la velocidad del funcionamiento aumenta varias veces.
2. Corregido el cálculo del tiempo de mantenimiento de la posición en el informe de simulación.

### MetaEditor

1. En el depurador se ha corregido la representación del contenido de las matrices-miembros estáticas de la clase.
2. Añadida la lista de puntos de interrupción en el programa depurado. Para pasar a ella, use el menú contextual de la pestaña "Depuración":

   ![](https://www.metatrader5.com/c/17/0/breakpoint_goto__3.png)

    Para pasar a cualquiera de los puntos, pulse dos veces sobre él.

Actualización de la documentación.

**Lea las noticias anteriores:**

- [MetaTrader 5 iOS build 1605: apertura de una cuenta preliminar con un bróker](https://www.metatrader5.com/es/releasenotes/iphone/1446)
- [MetaTrader 5 build 1596: acceso a la historia de precios](https://www.metatrader5.com/es/releasenotes/terminal/1427)
- [MetaTrader 5 Android build 1576: añadidas las posiciones a la historia comercial](https://www.metatrader5.com/es/releasenotes/android/1426)
- [MetaTrader 5 iOS build 1547: historia comercial en forma de posiciones](https://www.metatrader5.com/es/releasenotes/iphone/1421)
- [MetaTrader 5 build 1570: escaparate del Mercado mejorado y funciones de plantilla ampliadas en MQL5](https://www.metatrader5.com/es/releasenotes/terminal/1414)
