- Obtener símbolos disponibles y listas de Observación de Mercado
- Editar la lista de Observación de Mercado
- Comprobar la existencia de un símbolo
- Comprobar la pertinencia de los datos de los símbolos
- Obtener el último tick de un símbolo
- Horarios de sesiones de trading y cotización
- Coeficientes de margen de los símbolos
- Visión general de las funciones para obtener las propiedades de los símbolos
- Comprobar el estado de los símbolos
- Tipo de precio para construir gráficos de símbolos
- Divisas base, de cotización y de margen del instrumento
- Precisión de la representación de precios y pasos de cambio
- Volúmenes permitidos de operaciones de trading
- Permiso de trading
- Condiciones de trading de símbolos y modos de ejecución de órdenes
- Requisitos de margen
- Reglas de vencimiento de órdenes pendientes
- Diferenciales y distancia de orden del precio actual
- Obtener tamaños de swap
- Información actual sobre el mercado (tick)
- Propiedades descriptivas de los símbolos
- Profundidad de Mercado
- Propiedades personalizadas de símbolos
- Propiedades específicas (bolsa, derivados, bonos)
Visión general de las funciones para obtener las propiedades de los símbolos
La especificación completa de cada símbolo puede obtenerse consultando sus propiedades: para ello, la API de MQL5 proporciona tres funciones, a saber, SymbolInfoInteger, SymbolInfoDouble y SymbolInfoString, cada una de las cuales se encarga de las propiedades de un tipo concreto. Las propiedades se describen como miembros de tres enumeraciones: ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE, and ENUM_SYMBOL_INFO_STRING, respectively. Una técnica similar se utiliza en las API de gráficos y objetos que ya conocemos.
El nombre del símbolo y el identificador de la propiedad solicitada se pasan a cualquiera de las funciones.
Cada una de las funciones se presenta de dos formas: abreviada y completa. La versión abreviada devuelve directamente la propiedad solicitada, mientras que la completa la escribe en el parámetro out pasado por referencia. Por ejemplo, para las propiedades compatibles con un tipo entero, las funciones tienen prototipos como éste:
long SymbolInfoInteger(const string symbol, ENUM_SYMBOL_INFO_INTEGER property)
bool SymbolInfoInteger(const string symbol, ENUM_SYMBOL_INFO_INTEGER property, long &value)
La segunda forma devuelve un indicador booleano de éxito (true) o error (false). Las razones más plausibles por las que una función puede devolver false incluyen un nombre de símbolo no válido (MARKET_UNKNOWN_SYMBOL, 4301) o un identificador no válido para la propiedad solicitada (MARKET_WRONG_PROPERTY, 4303). Los detalles figuran en _LastError.
Como antes, las propiedades de la enumeración ENUM_SYMBOL_INFO_INTEGER son de varios tipos compatibles con enteros: bool, int, long, color, datetime y enumeraciones especiales (todas ellas se abordarán en secciones separadas).
Para las propiedades con un tipo de número real, se definen las siguientes dos formas de la función SymbolInfoDouble:
double SymbolInfoDouble(const string symbol, ENUM_SYMBOL_INFO_DOUBLE property)
bool SymbolInfoDouble(const string symbol, ENUM_SYMBOL_INFO_DOUBLE property, double &value)
Por último, para las propiedades de cadena, las funciones similares tienen el siguiente aspecto:
string SymbolInfoString(const string symbol, ENUM_SYMBOL_INFO_STRING property)
bool SymbolInfoString(const string symbol, ENUM_SYMBOL_INFO_STRING property, string &value)
Las propiedades de varios tipos que se utilizarán a menudo más adelante al desarrollar Asesores Expertos se agrupan lógicamente en las descripciones de las siguientes secciones de este capítulo.
Basándonos en las funciones anteriores, crearemos una clase universal SymbolMonitor (archivo SymbolMonitor.mqh) para obtener las propiedades de cualquier símbolo. Se basará en un conjunto de métodos sobrecargados get para tres enumeraciones.
class SymbolMonitor
|
Los otros tres métodos similares permiten eliminar el tipo de enumeración en el primer parámetro y seleccionar la sobrecarga necesaria por parte del compilador gracias al segundo parámetro ficticio (su tipo aquí siempre coincide con el tipo de resultado). Lo utilizaremos en futuras clases de plantillas.
long get(const int property, const long) const
|
Así, mediante la creación de un objeto con el nombre de símbolo deseado, se pueden consultar uniformemente sus propiedades de cualquier tipo. Para consultar y registrar todas las propiedades del mismo tipo podríamos implementar algo como esto:
// project (draft)
|
Sin embargo, debido al hecho de que en las propiedades del tipo long en realidad se «ocultan» valores de otros tipos, que deben mostrarse de una forma específica (por ejemplo, llamando a EnumToString para enumeraciones, imeToString para fecha y hora, etc.), tiene sentido definir otros tres métodos sobrecargados que devuelvan una representación de cadena de la propiedad. Los llamaremos stringify. Entonces, en el proyecto list2log anterior, es posible utilizar stringify en lugar de valores de conversión a (string), y el propio método eliminará un parámetro de plantilla.
template<typename E>
|
Para los tipos real y cadena, la implementación de stringify parece bastante sencilla.
string stringify(const ENUM_SYMBOL_INFO_DOUBLE property, const string format = NULL) const
|
Sin embargo, para ENUM_SYMBOL_INFO_INTEGER, todo es un poco más complicado. Por supuesto, cuando la propiedad es del tipo long o int, basta con convertirla a (string). Todos los demás casos deben analizarse y convertirse individualmente en el operador switch.
string stringify(const ENUM_SYMBOL_INFO_INTEGER property) const
|
Por ejemplo, si una propiedad es de tipo booleano, es conveniente representarla con la cadena «true» o «false» (así será visualmente diferente de los simples números 1 y 0). De cara al futuro, y por poner un ejemplo, digamos que entre las propiedades se encuentra SYMBOL_EXIST, que equivale a la función SymbolExist, es decir, devuelve una indicación booleana de si el carácter especificado existe. Para su procesamiento y otras propiedades lógicas tiene sentido implementar un método auxiliar boolean.
static string boolean(const long v)
|
Para las propiedades que son enumeraciones, la solución más adecuada sería un método de plantilla que utilice la función EnumToString.
template<typename E>
|
Por ejemplo, la propiedad SYMBOL_SWAP_ROLLOVER3DAYS determina en qué día de la semana se carga un swap triple en las posiciones abiertas de un símbolo, y esta propiedad tiene el tipo ENUM_DAY_OF_WEEK. Así, para procesarlo, podemos escribir lo siguiente dentro de switch:
case SYMBOL_SWAP_ROLLOVER3DAYS:
|
Un caso especial lo presentan las propiedades cuyos valores son combinaciones de banderas de bits. En concreto, para cada símbolo, el bróker establece permisos para órdenes de tipos específicos, como mercado, límite, stop loss, take profit, etc. (analizaremos estos permisos por separado). Cada tipo de orden se indica mediante una constante con un bit habilitado, por lo que su superposición (combinada mediante el operador bitwise OR '|') se almacena en la propiedad SYMBOL_ORDER_MODE, y en ausencia de restricciones, todos los bits se habilitan al mismo tiempo. Para tales propiedades definiremos nuestras propias enumeraciones en nuestro archivo de encabezado; por ejemplo:
enum SYMBOL_ORDER
|
Aquí, para cada constante integrada, como SYMBOL_ORDER_MARKET, se declara un elemento correspondiente, cuyo identificador es el mismo que la constante pero va precedido de un guion bajo para evitar conflictos de nombres.
Para representar combinaciones de banderas de tales enumeraciones en forma de cadena, implementamos otro método de plantilla, maskstr.
template<typename E>
|
Su significado es como enumstr, pero se llama a la función EnumToString por cada bit habilitado en el valor de la propiedad, tras lo cual se «pegan» las cadenas resultantes.
Ahora es posible procesar SYMBOL_ORDER_MODE en la sentencia switch de forma similar:
case SYMBOL_ORDER_MODE:
|
Aquí está el código completo del método stringify para ENUM_SYMBOL_INFO_INTEGER. Nos iremos familiarizando poco a poco con todas las propiedades y enumeraciones en las siguientes secciones.
string stringify(const ENUM_SYMBOL_INFO_INTEGER property) const
|
Para probar la clase SymbolMonitor hemos creado un sencillo script SymbolMonitor.mq5. Registra todas las propiedades del símbolo del gráfico de trabajo.
#include <MQL5Book/SymbolMonitor.mqh>
|
Por ejemplo, si ejecutamos el script en el gráfico EURUSD, podemos obtener los siguientes registros (facilitados de forma abreviada):
ENUM_SYMBOL_INFO_INTEGER Count=36
|
En concreto, puede ver que los precios de los símbolos se emiten con 5 dígitos (SYMBOL_DIGITS), el símbolo existe (SYMBOL_EXIST), el tamaño del contrato es 100000.0 (SYMBOL_TRADE_CONTRACT_SIZE), etc. Toda la información corresponde a la especificación.