Discusión sobre el artículo "Cómo añadir rápidamente un panel de control a un indicador o asesor"

 

Artículo publicado Cómo añadir rápidamente un panel de control a un indicador o asesor:

¿Quiere añadir a su indicador o asesor un panel gráfico de control rápido y cómodo, pero no sabe como hacerlo? En este artículo le enseñaré paso a paso cómo "atornillar" un panel de diálogo con parámetros de entrada a su programa MQL4/MQL5.

Su programa - indicador o asesor - MQL4/MQL5 puede ser uno de los mejores y ejecutar eficazmente todas las tareas que se le encarguen. Pero siempre hay forma de mejorarlo un poco. Normalmente, en el 99% de los casos, para realizar cualquier cambio en los parámetros de entrada de un programa, el usuario tiene que entrar en sus ajustes. ¿Quiere arreglárselas sin hacer esto?

Es posible hacerlo creando su propio panel de control basado en las clases de la Biblioteca estándar. Esto le permitirá cambiar los ajustes sin reiniciar el programa. Además, este enfoque revitalizará el programa, distinguiéndolo de otros de forma positiva. Podrá ver ejemplos de paneles gráficos en el Mercado.

En este artículo le enseñaré a añadir sin ayuda de nadie un sencillo panel a un programa MQL4/MQL5. Usted ya sabe cómo enseñar a un programa a leer los parámetros de entrada y a reaccionar a los cambios de sus valores.

2.2. Panel

Aspecto del panel "PanelDialog2.mqh" después de introducir los cambios definitivos:

Panel number two

Fig. 4. Panel número dos

¿Qué obtenemos tras unir el asesor "MACD Sample.mq5" y el panel "PanelDialog2.mqh"? En el marco temporal actual, en el que funcionará el asesor, se pueden cambiar de forma operativa los parámetros del asesor ("Lots", "Trailing Stop Level (in pips)" y otros), así como los parámetros de notificación sobre los eventos comerciales del asesor ("Mail", "Push", "Alert").

Los parámetros modificados del asesor ("Lots", "Trailing Stop Level (in pips)" y otros) se aplican después de pulsar el botón "Aplicar cambios".". El cambio de los parámetros de notificación sobre los eventos comerciales del asesor ("Mail", "Push", "Alert") se aplica de forma automática, no es necesario pulsar el botón "Aplicar cambios".

Autor: Karputov Vladimir

 
Bastante útil. Gracias.
[Eliminado]  
Gracias por el artículo. ¿Cómo puedo cambiar el color del fondo y del borde del propio panel? No lo he encontrado en las clases estándar.
 
Maxim Dmitrievsky:
Gracias por el artículo. ¿Cómo puedo cambiar el color del fondo y del borde del propio panel? No lo he encontrado en las clases estándar.
Si usas la forma simple, no puedes. No he buscado una forma complicada.
 
Maxim Dmitrievsky:
Gracias por el artículo. ¿Cómo puedo cambiar el color del fondo y del borde del propio panel? No lo he encontrado en las clases estándar.
Override define en Defines.mqh.
 
Andrey Khatimlianskii:
Redefine defines en Defines.mqh.
  1. En la próxima actualización se restaurará la biblioteca estándar y el archivo Defines.mqh se restaurará en consecuencia.
  2. No es bueno editar la biblioteca estándar.
 
Karputov Vladimir:
  1. En la próxima actualización se restaurará la biblioteca estándar - en consecuencia se restaurará el archivo Defines.mqh.
  2. No es bueno editar la biblioteca estándar.
Yo no sugiero editarla. Deberías redefinirla después de incluir este archivo, pero antes de crear el panel.
[Eliminado]  
Andrey Khatimlianskii:
No sugerí editarlo. Tienes que anularlo después de habilitar este archivo, pero antes de crear el panel.
Me podrias decir como hacerlo en un ejemplo sencillo, no soy muy bueno en oop. He cambiado los colores de las definiciones en la propia librería, el color del panel no cambia.
 
Maxim Dmitrievsky:
Por favor dime como hacerlo en un ejemplo sencillo, no se mucho de oop. He cambiado los colores de las definiciones en la propia librería - el color del panel no cambia

Después de cambiar el archivo, recompila el EA, debería funcionar. Y no se olvide de hacer una copia de seguridad para restaurar su variante después de la actualización.

Overriding se hace usando #undef y #define. Pero hay que ponerlos en el lugar correcto ;)

 
Andrey Khatimlianskii:

El overriding se hace con #undef y #define. Pero hay que ponerlos en el lugar correcto ;)

El único detalle que distingue ... de ... .
[Eliminado]  
Andrey Khatimlianskii:

Después de cambiar el archivo, recompila el EA, debería funcionar. Y no se olvide de hacer una copia de seguridad para restaurar su variante después de la actualización.

Overriding se hace usando #undef y #define. Pero tienes que ponerlos en el lugar correcto ;)

Bueno, así es como lo hice, nada funciona. El panel sigue blanco como antes

El compilador escribe Macro redifinition, es decir, es un tipo de overriding....

//+------------------------------------------------------------------+
//|MyPanel.mqh
//|Copyright © 2013, DeltaTrader ||
//| http://www.deltatrader.com.br 
//+------------------------------------------------------------------+
#property copyright     "DeltaTrader © 2013"
#property link          "www.deltatrader.com.br"
#property version       "1.000"
#property description   "Test Panel"
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Incluye|
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Defines.mqh>

#define  CONTROLS_DIALOG_COLOR_BORDER_LIGHT  C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_BORDER_DARK  C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_BG            C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_CLIENT_BG     C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0x00,0x00,0xFF'

//+------------------------------------------------------------------+
//| Parámetros globales|
//+------------------------------------------------------------------+
int      panelXX     =  200;
int      panelYY     =  200;
int      panelWidth  =  600;
int      panelHeight =  400;

CAppDialog m_panel;

//--- Objetos de oferta
CPanel m_bidcolor;
CLabel m_bidlabel;
 

//--- Pedir objetos
CPanel m_askcolor;
CLabel m_asklabel;
CEdit m_edit;
//+------------------------------------------------------------------+
//| On Init|
//+------------------------------------------------------------------+
int OnInit() 
  {
//--- Creación de paneles
   m_panel.Create(0,"blablabla",0,panelXX,panelYY,panelWidth,panelHeight);
//--- Etiqueta de oferta y colores
   m_bidcolor.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_bidcolor.ColorBackground(clrYellow);
   m_panel.Add(m_bidcolor);
   
   m_bidlabel.Create(0,"Bid Text",0,5,5,0,0);
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   m_bidlabel.Color(clrBlue);
   m_panel.Add(m_bidlabel);
//--- Pedir etiquetas y colores
   m_askcolor.Create(0,"Ask Background Color",0,1,1,panelWidth-30,30);
   m_askcolor.ColorBackground(clrAqua);
   m_panel.Add(m_askcolor);
   
   m_asklabel.Create(0,"Ask Text",0,5,30,0,0);
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
   m_asklabel.Color(clrRed);
   m_panel.Add(m_asklabel);
   
   m_edit.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_panel.Add(m_edit);
//--- Ejecutar panel
   m_panel.Run();
   return(0);
  }
//+------------------------------------------------------------------+
//| On DeInit|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Destruir panel
   m_panel.Destroy(reason);
//--- Borrar todos los objetos
   ObjectsDeleteAll(0,0);
  }
//+------------------------------------------------------------------+
//| En Calcular|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- Una etiqueta de oferta muy simple
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
//--- Una etiqueta ask muy simple
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| En Evento Gráfico|
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Mueve el panel con el ratón
   m_panel.ChartEvent(id,lparam,dparam,sparam);
//--- 
  }
//+------------------------------------------------------------------+