
Introducción a MQL5 (Parte 9): Comprensión y uso de objetos en MQL5
Introducción
¡Bienvenido nuevamente a nuestra serie MQL5! Discutiremos un tema fascinante en este capítulo que creo que encontrará muy útil y fascinante. Comenzaremos un proyecto en el que trabajaremos con diferentes objetos gráficos en MQL5, que serán una base esencial para nuestros proyectos futuros. Este punto de partida será especialmente útil cuando nos adentremos en proyectos más complejos, como el uso de diversos patrones armónicos. Los objetos de gráfico en MQL5 son elementos gráficos que se pueden colocar en los gráficos de trading para representar visualmente varios tipos de datos, incluyendo niveles de precios, zonas de trading y anotaciones de texto. Estos objetos ofrecen a los comerciantes y desarrolladores la flexibilidad de crear imágenes personalizadas que mejoran el análisis de gráficos, lo que facilita la identificación de tendencias del mercado, niveles de precios clave y oportunidades comerciales.
Hay diferentes objetos gráficos disponibles en MQL5, desde líneas y formas básicas hasta componentes complejos como texto, flechas e indicadores personalizados. Se puede crear un entorno comercial altamente personalizado modificando el color, el tamaño, la posición y otros atributos de cada objeto. Los objetos gráficos son más que simples acentos decorativos; son instrumentos eficaces para producir representaciones visuales claras y comprensibles de datos del mercado. Por ejemplo, puede ser más sencillo identificar posibles puntos de reversión si los niveles de soporte y resistencia se resaltan con rectángulos. A través de un proyecto práctico, este artículo le introducirá en la idea de los objetos de gráfico en MQL5 y le mostrará cómo utilizarlos.
En este proyecto, desarrollaremos un Asesor Experto (EA) que mejora el trading al mostrar visualizaciones claras directamente en el gráfico. El EA mostrará automáticamente la ruta desde el punto de entrada hasta las zonas de stop loss y take profit, lo que le proporcionará una evaluación visual rápida del riesgo y la recompensa de su operación. Sin necesidad de consultar otras fuentes de datos, el EA se actualizará en tiempo real para reflejar sus ganancias o pérdidas actuales a medida que el mercado se mueve. Además, proporcionará información precisa de un vistazo al mostrar los precios de entrada, stop loss y take profit para la posición actual bajo observación.
La adaptabilidad de este EA a las modificaciones en su configuración comercial es una de sus características principales. Tus señales visuales siempre estarán actualizadas porque el EA actualizará instantáneamente el gráfico cuando modifiques tus niveles de take profit o stop loss. El EA también se ajusta a la duración de su operación. A medida que mantiene la operación durante más tiempo, el EA se ajustará gradualmente para que los elementos visuales se vuelvan más visibles. Esto le permitirá monitorear el comercio de manera efectiva con varios marcos de tiempo, aunque al principio puede que no sean muy notorios en marcos de tiempo más altos. Ahora es más sencillo gestionar operaciones de marcos temporales más bajos y realizar un seguimiento de ellas a medida que cambian gracias a esta adaptación dinámica.
El EA le permite examinar operaciones anteriores, lo que proporciona un análisis histórico detallado. Le ayuda a evaluar su desempeño comercial y a tomar decisiones inteligentes al mostrarle cuánto ganó o perdió en posiciones anteriores. Puede ver datos históricos directamente en el gráfico definiendo el rango de fechas. Esto le brinda una descripción general completa de su historial comercial y la opción de ampliar operaciones específicas para realizar un análisis más profundo.
Visualización comercial actual:
Perspectivas comerciales históricas:
En este artículo aprenderás:
- Creación y modificación de objetos de gráficos para un análisis visual mejorado.
- Recorrer posiciones para gestionar y mostrar operaciones de forma eficiente en el gráfico.
- Utilización de datos históricos de transacciones para orientar la ubicación de los objetos del gráfico.
- Visualización de ganancias y pérdidas históricas de transacciones en el gráfico para el seguimiento del rendimiento.
- Uso de conversiones de fecha y hora para cronometrar con precisión la creación de objetos gráficos.
- Anotación de detalles de entrada, Take Profit (TP) y Stop Loss (SL) en el gráfico.
- Uso de parámetros de entrada para personalizar su asesor experto.
Este proyecto tiene como objetivo familiarizarlo con las aplicaciones útiles de los objetos gráficos en MQL5. Este enfoque práctico le enseñará cómo administrar operaciones, mejorar el análisis visual y mostrar datos comerciales importantes directamente en sus gráficos integrando y modificando de manera eficiente los objetos de gráficos dentro de su Asesor Experto (Expert Advisor, EA). Para ayudarlo a comprender mejor cómo usar estas herramientas para tomar decisiones comerciales y realizar el seguimiento del rendimiento, este proyecto lo guiará a través del proceso de creación, modificación y administración de varios objetos gráficos.
1.Objetos gráficos en MQL5
1.1. ¿Qué son los objetos gráficos?
Los objetos gráficos en MQL5 son componentes visuales que los operadores pueden incluir en sus gráficos para mejorar el análisis y la toma de decisiones. Estos objetos pueden ser elementos más complejos, como canales o flechas, o pueden ser formas, líneas y textos más simples. Los objetos gráficos se utilizan principalmente para representar visualmente datos importantes, lo que ayuda a los operadores a planificar operaciones, evaluar las condiciones del mercado y realizar un seguimiento de las posiciones abiertas. Los objetos gráficos le permiten resaltar niveles de precios significativos y dibujar líneas de tendencia en el gráfico que indican la dirección del mercado. Al visualizar estos datos en el gráfico, los operadores pueden tomar decisiones comerciales bien informadas y evaluar rápidamente las condiciones del mercado en lugar de depender únicamente de datos numéricos.
1.2. ¿Por qué es importante personalizar los objetos gráficos?
Puede mejorar la claridad visual de sus gráficos comerciales y ayudarse a tomar mejores decisiones personalizando los objetos gráficos. Al modificar el color, el tamaño o la posición de estos objetos, puede hacer que el gráfico se adapte mejor a sus preferencias y estilo comerciales. Puede utilizar esta personalización para hacer que la información más importante se destaque a simple vista enfatizándola.
Si su atención está centrada en los niveles de soporte y resistencia, es posible que desee utilizar líneas gruesas y llamativas que se destaquen en colores vivos y sean fáciles de ver incluso al escanear rápidamente el gráfico. Al hacer esto, reduce la posibilidad de pasar por alto señales cruciales durante una sesión de negociación agitada. De manera similar, hacer que las anotaciones de texto se destaquen más puede servir como una señal visual para ayudarlo a recordar decisiones comerciales importantes o estrategias planificadas.
1.3. Objetos gráficos que utilizaremos para el proyecto
En este proyecto se utilizarán varios objetos gráficos MQL5 importantes para mejorar nuestro análisis comercial. Los objetos gráficos que utilizaremos son los siguientes:
1.3.1. Líneas de tendencia
Una herramienta esencial en nuestro proyecto es la línea de tendencia, que se utiliza principalmente para rastrear el precio actual del mercado con respecto a niveles de tendencia importantes e identificar el punto de entrada. Para determinar la dirección general del mercado, trazaremos una línea de tendencia entre puntos de precio importantes. A medida que el precio de mercado cambia (o «ticks»), la línea de tendencia se actualiza en tiempo real, por lo que se extenderá continuamente desde el precio de entrada inicial hasta el precio de mercado más reciente.
Esto garantiza que la línea de tendencia siempre refleje los datos de precios más recientes, lo que ayuda a realizar un seguimiento preciso del rendimiento de la operación y a tomar decisiones sobre la gestión de la posición. La línea de tendencia a menudo comienza en el precio al que se abrió la posición, lo que refleja el punto de inicio de la operación. La línea se extiende hasta el precio de mercado actual o el precio de venta. Esto muestra cómo se ha movido el precio desde que se abrió la operación.
1.3.2. Etiquetas de texto
Como lo muestran los comentarios en el gráfico, las etiquetas de texto ofrecen detalles claros y comprensibles sobre las diferentes facetas de una operación. En ellos se puede mostrar información importante como puntos de entrada, niveles de stop-loss, objetivos de take-profit y cualquier otra nota pertinente para la estrategia comercial. Al agregar etiquetas de texto a áreas importantes del gráfico, puede recuperar fácilmente información vital sin usar notas externas ni su memoria. Esta ayuda visual facilita tener a mano toda la información necesaria a la hora de tomar decisiones.
Con cada tick aparecerá una etiqueta de texto indicando la ganancia o pérdida actual de la posición abierta. Con esta actualización en tiempo real, puede vigilar el rendimiento de su operación a medida que se mueve el mercado y puede obtener una idea instantánea de si la operación va en la dirección correcta. Con una etiqueta como +$100 o -$50 junto a la operación, la ganancia o pérdida actual se mostrará en tiempo real a medida que avanza el mercado. Esto le permite supervisar el rendimiento de su operación y realizar los ajustes necesarios.
1.3.3. Objetos rectangulares
Los objetos rectangulares se pueden utilizar para indicar niveles de soporte y resistencia en un gráfico, entre otras cosas. Pero en este proyecto, su uso se limitará a identificar zonas ganadoras y perdedoras en una operación. Cuando una posición está perdiendo dinero actualmente, dibujaremos un rectángulo desde el punto de entrada hasta el nivel de stop-loss. Esto nos ayuda a reconocer rápidamente cuando la posición se está acercando al stop-loss al representar visualmente el área donde la operación va en una dirección negativa. Se dibujará un rectángulo desde el punto de entrada hasta el nivel de toma de ganancias una vez que la posición esté en ganancias. Esto nos ayuda a seguir el progreso de la operación hacia el objetivo de toma de ganancias resaltando las áreas en las que tiene un buen desempeño.
Hay muchos objetos gráficos diferentes disponibles en MQL5, y cada uno está destinado a mejorar el análisis de comercio de una manera particular. Sería demasiado cubrir todos estos temas en un solo artículo. Debido a esto, he reducido el enfoque a sólo los elementos que se utilizarán en nuestro proyecto. Estos objetos elegidos, que incluyen rectángulos, líneas de tendencia y etiquetas de texto, no sólo son esenciales para esta estrategia específica, sino que también tienen procesos de creación y modificación que son comparables a los de otros objetos MQL5. Adquirirá los conocimientos fundamentales necesarios para trabajar con diversos objetos gráficos en MQL5, utilizando métodos comparables para crearlos y modificarlos de acuerdo con sus necesidades de trading, comprendiendo los conceptos y estrategias de estos objetos en particular.
2. Creación y personalización de objetos
En esta sección nos concentraremos en la creación y modificación de diferentes objetos gráficos en MQL5. Se mostrará cómo crear objetos como rectángulos, líneas de tendencia y etiquetas de texto, y cómo ajustar su color, estilo y anchura para adaptarlos a su plan de negociación.
2.1. Pseudocódigo
En este proyecto, el pseudocódigo es esencial porque, antes de escribir cualquier código, ofrece un resumen bien organizado y conciso del razonamiento y los procedimientos necesarios para cumplir nuestros objetivos. Ayuda a descomponer las tareas difíciles en componentes más pequeños y manejables, lo que facilita la planificación, ayuda a detectar posibles problemas y garantiza que el código que escribimos sea eficiente y esté bien organizado. El pseudocódigo nos permite visualizar todo el flujo del Asesor Experto, lo que facilita la implementación de objetos gráficos y otras funciones.
Este es el pseudocódigo básico de nuestro EA:
1. Inicialización:
- Defina colores para la zona SL, la zona TP y la línea de tendencia.
- Establece el índice de posición.
- Especifique si desea mostrar datos históricos.
- Defina las fechas de inicio y fin de los datos históricos.
- Ajuste la hora de cierre de la zona.
- Obtén el ID del gráfico actual.
- Inicializar variables para almacenar los detalles de la posición (precio de apertura, stop loss, take profit, beneficio, hora de apertura).
2. 2. En cada tick:
- Convierte la cadena de tiempo (string) en un objeto de fecha y hora para la zona de cierre.
- Obtener el precio de compra actual.
- Recorrer todas las posiciones.
- Obtener el número de ticket de la posición.
- Comprueba si la posición coincide con el símbolo del gráfico.
- Recuperar detalles: precio de apertura, stop loss, take profit, hora de apertura y beneficio.
- Si la posición coincide con el índice especificado.
- Crear y configurar el rectángulo de zona SL.
- Establezca las propiedades (color, estilo, anchura, relleno).
- Crear y configurar el rectángulo de zona TP.
- Establezca las propiedades (color, estilo, anchura, relleno).
- Crear y configurar línea de tendencia.
- Establecer las propiedades (color, estilo, ancho).
- Calcular y mostrar el beneficio de la posición.
- Formatear y mostrar las ganancias como texto.
- Crear y configurar objetos de texto para Entrada, TP y SL:
- Establecer las propiedades (color, tamaño de fuente).
3. Si la visualización de datos históricos está habilitada:
- Borrar comentarios anteriores.
- Seleccione y recorra las transacciones históricas dentro del rango de fechas especificado:
- Obtenga detalles de cada transacción (precio de apertura, precio de cierre, SL, TP, beneficio, tiempos).
- Mostrar información de ganancias/pérdidas.
- Cree y configure la zona SL, la zona TP y la línea de tendencia para transacciones históricas:
- Establecer las propiedades (color, estilo, ancho).
2.2. Aplicación práctica: creación y personalización de objetos
2.2.1 Creación de objetos gráficos
Una herramienta esencial en MQL5 que le permite crear diferentes tipos de objetos en su gráfico de trading es la función ObjectCreate(). Estos objetos, que ayudan a los operadores a visualizar mejor los datos del mercado, analizar tendencias y marcar puntos importantes en el gráfico, pueden incluir líneas de tendencia, rectángulos, etiquetas de texto, flechas, etc.
Más allá de la mera creación: especificar la ubicación de los objetos
No sólo puede crear objetos en el gráfico utilizando ObjectCreate(), sino que sus parámetros también le dan un control exacto sobre dónde aparecen estos objetos. Puede orientar y mejorar la eficacia de su análisis colocando estos objetos en lugares específicos de su gráfico y especificando parámetros concretos. El tiempo y el precio son los dos factores principales que determinan dónde se colocan los artículos en el gráfico. Estos elementos sirven como ancla para el objeto en el gráfico en esa ubicación específica.
Sintaxis:
ObjectCreate(chart_id, object_name, object_type, sub_window, time1, price1, time2, price2, time3, price3);
La relación entre el tiempo y el precio en la colocación de objetos
Cada punto de un gráfico comercial en MQL5 está determinado por la interacción del precio (el eje vertical) y el tiempo (el eje horizontal). Estas dos dimensiones se utilizan para especificar la ubicación exacta del objeto en el gráfico cuando lo crea utilizando ObjectCreate.
Comprender los puntos de anclaje: time1, price1, time2, price2, time3, price3
Es común necesitar definir uno o más puntos de anclaje cuando se utiliza ObjectCreate() para crear objetos. La ubicación precisa del objeto en el gráfico se establece mediante estos puntos de anclaje. Estos puntos de anclaje son los parámetros time1, price1, time2, price2, time3, and price3.
- time1 y price1: Estos parámetros establecen el punto de anclaje inicial del objeto. Si estuviera dibujando una línea de tendencia, por ejemplo, time1 indicaría el tiempo del punto de inicio (una vela concreta, por ejemplo), y price1 indicaría el nivel de precios en ese punto.
- time2 y price2: Especifica el segundo punto de anclaje del objeto. Este sería el punto final de la línea en el ejemplo de la línea de tendencia. Price2 indica el nivel de precios en ese momento, y time2 indica la hora del segundo punto.
-
time3 y price3: Es necesario un tercer punto de anclaje para determinados objetos más intrincados, como canales o triángulos. Puede especificar este tercer punto mediante time3 y price3, lo que puede ser necesario al dibujar algunas formas que requieren tres coordenadas.
// Get the ID of the current chart long chart_id = ChartID(); //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { // Define the first anchor point for the trendline // 'time1' is the datetime for the first point, and 'price1' is the price at that time datetime time1 = D'2024.08.21 16:00'; double price1 = 8766.01; // Define the second anchor point for the trendline // 'time2' is the datetime for the second point, and 'price2' is the price at that time datetime time2 = D'2024.08.28 08:00'; double price2 = 8854.51; // Create a trendline object on the chart // 'chart_id' is the ID of the chart where the object will be placed // "Trend Line" is the name of the trendline object // 'OBJ_TREND' specifies that the object is a trendline // The last four parameters (0, time1, price1, time2, price2) specify the anchor points of the trendline ObjectCreate(chart_id, "Trend Line", OBJ_TREND, 0, time1, price1, time2, price2); }
Salida:
Las etiquetas de texto (OBJ_TEXT) se pueden colocar en el gráfico con un solo punto de anclaje. El punto de anclaje indica la ubicación del texto en función de las coordenadas de precio y tiempo que se proporcionan. Una etiqueta de texto en el gráfico que dice "Buy Here" en un momento y precio determinados.
Ejemplo:
// Get the ID of the current chart long chart_id = ChartID(); //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { // Define the time for the text label's position (August 21, 2024, at 16:00) datetime time1 = D'2024.08.21 16:00'; // Define the price level for the text label's position (8766.01) double price1 = 8766.01; // Create a text object named "Text" on the chart at the specified time and price ObjectCreate(chart_id, "Text", OBJ_TEXT, 0, time1, price1); // Set the text content of the object to display "Buy Here" ObjectSetString(chart_id, "Text", OBJPROP_TEXT, "Buy Here"); }
Salida:
2.3. Personalización de objetos
Puede personalizar los componentes visuales de los objetos del gráfico para adaptarlos a su estilo comercial. Para tu deleite, también puedes modificar su tamaño, color y estilo. Para que una línea de tendencia destaque entre otros elementos del gráfico, por ejemplo, puede cambiar su color, grosor y ubicación para asegurarse de que coincida con los niveles importantes del mercado. De igual forma, las etiquetas de texto se pueden modificar modificando la fuente y el esquema de colores para destacar detalles cruciales como los objetivos de ganancias o los puntos de entrada.
Ejemplo:
// Define the time for the text label's position (August 21, 2024, at 16:00) datetime time1 = D'2024.08.21 16:00'; // Define the price level for the text label's position (8766.01) double price1 = 8766.01; // Create a text object named "Text" on the chart at the specified time and price ObjectCreate(chart_id, "Text", OBJ_TEXT, 0, time1, price1); // Set the text content of the object to display "Buy Here" ObjectSetString(chart_id, "Text", OBJPROP_TEXT, "Buy Here"); // Set the color of the text object to Medium Blue ObjectSetInteger(chart_id, "Text", OBJPROP_COLOR, clrMediumBlue);
Este código muestra el texto "Buy Here", agrega una etiqueta de texto al gráfico en un momento y precio determinados, y cambia el color del texto a azul medio.
Salida:
2.3.1. Funciones de objeto para personalizar objetos gráficos en MQL5
Los objetos gráficos en MQL5 se pueden personalizar utilizando varias funciones de objeto. Con la ayuda de estas funciones, puede modificar el aspecto, el tacto y la ubicación de los objetos gráficos para adaptarlos mejor a sus necesidades concretas.
Se utiliza para establecer propiedades de tipo entero de un objeto gráfico, como el color, la anchura y el estilo.
Ejemplo:// Get the ID of the current chart long chart_id = ChartID(); //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { datetime time1 = D'2024.08.21 16:00'; double price1 = 8766.01; // Define the second anchor point for the trendline // 'time2' is the datetime for the second point, and 'price2' is the price at that time datetime time2 = D'2024.08.28 08:00'; double price2 = 8854.51; // Create a trend line object on the chart with the name "Trend Line" // The trend line will be drawn from time1/price1 to time2/price2 ObjectCreate(chart_id, "Trend Line", OBJ_TREND, 0, time1, price1, time2, price2); // Set the style of the trend line to a dashed line ObjectSetInteger(chart_id, "Trend Line", OBJPROP_STYLE, STYLE_DASH); // Set the width of the trend line to 2 ObjectSetInteger(chart_id, "Trend Line", OBJPROP_WIDTH, 2); }
Salida:
Fija atributos de tipo doble, frecuentemente sobre precio o tiempo. Ejemplo: Ajuste de las coordenadas de los puntos de anclaje en una línea de tendencia.
Se utiliza para establecer propiedades de tipo string, como el texto que se muestra en una etiqueta de texto.
Ejemplo: Añadir anotaciones o notas directamente en el gráfico.
// Create a text object named "Text" on the chart at the specified time and price ObjectCreate(chart_id, "Text", OBJ_TEXT, 0, time1, price1); // Set the text content of the object to display "Buy Here" ObjectSetString(chart_id, "Text", OBJPROP_TEXT, "Buy Here");
Se pueden utilizar diferentes tipos de objetos gráficos para construir, personalizar y gestionar utilizando varias de las funciones de objeto disponibles en MQL5. Estas características son cruciales para mejorar la forma en que los datos comerciales se muestran visualmente en sus gráficos. ObjectCreate y ObjectSetInteger son dos funciones importantes que hemos discutido en nuestro proyecto, pero hay muchas más. Puedes consultar la documentación de MQL5, que ofrece detalles exhaustivos sobre todas las funciones de gráfico disponibles, para entender más a fondo las funciones adicionales.
3. Implementando objetos gráficos en nuestro proyecto
3.1. Creación de objetos gráficos para las posiciones actuales
Esta sección se concentrará en configurar los objetos del gráfico para manejar y presentar datos sobre las posiciones actuales en el gráfico. Para representar visualmente datos comerciales en tiempo real, esto implica crear y modificar rectángulos, líneas de tendencia y etiquetas de texto.
3.1.1. Uso de rectángulos para resaltar áreas
Vamos a utilizar dos rectángulos diferentes para enfatizar visualmente las zonas críticas en su gráfico donde se establecen los niveles de Stop Loss (SL) y Take Profit (TP). Estos rectángulos representarán dinámicamente las zonas SL y TP, para que pueda controlar fácilmente los niveles de riesgo y recompensa de un vistazo.
a. Resaltar la zona SL:
- Anchor 1: El primer ancla del rectángulo de la zona SL se colocará al precio de entrada de la operación y a la hora exacta de apertura de la posición.
- Anchor 2: La segunda ancla se situará en el precio SL y se extenderá horizontalmente hasta las 23:59 del día en curso. Esta extensión asegura que el rectángulo se actualice dinámicamente cada día, expandiéndose para cubrir la zona SL visualmente hasta que la operación se cierre o termine el día.
- Propósito: Este rectángulo marca el área de riesgo en el gráfico, permitiéndole identificar rápidamente cuán cerca está el precio actual del nivel SL.
b. Resaltar la zona TP:
- Anchor 1: La primera ancla del rectángulo de la zona TP también comenzará a partir del precio de entrada de la operación.
- Anchor 2: La segunda ancla, que se extiende horizontalmente hasta las 23:59 del día en curso, se situará en el precio TP de la posición actual. Al igual que la zona SL, el área de recompensa potencial se resaltará continuamente mediante este rectángulo en expansión cada día.
Los rectángulos que resaltan las zonas SL y TP sólo pueden hacerse después de que recuperemos programáticamente la información necesaria para cada posición. Esto incluye el precio de apertura, el nivel de stop loss (SL), el nivel de take profit (TP) y la hora de apertura de la operación. Nos aseguramos de que los rectángulos estén colocados adecuadamente en el gráfico, coincidiendo con los niveles y tiempos apropiados para cada posición, recuperando estos valores mediante programación. Los rectángulos también pueden actualizarse dinámicamente con nuevas posiciones gracias a este método automatizado, que mantiene la representación visual actualizada y pertinente en todo momento.
Ejemplo:
// Variables to store position details double open_price; // Variable to store the entry price of the position double stop_loss; // Variable to store the Stop Loss level of the position double take_profit; // Variable to store the Take Profit level of the position datetime position_open_time; // Variable to store the open time of the position //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Loop through all open positions for(int i = 0; i < PositionsTotal(); i++) { // Get the ticket number of the position at index 'i' ulong ticket = PositionGetTicket(i); // Retrieve and store the entry price of the position open_price = PositionGetDouble(POSITION_PRICE_OPEN); // Retrieve and store the Stop Loss level of the position stop_loss = PositionGetDouble(POSITION_SL); // Retrieve and store the Take Profit level of the position take_profit = PositionGetDouble(POSITION_TP); // Retrieve and store the open time of the position position_open_time = (int)PositionGetInteger(POSITION_TIME); // Print the retrieved values for debugging or verification Print("Open Price index ",i,": ",open_price); Print("SL index ",i,": ",stop_loss); Print("TP index ",i,": ",take_profit); Print("Open time index ",i,": ",position_open_time); } }
Explicación:
Cada vez que el precio del instrumento de negociación se mueve, o cambia, la función OnTick ejecuta el código. Se recupera información importante sobre cada posición abierta en la cuenta de negociación. Todas las posiciones abiertas en la cuenta de negociación se ejecutan en bucle. La función PositionsTotal() devuelve información específica sobre cada posición en función de su índice en la lista total de posiciones. Utilice las funciones PositionGetDouble y PositionGetInteger para recuperar estos detalles. Para depuración o verificación, los datos recuperados se imprimen en el terminal antes de añadir elementos visuales al gráfico, como rectángulos que resalten las zonas SL y TP. Esto garantiza que se recopilen datos precisos.
La implementación actual planteará dos problemas:
- Identificar la posición exacta: Tal como está, el EA no sabe qué posición precisa está haciendo un bucle para obtener los datos de tiempo y precio. Esto significa que cuando sólo queramos información de una posición concreta, el código extraerá datos de todas las posiciones abiertas, lo que podría provocar confusión o que se utilizaran datos incorrectos.
- Datos específicos del instrumento gráfico: La información que se está recuperando tiene que estar relacionada con las posiciones abiertas y las operaciones relacionadas con el instrumento que se muestra actualmente en el gráfico. El EA podría extraer datos de las posiciones de otros instrumentos que no serían relevantes para el gráfico actual si no se filtrara el símbolo del gráfico, lo que podría dar lugar a representaciones visuales inexactas o engañosas.
La solución a este problema es proporcionar una entrada donde el usuario pueda elegir de qué índice de posición desea recuperar datos. Con esta información, el EA podrá concentrarse en el rol específico que el usuario está buscando. El código también debe garantizar que la posición elegida coincida con el instrumento que está visible actualmente en el gráfico, garantizando que solo se utilicen datos pertinentes para la representación visual.
Ejemplo:
// Variables to store position details double open_price; // Variable to store the entry price of the position double stop_loss; // Variable to store the Stop Loss level of the position double take_profit; // Variable to store the Take Profit level of the position datetime position_open_time; // Variable to store the open time of the position // Define the position index for the first position input int position_index = 0; // POSITION INDEX (Index starts from 0) // Get the ID of the current chart long chart_id = ChartID(); //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Loop through all open positions for(int i = 0; i < PositionsTotal(); i++) { // Get the ticket number of the position at index 'i' ulong ticket = PositionGetTicket(i); if(PositionGetInteger(POSITION_TICKET) == PositionGetTicket(position_index) && PositionGetString(POSITION_SYMBOL) == ChartSymbol(chart_id)) { // Retrieve and store the entry price of the position open_price = PositionGetDouble(POSITION_PRICE_OPEN); // Retrieve and store the Stop Loss level of the position stop_loss = PositionGetDouble(POSITION_SL); // Retrieve and store the Take Profit level of the position take_profit = PositionGetDouble(POSITION_TP); // Retrieve and store the open time of the position position_open_time = (int)PositionGetInteger(POSITION_TIME); // Print the retrieved values for debugging or verification Print("Open Price index ",i,": ",open_price); Print("SL index ",i,": ",stop_loss); Print("TP index ",i,": ",take_profit); Print("Open time index ",i,": ",position_open_time); } } }
El algoritmo itera sobre cada posición abierta, determina si corresponde al índice y símbolo gráfico elegidos y, a continuación, obtiene la información pertinente. Ahora podemos hacer los dos rectángulos que indicarán las zonas SL (Stop Loss) y TP (Take Profit) después de recuperar con éxito los datos de precio y tiempo para la posición dada. Para garantizar que estos rectángulos representan adecuadamente las regiones SL y TP en el gráfico, los datos adquiridos se utilizarán como entradas para la función ObjectCreate().
Ejemplo:// Variables to store position details double open_price; // Variable to store the entry price of the position double stop_loss; // Variable to store the Stop Loss level of the position double take_profit; // Variable to store the Take Profit level of the position datetime position_open_time; // Variable to store the open time of the position // Define the position index for the first position input int position_index = 1; // POSITION INDEX (Index starts from 0) // Get the ID of the current chart long chart_id = ChartID(); // Store the ID of the current chart string time = "23:59"; // Define a specific time as a string // Define the color for the losing zone input color sl_zonez_color = clrPink; // Choose a color for Losing Zone // Define the color for the winning zone input color tp_zonez_color = clrSpringGreen; // Choose a color for Winning Zone //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Convert the string time to datetime datetime close_zone = StringToTime(time); // Loop through all open positions for(int i = 0; i < PositionsTotal(); i++) { // Get the ticket number of the position at index 'i' ulong ticket = PositionGetTicket(i); // Check if the position matches the specified index and symbol of the current chart if(PositionGetInteger(POSITION_TICKET) == PositionGetTicket(position_index) && PositionGetString(POSITION_SYMBOL) == ChartSymbol(chart_id)) { // Retrieve and store the entry price of the position open_price = PositionGetDouble(POSITION_PRICE_OPEN); // Retrieve and store the Stop Loss level of the position stop_loss = PositionGetDouble(POSITION_SL); // Retrieve and store the Take Profit level of the position take_profit = PositionGetDouble(POSITION_TP); // Retrieve and store the open time of the position position_open_time = (int)PositionGetInteger(POSITION_TIME); // Print the retrieved values for debugging or verification Print("Open Price index ",i,": ",open_price); Print("SL index ",i,": ",stop_loss); Print("TP index ",i,": ",take_profit); Print("Open time index ",i,": ",position_open_time); // Create a rectangle to represent the Stop Loss (SL) zone on the chart ObjectCreate(chart_id, "SL Zone", OBJ_RECTANGLE, 0, position_open_time, open_price, close_zone, stop_loss); // Create a rectangle to represent the Take Profit (TP) zone on the chart ObjectCreate(chart_id, "TP zone", OBJ_RECTANGLE, 0, position_open_time, open_price, close_zone, take_profit); // Set properties for the SL zone rectangle ObjectSetInteger(chart_id, "SL Zone", OBJPROP_COLOR, sl_zonez_color); // Set color to the selected SL zone color ObjectSetInteger(chart_id, "SL Zone", OBJPROP_STYLE, STYLE_SOLID); // Set style to solid ObjectSetInteger(chart_id, "SL Zone", OBJPROP_WIDTH, 1); // Set the width of the rectangle border ObjectSetInteger(chart_id, "SL Zone", OBJPROP_FILL, sl_zonez_color); // Fill the rectangle with the selected SL zone color ObjectSetInteger(chart_id, "SL Zone", OBJPROP_BACK, true); // Set the rectangle to appear behind the chart objects // Set properties for the TP zone rectangle ObjectSetInteger(chart_id, "TP zone", OBJPROP_COLOR, tp_zonez_color); // Set color to the selected TP zone color ObjectSetInteger(chart_id, "TP zone", OBJPROP_STYLE, STYLE_SOLID); // Set style to solid ObjectSetInteger(chart_id, "TP zone", OBJPROP_WIDTH, 1); // Set the width of the rectangle border ObjectSetInteger(chart_id, "TP zone", OBJPROP_FILL, tp_zonez_color); // Fill the rectangle with the selected TP zone color ObjectSetInteger(chart_id, "TP zone", OBJPROP_BACK, true); // Set the rectangle to appear behind the chart objects } } }
Explicación:
Este código obtiene la hora de apertura de la posición, el SL, el TP y el precio de apertura para cada posición. Utiliza esta información para dibujar dos rectángulos visibles en el gráfico: uno para el área de posible pérdida y otro para el área de ganancia potencial. Por otro lado, no especificar los niveles de TP o SL podría generar problemas con los puntos de anclaje de estos rectángulos, lo que podría afectar la forma en que se posicionan o se muestran en el gráfico. Para garantizar una visualización precisa, implementaré código para rectificar este comportamiento.
if(stop_loss > 0) { // Create a rectangle to represent the Stop Loss (SL) zone on the chart ObjectCreate(chart_id, "SL Zone", OBJ_RECTANGLE, 0, position_open_time, open_price, close_zone, stop_loss); } if(take_profit > 0) { // Create a rectangle to represent the Take Profit (TP) zone on the chart ObjectCreate(chart_id, "TP zone", OBJ_RECTANGLE, 0, position_open_time, open_price, close_zone, take_profit); }
Explicación:
Antes de crear los rectángulos correspondientes en el gráfico, el fragmento de código verifica que los niveles Stop Loss y Take Profit sean mayores que cero. Si el SL está configurado (es decir, es mayor que 0), se dibuja un rectángulo para representar la zona SL, marcando el área de pérdida potencial; si el TP está configurado, se crea otro rectángulo para representar la zona TP, indicando el área de ganancia potencial. Al evitar la creación de rectángulos con puntos de anclaje no válidos, estas comprobaciones garantizan una visualización precisa del gráfico.
Salida:
3.1.2. Creación de líneas de tendencia
Para ilustrar el movimiento de precios desde que se abrió la operación, nos concentraremos en dibujar una línea de tendencia en esta parte desde el precio de apertura de la posición hasta el precio actual. Es fácil ver cómo ha cambiado el mercado alrededor de estos dos lugares de entrada, lo que facilita un examen más profundo del desarrollo del comercio.
Ejemplo:// Get the current ask price double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // Create a trend line object on the chart from the position's open time and price to the current time and ask price ObjectCreate(chart_id, "Trend Line", OBJ_TREND, 0, position_open_time, open_price, TimeCurrent(), ask); // Set the color of the trend line ObjectSetInteger(chart_id, "Trend Line", OBJPROP_COLOR, clrYellow); // Set the style of the trend line to dashed ObjectSetInteger(chart_id, "Trend Line", OBJPROP_STYLE, STYLE_DASH); // Set the width of the trend line ObjectSetInteger(chart_id, "Trend Line", OBJPROP_WIDTH, 2);
Salida:
3.1.3. Agregar etiquetas de texto
En esta fase le daremos al gráfico cuatro etiquetas de texto distintas. El precio de entrada, el take-profit (TP), el stop-loss (SL) y el beneficio actual se mostrarán en estas etiquetas. Estos parámetros comerciales cruciales tendrán referencias visuales distintas para cada etiqueta en el gráfico, lo que hará más sencillo controlar el estado de la transacción directamente desde el gráfico.
Ejemplo:// Variables to store position details double open_price; // Variable to store the entry price of the position double stop_loss; // Variable to store the Stop Loss level of the position double take_profit; // Variable to store the Take Profit level of the position datetime position_open_time; // Variable to store the open time of the position // Define the position index for the first position input int position_index = 1; // POSITION INDEX (Index starts from 0) // Get the ID of the current chart long chart_id = ChartID(); // Store the ID of the current chart string time = "23:59"; // Define a specific time as a string // Define the color for the losing zone input color sl_zonez_color = clrPink; // Choose a color for Losing Zone // Define the color for the winning zone input color tp_zonez_color = clrSpringGreen; // Choose a color for Winning Zone // Define the color for the trend line input color line_zonez_color = clrYellow; // Choose a color for the line //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Get the current ask price double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // Convert the string time to datetime datetime close_zone = StringToTime(time); // Loop through all open positions for(int i = 0; i < PositionsTotal(); i++) { // Get the ticket number of the position at index 'i' ulong ticket = PositionGetTicket(i); // Check if the position matches the specified index and symbol of the current chart if(PositionGetInteger(POSITION_TICKET) == PositionGetTicket(position_index) && PositionGetString(POSITION_SYMBOL) == ChartSymbol(chart_id)) { // Retrieve and store the entry price of the position open_price = PositionGetDouble(POSITION_PRICE_OPEN); // Retrieve and store the Stop Loss level of the position stop_loss = PositionGetDouble(POSITION_SL); // Retrieve and store the Take Profit level of the position take_profit = PositionGetDouble(POSITION_TP); // Retrieve and store the open time of the position position_open_time = (int)PositionGetInteger(POSITION_TIME); if(stop_loss > 0) { // Create a rectangle to represent the Stop Loss (SL) zone on the chart ObjectCreate(chart_id, "SL Zone", OBJ_RECTANGLE, 0, position_open_time, open_price, close_zone, stop_loss); } if(take_profit > 0) { // Create a rectangle to represent the Take Profit (TP) zone on the chart ObjectCreate(chart_id, "TP zone", OBJ_RECTANGLE, 0, position_open_time, open_price, close_zone, take_profit); } // Set properties for the SL zone rectangle ObjectSetInteger(chart_id, "SL Zone", OBJPROP_COLOR, sl_zonez_color); // Set color to the selected SL zone color ObjectSetInteger(chart_id, "SL Zone", OBJPROP_STYLE, STYLE_SOLID); // Set style to solid ObjectSetInteger(chart_id, "SL Zone", OBJPROP_WIDTH, 1); // Set the width of the rectangle border ObjectSetInteger(chart_id, "SL Zone", OBJPROP_FILL, sl_zonez_color); // Fill the rectangle with the selected SL zone color ObjectSetInteger(chart_id, "SL Zone", OBJPROP_BACK, true); // Set the rectangle to appear behind the chart objects // Set properties for the TP zone rectangle ObjectSetInteger(chart_id, "TP zone", OBJPROP_COLOR, tp_zonez_color); // Set color to the selected TP zone color ObjectSetInteger(chart_id, "TP zone", OBJPROP_STYLE, STYLE_SOLID); // Set style to solid ObjectSetInteger(chart_id, "TP zone", OBJPROP_WIDTH, 1); // Set the width of the rectangle border ObjectSetInteger(chart_id, "TP zone", OBJPROP_FILL, tp_zonez_color); // Fill the rectangle with the selected TP zone color ObjectSetInteger(chart_id, "TP zone", OBJPROP_BACK, true); // Set the rectangle to appear behind the chart objects // Create a trend line object on the chart from the position's open time and price to the current time and ask price ObjectCreate(chart_id, "Trend Line", OBJ_TREND, 0, position_open_time, open_price, TimeCurrent(), ask); // Set Trend Line properties ObjectSetInteger(chart_id, "Trend Line", OBJPROP_COLOR, line_zonez_color); ObjectSetInteger(chart_id, "Trend Line", OBJPROP_STYLE, STYLE_DASH); ObjectSetInteger(chart_id, "Trend Line", OBJPROP_WIDTH, 2); // Calculate the profit of the current position double profit = PositionGetDouble(POSITION_PROFIT); // Variables to store the formatted profit text string curent_profits; string profit_to_string; // Check if the profit is positive or zero if(profit >= 0) { // Convert the profit to a string with 2 decimal places profit_to_string = DoubleToString(profit, 2); // Format the profit as a positive amount with a '+' sign curent_profits = StringFormat("+$%s", profit_to_string); } // Check if the profit is negative else if(profit < 0) { // Convert the negative profit to a positive number double profit_to_positive = MathAbs(profit); // Convert the positive profit to a string with 2 decimal places profit_to_string = DoubleToString(profit_to_positive, 2); // Format the profit as a negative amount with a '-' sign curent_profits = StringFormat("-$%s", profit_to_string); } // Create a text label on the chart to display the current profit string text_object_name = "Profit"; ObjectCreate(chart_id, text_object_name, OBJ_TEXT, 0, TimeCurrent(), ask); ObjectSetString(chart_id, text_object_name, OBJPROP_TEXT, curent_profits); // Set the color of the profit text based on whether the profit is positive or negative if(profit > 0) { ObjectSetInteger(chart_id, text_object_name, OBJPROP_COLOR, clrMediumBlue); // Positive profit in blue } else if(profit < 0) { ObjectSetInteger(chart_id, text_object_name, OBJPROP_COLOR, clrRed); // Negative profit in red } // Display the Take Profit (TP) level on the chart string tp_display = "TP"; string t_display = StringFormat("Take Profit: %.5f", take_profit); ObjectCreate(chart_id, tp_display, OBJ_TEXT, 0, close_zone, take_profit); ObjectSetString(chart_id, tp_display, OBJPROP_TEXT, t_display); ObjectSetInteger(chart_id, tp_display, OBJPROP_COLOR, clrBlue); // TP text in blue ObjectSetInteger(chart_id, tp_display, OBJPROP_FONTSIZE, 8); // Set font size for TP // Display the Stop Loss (SL) level on the chart string sl_display = "SL"; string s_display = StringFormat("Stop Loss: %.5f", stop_loss); ObjectCreate(chart_id, sl_display, OBJ_TEXT, 0, close_zone, stop_loss); ObjectSetString(chart_id, sl_display, OBJPROP_TEXT, s_display); ObjectSetInteger(chart_id, sl_display, OBJPROP_COLOR, clrRed); // SL text in red ObjectSetInteger(chart_id, sl_display, OBJPROP_FONTSIZE, 8); // Set font size for SL // Display the Entry Price on the chart string en_display = "Entry Price"; string e_display = StringFormat("Entry Point: %.5f", open_price); ObjectCreate(chart_id, en_display, OBJ_TEXT, 0, close_zone, open_price); ObjectSetString(chart_id, en_display, OBJPROP_TEXT, e_display); ObjectSetInteger(chart_id, en_display, OBJPROP_COLOR, clrPaleVioletRed); // Entry Price text in pale violet red ObjectSetInteger(chart_id, en_display, OBJPROP_FONTSIZE, 8); // Set font size for Entry Price } } }
Explicación:
Este fragmento de código pretende mostrar datos comerciales importantes directamente en el gráfico. Calcula la ganancia posicional actual y la presenta como una etiqueta de texto, mostrando la ganancia en rojo para una ganancia negativa y azul para una ganancia positiva. Para distinguir visualmente el nivel TP, el nivel SL y el precio de entrada, también inserta etiquetas de texto para cada uno. Estas etiquetas tienen diferentes colores. Las etiquetas se han colocado en el gráfico para facilitar que los operadores identifiquen rápidamente los niveles fundamentales y el estado de ganancias actual de su posición.
Salida:
3.2. Creación de objetos de gráfico para datos históricos
El capítulo 3 ha cubierto hasta ahora la creación de objetos gráficos que simbolizan la posición actual. Ahora nos centraremos en el tratamiento de registros históricos, lo que nos permitirá ver las tendencias y los datos comerciales históricos en el gráfico. Esto nos permitirá examinar transacciones anteriores y aplicar el conocimiento histórico a los planes comerciales actuales.
Ejemplo:// Define the position index for the first position input int position_index = 1; // POSITION INDEX (Index starts from 0) // Get the ID of the current chart long chart_id = ChartID(); // Store the ID of the current chart string time = "23:59"; // Define a specific time as a string // Define the color for the losing zone input color sl_zonez_color = clrPink; // Choose a color for Losing Zone // Define the color for the winning zone input color tp_zonez_color = clrSpringGreen; // Choose a color for Winning Zone // Define the color for the trend line input color line_zonez_color = clrYellow; // Choose a color for the line // Define whether to show past history or not input string show_history = "no"; // Type yes to show past history // Define the start date to show history input datetime date1 = D'1970.08.10 00:00:00'; // Show history from this date // Define the end date to show history input datetime date2 = D'2024.08.15 00:00:00'; // To this date //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Check if history display is enabled if(show_history == "yes") { Comment(""); // Clear previous comments // Select deal history within the specified date range bool deal_history = HistorySelect(date1, date2); // Variables to store deal details double deal_close_price = 0.0; double deal_open_price = 0.0; double deal_sl = 0.0; double deal_tp = 0.0; double deal_profit = 0.0; datetime deal_close_time = 0; datetime deal_open_time = 0; // Check if deal history is available if(deal_history) { // Loop through all history deals for(int i = 0; i < HistoryDealsTotal(); i++) { ulong ticket = HistoryDealGetTicket(i); // Check for deal entry in if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_IN) { if(HistoryDealGetString(ticket, DEAL_SYMBOL) == ChartSymbol(chart_id)) { deal_open_price = HistoryDealGetDouble(ticket, DEAL_PRICE); deal_open_time = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME); } } // Check for deal entry out if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) { deal_profit = HistoryDealGetDouble(ticket, DEAL_PROFIT); deal_close_price = HistoryDealGetDouble(ticket, DEAL_PRICE); deal_sl = HistoryDealGetDouble(ticket, DEAL_SL); deal_tp = HistoryDealGetDouble(ticket, DEAL_TP); deal_close_time = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME); if(HistoryDealGetString(ticket, DEAL_SYMBOL) == ChartSymbol(chart_id)) { string deal_string; string current_deal_profit; string object_name; // Display deal profit/loss if(deal_profit > 0) { deal_string = DoubleToString(deal_profit, 2); current_deal_profit = StringFormat("YOU WON +$%s", deal_string); object_name = StringFormat("PROFIT %d", i); ObjectCreate(chart_id, object_name, OBJ_TEXT, 0, deal_close_time, deal_close_price); ObjectSetString(chart_id, object_name, OBJPROP_TEXT, current_deal_profit); ObjectSetInteger(chart_id, object_name, OBJPROP_COLOR, clrMediumBlue); ObjectSetInteger(chart_id, object_name, OBJPROP_FONTSIZE,8); } else if(deal_profit < 0) { double deal_to_positive = MathAbs(deal_profit); deal_string = DoubleToString(deal_to_positive, 2); object_name = StringFormat("PROFIT %d", i); current_deal_profit = StringFormat("YOU LOST -$%s", deal_string); ObjectCreate(chart_id, object_name, OBJ_TEXT, 0, deal_close_time, deal_close_price); ObjectSetString(chart_id, object_name, OBJPROP_TEXT, current_deal_profit); ObjectSetInteger(chart_id, object_name, OBJPROP_COLOR, clrRed); ObjectSetInteger(chart_id, object_name, OBJPROP_FONTSIZE,8); } // Display deal SL zone string sl_obj_name = StringFormat("SL ZONE %d", i); if(deal_sl > 0) { ObjectCreate(chart_id, sl_obj_name, OBJ_RECTANGLE, 0, deal_open_time, deal_open_price, deal_close_time, deal_sl); } ObjectSetInteger(chart_id, sl_obj_name, OBJPROP_COLOR, sl_zonez_color); ObjectSetInteger(chart_id, sl_obj_name, OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(chart_id, sl_obj_name, OBJPROP_WIDTH, 1); ObjectSetInteger(chart_id, sl_obj_name, OBJPROP_FILL, sl_zonez_color); ObjectSetInteger(chart_id, sl_obj_name, OBJPROP_BACK, true); // Display deal TP zone string tp_obj_name = StringFormat("TP ZONE %d", i); if(deal_tp > 0) { ObjectCreate(chart_id, tp_obj_name, OBJ_RECTANGLE, 0, deal_open_time, deal_open_price, deal_close_time, deal_tp); } ObjectSetInteger(chart_id, tp_obj_name, OBJPROP_COLOR, tp_zonez_color); ObjectSetInteger(chart_id, tp_obj_name, OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(chart_id, tp_obj_name, OBJPROP_WIDTH, 1); ObjectSetInteger(chart_id, tp_obj_name, OBJPROP_FILL, tp_zonez_color); ObjectSetInteger(chart_id, tp_obj_name, OBJPROP_BACK, true); // Display deal trend line string line_obj_name = StringFormat("line %d", i); ObjectCreate(chart_id, line_obj_name, OBJ_TREND, 0, deal_open_time, deal_open_price, deal_close_time, deal_close_price); ObjectSetInteger(chart_id, line_obj_name, OBJPROP_COLOR, line_zonez_color); ObjectSetInteger(chart_id, line_obj_name, OBJPROP_STYLE, STYLE_DASH); ObjectSetInteger(chart_id, line_obj_name, OBJPROP_WIDTH, 2); } } } } } }
Explicación:
Esta sección de código evalúa inicialmente la variable show_history para ver si la funcionalidad de visualización del historial está activada. Si se selecciona «yes», el código utiliza Comment(«») para eliminar cualquier comentario anterior del gráfico, dejando visibles sólo los datos más recientes. Luego, el resultado se almacena en la variable booleana deal_history. A continuación, se utiliza el método HistorySelect(date1, date2) para elegir las operaciones históricas dentro del intervalo de fechas indicado. Podemos utilizar datos históricos de negociación con esta selección. Los datos relativos a cada acuerdo anterior se almacenan entonces en varias variables. Los precios de cierre y apertura de la operación se registran en deal_close_price y deal_open_price. Los valores «deal_sl» y «deal_tp» se utilizan para registrar los valores de Take Profit y Stop Loss. Los datos «deal_close_time» y «deal_open_time» documentan los periodos de cierre y apertura de la operación, así como «deal_profit», que hace un seguimiento de los beneficios o pérdidas de la operación.
El código determina si se puede acceder al historial de operaciones. En caso afirmativo, inicia un bucle que utiliza HistoryDealGetTicket(i) para recuperar el número de ticket de cada trato mientras recorre todos los tratos posibles. Diferencia entre ofertas de entrada y de salida para cada ticket. Mientras que las operaciones de salida ofrecen los valores de precio de cierre, beneficio, stop loss y take profit, las operaciones de entrada se utilizan para registrar el precio y la hora de apertura. Estos datos específicos se utilizan para generar varios elementos gráficos, como líneas de tendencia que muestran el movimiento del precio durante la transacción, etiquetas de texto que indican ganancias o pérdidas, y rectángulos que representan las zonas de toma de beneficios y stop-loss. Este método garantiza que los datos comerciales históricos se muestren en la pantalla de manera eficiente, brindando información importante sobre el rendimiento anterior.
Salida:
Conclusión
En este artículo, exploramos el trabajo con objetos en MQL5, centrándonos en la construcción y modificación de elementos de gráficos para mejorar el análisis comercial. Hemos tratado la creación de rectángulos para las zonas de toma de beneficios y stop-loss, líneas de tendencia para seguir los cambios de precios y etiquetas de texto para los datos de negociación importantes. También examinamos cómo mostrar las operaciones anteriores mediante etiquetas y ayudas visuales, ofreciendo una imagen clara del rendimiento histórico.
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/15764





- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso