Discusión sobre el artículo "Mejore sus gráficos comerciales con una GUI interactiva basada en MQL5 (Parte III): Interfaz comercial simple y móvil"

 

Artículo publicado Mejore sus gráficos comerciales con una GUI interactiva basada en MQL5 (Parte III): Interfaz comercial simple y móvil:

En esta serie de artículos analizamos la integración de interfaces gráficas interactivas en paneles comerciales móviles en MQL5. En la tercera parte, utilizaremos los desarrollos de las partes anteriores para convertir paneles comerciales estáticos en dinámicos.

Primero, debemos recordar el material que abarcamos en las dos partes anteriores:

1. En la primera parte analizamos el concepto de eventos del gráfico y luego creamos dos paneles móviles simples en el mismo gráfico.

2. En la segunda parte fuimos aún más lejos: usamos las clases en el archivo .mqh para hacer que nuestro código resulte más eficiente y versátil, listo para la integración con asesores/indicadores completos.

En la tercera parte nos centraremos en mejorar nuestros paneles integrando una GUI en ellos; sin una interfaz gráfica, los paneles no cumplirán su propósito previsto.

Autor: Kailash Bai Mina

 

Hola Kalish,


Interesante enfoque y felicitaciones por terminar tu serie. La codificación OnEvent es lo que hace que todo suceda! Como tu primer artículo me entusiasmó, desarrollé mi propia versión del panel movible. Es una clase base que es heredada por clases individuales para cada tipo de panel.En segundo lugar, como yo ya había creado un archivo de cabecera de los controles que se basó en ejemplos en el archivo de ayuda MQL, opté por usarlo en lugar de crear una clase de texto para la herencia y funcionó bien. Estoy planeando en la creación de dos métodos más para la clase GUI, Guardar e Inicializar. Guardar leerá y actualizar un archivo CSV y establecer las posiciones iniciales de ubicación y datos. Inicializar sill leer el archivo CSV y y establecer las posiciones iniciales.

Para su revisión estoy adjuntando una captura de pantalla de mis actuales encabezados EA y dos paneles. El primero es el de Órdenes Activas que voy a utilizar y la muestra es la versión básica utilizada como plantilla para paneles adicionales.


Buena suerte en sus futuros esfuerzos, voy a estar observando


Cabo Coddah

Archivos adjuntos:
 

El artículo ha estado muy bien. Bien didáctico y explicado. Me ha gustado. 😁👍

 
CapeCoddah de los controles que se basó en ejemplos en el archivo de ayuda MQL, opté por utilizarlo en lugar de crear una clase de texto para la herencia y funcionó bien. Estoy planeando en la creación de dos métodos más para la clase GUI, Guardar e Inicializar. Guardar leerá y actualizar un archivo CSV y establecer las posiciones iniciales de ubicación y datos. Inicializar sill leer el archivo CSV y y establecer las posiciones iniciales.

Para su revisión estoy adjuntando una captura de pantalla de mis actuales encabezados EA y dos paneles. El primero es el Active Orders que voy a utilizar y el Sample es la versión básica utilizada como plantilla para paneles adicionales.


Buena suerte en sus futuros esfuerzos, voy a estar observando


Cabo Coddah

Me alegro de que mis artículos sean de su agrado.

En realidad Usted me motivó a escribir esta parte 3 de lo contrario habría tomado más tiempo debido a la falta de motivación.

Muchas gracias.

Buena suerte a usted también para sus futuros esfuerzos.

 
Daniel Jose #:

El artículo ha estado muy bien. Bien didáctico y explicado. Me ha gustado. 😁👍

El placer es mio. Gracias por el tiempo dedicado.

 

Hola Kailash,

Espero que supervises este articulo ya que no se como poner texto privado.

De todos modos, realmente he incorporado tus conceptos en una forma mucho mejor de organizar un EA. Aquí hay una captura de pantalla de mi versión antigua y una usando tu concepto de Panel movible usando tus conceptos de la parte 2 con múltiples hijos. Aunque todavía está en la etapa de desarrollo preliminar, me permitirá mostrar datos más pertinentes durante las pruebas del modelo.

Ahora mismo tengo una clase hija independiente para cada panel, incluido el controlador.

clsGUI  GUI;
clsAO   AO;
clsBOB  BOB;
clsCTL  CTL;
clsXO   XO;
clsATR  ATR;
clsRSI  RSI;
clsMM   MM;
clsTS   TS;

//clsAO Guis[egElements];
//clsGui GuiS[egElements];
//objeto Guis[egElementos];

Si bien este enfoque es adecuado, conduce a muchas funciones separadas para manejar diversas tareas en los paneles de EA. Un mejor enfoque sería tener una matriz de los niños y lo utilizan como un parámetro en las llamadas a la función reducida. He intentado utilizar los dos primeros enfoques, pero no puedo lanzar los elementos de la matriz a la clase apropiada niño con el fin de llamar a sus funciones públicas únicas.He tenido un éxito limitado en el acceso a las variables públicas mediante el uso de una clase envoltura con la declaración del objeto. Este enfoque parece utilizar la definición de clase de los elementos del elemento de parámetro en lugar de la definición de clase de la matriz.

int Wrapper(object &theobject){

return(theobject.aninteger):

}

int i=Wrapper(Guis[5]);

este enfoque no funciona para Guis[5].Create_Controls(......);

El único enfoque que he visto que funciona es usar c_array para crear un array de punteros a objetos y añadirlos al array. y luego acceder mediante una función que llame a la función c_array AT(location) para asignar el puntero del array a un puntero local del objeto declarado localmente para acceder a las variables hijas localmente.

¿Usted o alguien sabe cómo resolver este problema o proporcionar una referencia a los artículos MQL o documentación que se ocupan de una matriz de clases hijo en lugar de una matriz de una clase?

Muchas muchas gracias y espero tus próximos artículos

CapeCoddah

 

Un buen ejemplo de utilizar la programación orient ada a objetos por el simple hecho de serlo.

Resultó ser engorroso y poco práctico (en mi humilde opinión). Pero funciona, que ya es bueno :)


Deberías añadir OBJPROP_ZORDER porque si no los botones se pulsan de vez en cuando.

void Button::Create(string name, int xDis = 0, int yDis = 0, int xSize = 0, int ySize = 0)
  {
   ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis);
   ObjectSetInteger(0, name, OBJPROP_XSIZE, xSize);
   ObjectSetInteger(0, name, OBJPROP_YSIZE, ySize);
   ObjectSetInteger(0, name, OBJPROP_ZORDER, 1);
   _name = name;
  }
//+------------------------------------------------------------------+
 
Alexander Slavskii #:
Pero funciona, lo cual es bueno :)

Gracias por la sugerencia.

 
Aleksandr Slavskii utilizar la POO por la POO.

Resultó ser engorroso y poco práctico (IMHO). Pero funciona, que ya es bueno :)


Es necesario añadir OBJPROP_ZORDER de lo contrario los botones se presionan de vez en cuando.

Esto no es OOP en absoluto. Estos son métodos de terminal envueltos en clases.

Si un programador quiere hacer una interfaz gráfica de usuario diferente (http de lujo, a través de WebSocket cubierto en otros artículos), no será capaz de hacer nada. Simplemente tirará todo el código del artículo y escribirá otro.

Para cambiar la parte visual radicalmente, pero en el mismo ObjectCreate(xx) - tendrá que reescribir todo.

O como desactivar GUI para que no ocupe CPU en VDS-ka.

¿Dónde está la reutilización? Por qué la GUI está entremezclada con otro código... Ni siquiera podemos hablar de estilos, al menos de colores.

Usando las librerias del articulo, el codigo de un EA tipico se ha hecho mas corto? Pero de ninguna manera, no fue escrito para eso :-)

 
Maxim Kuznetsov #:

no es OOP en absoluto. Son métodos terminales envueltos en clases.

Si un programador quiere hacer una GUI diferente (http de lujo, a través de WebSocket cubierto en otros artículos), él no será capaz de hacer nada. Simplemente tirará todo el código del artículo y escribirá otro.

Para cambiar radicalmente la parte visual, pero sobre el mismo ObjectCreate(xx) - tendrá que reescribirlo todo.

o como desactivar GUI para que no ocupe CPU en VDS-ka

¿Dónde está la reutilización? Por qué la GUI está intercalada con otro código... Ni siquiera podemos hablar de estilos, al menos de colores.

Usando las librerias del articulo, el codigo de un EA tipico se ha hecho mas corto? Pero de ninguna manera, no fue escrito para eso :-)

Bueno, creo que no es del todo correcto hablar de colores aquí.

Pero el hecho de que los botones de compra y venta estén colocados al revés, puede confundir al usuario.


No está claro por qué la interfaz gráfica de usuario debe estar desactivada si se trata de un panel para el comercio manual. Aunque, si no es un panel de negociación, sino uno informativo, entonces sí, es mejor considerar desactivarlo.

Me gusta cómo están organizadas las funciones RectangleLabel::OnEvent y RectangleLabel::Add, es bonito, claro y legible.

He utilizado el mismo principio en mis paneles, pero mi código era un poco demacrado, o algo así. En general, no era bonito. Así que decidí utilizar el código del artículo para un nuevo panel.

Al final el panel quedó bien, pero le dediqué más tiempo que si lo hubiera escrito desde cero.

En general, la conclusión es la siguiente: el artículo es interesante y útil, pero el código del artículo está parcialmente mal pensado.

 
Aleksandr Slavskii #:

Bueno, hablar de colores, no creo que sea muy correcto hablar de colores aquí.

Pero el hecho de que los botones de compra y venta estén colocados al revés, puede despistar al usuario.


No está claro por qué hay que desactivar la GUI si se trata de un panel para trading manual. Aunque, si no es un panel de negociación, sino uno informativo, entonces sí, es mejor considerar desactivarlo.

Me gusta como están organizadas las funciones RectangleLabel::OnEvent y RectangleLabel::Add, son bonitas, claras y legibles.

He utilizado el mismo principio en mis paneles, pero mi código era un poco demacrado, o algo así. En general, no era bonito. Así que decidí utilizar el código del artículo para un nuevo panel.

Al final, conseguí el panel, pero le dediqué más tiempo que si lo hubiera escrito desde cero.

En general, la conclusión es la siguiente: el artículo es interesante y útil, pero el código del artículo está parcialmente mal pensado.

Hay un montón de métodos elaborados con hermosas flechas "cómo implementar UI para que no sea doloroso" :-) MVC y similares. Así que allí front end (win,gtk,qt,web) a veces se puede cambiar con un ligero movimiento de la mano.

Ninguno de ellos ha sido implementado en MQL. Todo es clavado, peor que TurboVision - aunque hay clases de Adam, pero hay modelos allí.

Los individuos han estado escribiendo durante años(!!!) acerca de "fácil y simple" y "interfaz simple", pero es exactamente lo mismo que en este artículo. Un montón de código que no hace nada más fácil. El único efecto es un bonus en la cuenta del autor.