English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Controles gráficos personalizados. Parte 2. Librería de control

Controles gráficos personalizados. Parte 2. Librería de control

MetaTrader 5Ejemplos | 24 diciembre 2013, 07:54
1 186 0
Dmitry Fedoseev
Dmitry Fedoseev

Introducción

El artículo "Controles gráficos personalizados. Parte 1. Crear un control simple" establece los principios de la creación de controles gráficos donde se creó el conjunto de controles para resolver los principales problemas que surgen en la interacción del programa (asesor experto, script, indicador) con el usuario.

Algunos controles se corresponden casi completamente con los ya conocidos controles estándar, mientras que otros se desarrollaron con la debida consideración de las características y posibilidades del terminal. Todos los controles han sido diseñados como clases independientes y se han añadido al archivo IncGUI.mqh que hemos usado en artículos anteriores (su nuevo nombre es IncGUI_v2.mqh).

Aparte de las nuevas clases de control añadidas, el archivo presenta más cambios: la clase CGraphicObjectShell ha sido modificada añadiéndose los métodos para el establecimiento simultáneo de las coordenadas y tamaños SetXYDistance(), SetXYSize() y para corregir un error de escritura de la palabra Distance en algunos nombres del método (se escribió como Distanse).

En la clase CInputBox se ha corregido un error de escritura en el métodoSetValueString() (que se había escrito como SetValueStrind), y se han añadido los métodos SetReadOnly() y ReadOnly(). El método SetReadOnly() habilita/deshabilita la entrada de teclado en el cuadro de texto, mientras que el método ReadOnly() permite determinar si se permite o no la entrada desde el teclado.

El orden de las muestras de color mostrado en pantalla usando el método Show() ha sido modificado en la clase CColorSchemes. Los esquemas de color disponen ahora de más colores de lo esperado y, por tanto, los esquemas se disponen verticalmente mientras que los colores se representan horizontalmente. Además, se han añadido algunos nuevos esquemas de color a la clase CColorSchemes.

Este artículo proporciona una librería con los siguientes controles:

  1. CInputBox (cuadro de entrada),
  2. CSpinInputBox (cuadro de entrada del botón Spin),
  3. CCheckBox (casilla de verificación),
  4. CRadioGroup (grupo de botón de radio),
  5. CVSсrollBar (barra de desplazamiento vertical),
  6. CHSсrollBar (barra de desplazamiento horizontal),
  7. CList (Lista),
  8. CListMS (Lista de selección múltiple),
  9. CComBox (Lista desplegable),
  10. CHMenu (Menú horizontal),
  11. CVMenu (Menú vertical),
  12. CHProgress (Barra de progreso horizontal),
  13. CDialer (Dialer),
  14. CDialerInputBox (Dialer con cuadro de entrada),
  15. CTable (Tabla).  

Vamos a ver cada control con ejemplos de uso (excepto para CInputBox, ya que para este se realizó una revisión exhaustiva en el artículo "Controles gráficos personalizados. Parte 1. Creando un control simple").


1. Clase CSpinInputBox

Cuadro de entrada del botón Spin (Fig. 1).

 Fig. 1. Clase CSpinInputBox (cuadro de entrada del botón Spin),
Fig. 1. Clase CSpinInputBox (cuadro de entrada del botón Spin)

Al hacer clic en el botón "+" el valor en el cuadro de texto se incrementa en una cantidad preestablecida y al hacer clic en el botón "-" la misma se reduce.

Además de cambiar los valores en el botón spin, puede habilitar la entrada desde el teclado en el cuadro de texto (método SetReadOnly()). Este control se basa en CInputBox funcionando en modo numérico y tiene métodos similares para establecer los límites del valor: SetMaxValue() y SetMinValue().

A diferecnia de CInputBox, al llamar al método Init() en la clase CSpinInputBo, se transmite el parámetro Change, en lugar de Digits, que representa el cambio en el valor por los botones spin. El valor del parámetro Change define el número de posiciones decimales de acuerdo con los cuales se formatea el valor en el cuadro de texto. Puede realizar los ajustes programáticamente y obtener el valor usando los métodos SetValue() y Value(). El número de posiciones decimales en que se da formato al valor puede recibirse usando el método Digits().

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


2. Clase CCheckBox

Checkbox o interruptor On-Off (Fig. 2).

Fig. 2. Clase CCheckBox (Checkbox o interruptor On-Off)
Fig. 2. Clase CCheckBox (Checkbox o interruptor On-Off)

Es un control muy simple que puede tomar uno de los dos valores: on y off. En el estado "off" representa un cuadrado. En el estado "on" aparece un tick en el cuadrado. Puede realizar los ajustes programáticamente y obtener el valor usando los métodos SetValue() y Value().

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


3. Clase CRadioGroup

Grupo de botón de radio (Fig. 3).

Fig. 3. Clase CRadioGroup (grupo de botón de radio),
Fig. 3. Clase CRadioGroup (grupo de botón de radio)

El grupo botón de radio realiza una selección entra varias opciones (por ejemplo, selecciona el tipo de orden). El control se usa de la misma forma que otros controles. Primero se llama al método Init(), especificando el nombre del grupo en los parámetros, y a continuación se crean los botones. La creación de botones se realiza a través del método AddButton().

En el primer parámetro del método AddButton() se define el encabezamiento ubicado a la derecha del ratón, seguido de las coordenadas X e Y relativas a las coordenadas de todo el control.

De esta forma, los botones en el grupo pueden disponerse en cualquier orden (no solo horizontal y vertical) y todo el grupo del botón puede moverse cambiando las coordenadas del grupo sin recalcular las coordenadas de cada botón individual. El método AddButton() debe llamarse tantas veces como botones se quieran crear en el grupo.

Después de crear los botones, debe especificarse un botón para el método SetValue() que solo tiene un parámetro que indica el índice del botón seleccionado. Los botones se numeran desde cero en adelante en el orden en que fueron creados por el método AddButton(). Para obtener el índice de un botón seleccionado se usa el método Value().

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


4. Clase CVSсrollBar  

Barra de desplazamiento vertical (Fig. 4).

Fig. 4. Clase CVSсrollBar (barra de desplazamiento vertical), 
Fig. 4. Clase CVSсrollBar (barra de desplazamiento vertical)

Este es un control conocido y muy habitual. La barra de desplazamiento vertical tiene sus propias propiedades: valor mínimo, valor máximo, (que define el rango válido de los valores del control), cambio menor (cambio del valor cuando se hace clic en el área comprendida entre el botón de desplazamiento y el cuadro de desplazamiento).

Además de los cambios en el valor por un cambio menor al hacer clic en los botones de desplazamiento y un cambio mayoral hacer clic en el área comprendida entre el cuadro de desplazamiento y los botones de desplazamiento, también es posible mover el cuadro de desplazamiento a una posición determinada. Para hacer esto debemos hacer clic en el cuadro de desplazamiento para que quede seleccionado (cambiará el color) y luego hacer clic en el lugar deseado. El cuadro de desplazamiento irá al lugar indicado y quedará deseleccionado.

Si el cuadro de desplazamiento ha sido seleccionado por error, debe hacer clic en él de nuevo y deseleccionarlo. Si hace clic en algunos de los botones de desplazamiento mientras que el cuadro de desplazamiento está seleccionado, este último irá al inicio o al final y el control obtendrá el valor mínimo o máximo, respectivamente.

La aplicación del control se inicia con la llamada el método Init() al especificar el nombre, altura y tamaño condicional (de 1 a 4) en los parámetros.

El rango del valor es definido por los métodos SetMin() y SetMax() y los valores de cambio menor y mayor son establecidos por los métodos SetSmallChange() y SetLargeChange() respectivamente. El valor del control (posición del cuadro de desplazamiento) es recibido usando el método Value().

La posición del cuadro de control puede modificarse utilizando el método SetValue(). 

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


5. Clase CHSсrollBar

Barra de desplazamiento horizontal (Fig. 5).

Fig. 5. CHSсrollBar (barra de desplazamiento horizontal), 
Fig. 5. CHSсrollBar (barra de desplazamiento horizontal)

Este control es completamente idéntico a la barra de desplazamiento vertical, excepto que al llamar al método Init() el segundo parámetro a especificar es el ancho de la barra en lugar de la altura de esta.

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


6. Clase CList

List (Fig. 6.)

Fig. 6. Clase CList (Lista),
Fig. 6. Clase CList (Lista)

Este control representa algunos cuadros de texto que muestran los elementos de la lista. El número de cuadros visibles se define con la inicialización del control. Si el número de los elementos de la lista excede el número de cuadros visibles, aparecerá la barra de desplazamiento vertical.

Puede seleccionarse uno de los elementos de la lista (elemento color en la Fig. 6). En lo que respecta a la selección del elemento, el control puede operar de dos modos: permitiendo o no la deselección del elemento, donde estos modos se establecen en el método SetAllowDeselect().

El nombre del control, su anchura en píxels y la altura en número de elementos son transmitidos cuando se llama al método Init().

A continuación del método Init() se usa el método AddItem() para añadir un nuevo elemento a la lista. Entonces, si es necesario, se establece un elemento seleccionado por el método SetSelectedIndex(). Un elemento puede se siempre deseleccionado programáticamente transmitiendo el valor -1 al método SetSelectedIndex().

Un elemento seleccionado puede ser identificado por el método SetSelectedIndex(). Si el método devuelve -1 no hay elemento seleccionado en la lista. Además, el texto de un elemento seleccionado puede ser recibido utilizando el método SelectedText().

Para recibir el texto de cualquier elemento de la lista se usa el método Text() especificando el índice del elemento. Es posible modificar cualquier texto del elemento usando el método SetText(). DeleteItem() borra el elemento y el método Clear() vacía la lista entera. 

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


7. Clase CListMS

Lista de selección múltiple (Fig. 7.)

Fig. 7. Clase CListMS (Lista de selección múltiple),
Fig. 7. Clase CListMS (Lista de selección múltiple)

Este control es idéntico al control "List" con una excepción: se permite la existencia simultánea de múltiples elementos seleccionados. Por consiguiente, se usa otra forma distinta para acceder a los elementos seleccionados.

Al trabajar con listas simples, el método SetSelected() recibe un parámetro que indica el índice del elemento seleccionado (al seleccionar el elemento nuevo, el elemento anterior se deselecciona). En la lista de selección múltiple se transmiten dos parámetros al método SetSelected(): el estado del índice y del elemento (verdadero/falso - seleccionado/no seleccionado). Para comprobar si el elemento está seleccionado se utiliza el método Selected(), que recibe el índice del elemento sometido a comprobación.

Los métodos FirstSelected() y NextSelected() se usan para manejar todos los elementos seleccionados. El método FirstSelected() devuelve el índice del primer elemento de la lista seleccionado. El método NextSelected() devuelve el índice del próximo elemento seleccionado que sigue al índice del elemento recibido en la última llamada a los métodos FirstSelected() o NextSelected().

Puede usarse la siguiente estructura para iterar a través de todos los elementos seleccionados: 

// Iteración de todos los elementos seleccionados 

int Selected=lstm.FirstSelected();
    while(Selected!=-1){
        //=======================================
        // Una acción con el elemento seleccionado        
        // ======================================
       Selected=lstm.NextSelected();
   } 

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


8. Clase CComBox

Lista desplegable (Fig. 8.1.)

Fig. 8.1. Clase CComBox (Lista desplegable)
Fig. 8.1. Clase CComBox (Lista desplegable)

Este control representa un cuadro de texto con un pequeño botón sobre el que se necesita hacer clic para que se despliegue la lista (Fig 8.2). El control "List" se usa para mostrar la lista en pantalla. El texto del elemento seleccionado en la lista se muestra en pantalla en el cuadro de texto visible.

Este control puede usarse de dos formas: la primera solo permite la selección desde la lista y la segunda permite la entrada desde el teclado (el modo se establece en el método SetReadOnly()). Por tanto, hay algunas diferencias entre este control y la lista.

Si el valor introducido desde el teclado está en la lista, se seleccionará el elemento de la lista correspondiente y el método SelectedIndex() devolverá el índice de este elemento.

Si el valor introducido no se encuentra en la lista, el método SelectedIndex() devolverá -1 y, por tanto, para recibir el valor de este control se usa el método Value(), que devuelve los contenidos del cuadro de texto visible. Por ello, para establecer programáticamente el valor, podemos usar el método SetSelectedIndex() (equivalente a hacer clic en el elemento) o bien el método SetValue() (equivalente a introducir un valor a través del teclado).

Fig. 8.2. Lista desplegable expandida
Fig. 8.2. Lista desplegable expandida

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


9. Clase CHMenu

Menú horizontal (Fig. 9.1).

Fig. 9.1. CHMenu (Menú horizontal)
Fig. 9.1. CHMenu (Menú horizontal)

Este control representa varios cuadros de texto con los elementos de menú dispuestos en una fila horizontal y con botones en los laterales. Los botones laterales con una línea vertical se usan para desplazarse a través del menú hasta su inicio o final y los botones flecha se usan para desplazarse por una "pantalla" (por el número de elementos visibles). La finalidad principal del menú es la ejecución de acciones en el programa.

Al hacer clic en el elemento del menú se genera un evento donde debe ejecutarse un comando. Además de la ejecución directa de comandos, el menú puede usarse para habilitar/deshabilitar cualquier instrumento.

Por ejemplo, el asesor experto tiene algunas funciones para cerrar una posición: usando los indicadores 1, 2 y 3. Un usuario puede habilitar una o todas las posiciones o cualquier combinación de dos instrumentos para cerrar la posición usando el indicador que señaliza en primer lugar el cierre.

Se aconseja el siguiente esquema: al hacer clic en el menú, aparece una ventana para establecer los parámetros del instrumento o habilitar a este, por lo que el usuario establece los parámetros, habilita el instrumento, hace clic en "Ok" y el instrumento comienza a funcionar.

Para ver claramente qué instrumentos están funcionando actualmente, hay un método para marcar el elemento (el signo de verificación): el método SetChecked(). Si el menú contiene los elementos seleccionados, cambia el color para dejar claro que hay instrumentos habilitados en el menú, incluso si el elemento habilitado es desplazado fuera de la vista. Podemos identificar cualquier elemento verificado de forma programática usando el método CheckedExist() y ver si un determinado elemento de menú es verificado usando el método Checked().

Fig. 9.2. Menú horizontal con un elemento verificado
Fig. 9.2. Menú horizontal con un elemento verificado

La aplicación de este control así como la de todos los demás controles se inicia con el método Init() al que se envía el nombre del control, su anchura en píxels y el número de elementos visibles. Para añadir elementos se usa el método AddItem() a continuación del método Init().

Como este control implica mostrar en pantalla los otros controles en respuesta a sus comandos, tiene métodos para obtener las coordenadas del elemento de menú sobre el que se hace clic, un método para obtener un cuarto de pantalla donde el elemento es ubicado y un método para obtener la anchura del elemento y así ubicar el control mostrado en pantalla en un cuarto de pantalla apropiado.

Los métodos LastClickedX() y LastClickedY() se usan para obtener las coordenadas, el método LastClickedQuarter() se usa para obtener el cuarto (valor 1 - esquina superior izquierda, 2 - esquina superior derecha, 3 - esquina inferior izquierda, 4 - esquina inferior derecha) y el método LastClickedW() el ancho del elemento.

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


10. Clase CVMenu

Menú vertical (Fig. 10).

Fig. 10. Clase CVMenu (Menú vertical)
Fig. 10. Clase CVMenu (Menú vertical)

Este control es completamente idéntico al menú horizontal en términos de su finalidad, funcionalidades y uso, excepto que sus elementos se disponen verticalmente y se usa una barra de desplazamiento vertical. Hay sin embargo una diferencia. En lugar de usar el método LastClickedW() del menú horizontal para obtener el ancho del elemento, se usa el método ItemHeight() para definir la altura del elemento.

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


11. Clase CHProgress

Barra de progreso horizontal (Fig. 11).

Fig. 11. CHProgress (Barra de progreso horizontal) 
Fig. 11. CHProgress (Barra de progreso horizontal)

Este control controla el progreso de una tarea en formato porcentual. Por ejemplo, se requiere realizar cálculos complejos que requieren mucho tiempo para cada barra en el gráfico para la investigación. Sería interesante conocer hasta qué punto se ha realizado la tarea, el tiempo restante hasta el final para planificar nuestro tiempo o, al menos, para saber que el programa está aun ejecutándose y no se ha parado. La parte izquierda de la barra de progreso muestra en pantalla el porcentaje de realización y la parte derecha el tiempo estimado para completar la tarea.

Al llamar al método Init() se le envían dos parámetros: el nombre y el ancho en píxels. Justo ante de entrar al bucle controlado, es necesario llamar al método Begin() que recibe los parámetros del bucle: el valor máximo y el mínimo. Dentro del bucle, el método SetValue() establece el valor mostrado por la barra de progreso. Al salir del buble, el método Reset() restablece la barra de progreso a su forma original.

Cada llamada del método SetValue() invoca el redibujado de los objetos gráficos, por lo que el uso de la barra de progreso puede convertirse en el mayor consumidor de recursos de procesador, incrementando significativamente el tiempo de ejecución del bucle hasta el punto de hacer que el uso de la barra de progreso sea ineficiente. Y para esta situación el control dispone del método SetRefreshInterval() al que se envía el valor del intervalo de actualización en segundos.

Cuando se ha establecido el intervalo de actualización, el método SetValue() en cada llamada comprobará primero el tiempo de la última actualización del control y solo en el caso de que dicho tiempo exceda del intervalo establecido, se realizará el cálculo y se redibujará la barra de progreso. 

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


12. Clase CDialer

Dialer (dispositivo de marcación, Fig. 12.)

Fig. 12. Clase CDialer (Dialer, dispositivo de marcación),
Fig. 12. Clase CDialer (Dialer, dispositivo de marcación)

Este control se usa en la clase CDialerInputBox pero también puede usarse de forma independiente.

Por ejemplo, el control se hace visible presionando cualquier botón. El usuario marca un valor, presiona "Ok" y a continuación el programa utiliza el valor recibido por el método Value() que es básicamente lo que se hace en el dialer con el control de cuadro de entrada, donde el último valor introducido siempre se muestra en pantalla en el cuadro de texto junto al que se sitúa el botón que expande el dialer.

Al método Init() se le envía un parámetro, el nombre.

Botones: "X" - cierra el dialer sin cambiar el valor. "C" - restablece el valor introducido. "OK" - usa el valor introducido, el uso de los botones de números es obvio, punto decimal, introduce la parte decimal de un número. Botón "-" - cambia el signo de un número (positivo/negativo). Los números introducidos se muestran en pantalla en el cuadro de texto en la parte inferior del dialer.

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


13. Clase CDialerInputBox

Dialer con cuadro de entrada (Fig. 13).

Fig. 13. Clase CDialerInputBox (Dialer con cuadro de entrada),
Fig. 13. Clase CDialerInputBox (Dialer con cuadro de entrada)

El control está basado en el cuadro de entrada y los controles del dialer y representa un cuadro de texto con un botón para expandir el dialer ubicado junto a él. El control puede funcionar de dos formas: entrada a través del dialer y, además de este, a través de la entrada del teclado.

El método SetReadOnly() habilita/deshabilita la entrada desde el teclado. 

Se envían cuatro parámetros al método Init(): el nombre, la anchura en píxels, el número de posiciones decimales en función de las cuales se dará formato al valor para mostrar en pantalla, y el encabezamiento mostrado junto al control. 

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


14. Clase CTable

Tabla (Fig. 14).

Fig. 14. Clase CTable (Tabla). 
Fig. 14. Clase CTable (Tabla)

El nombre del control habla por sí mismo, muestra en pantalla las tablas de datos. 

Se envían tres parámetros al método Init(): el nombre, la anchura y la altura en píxels. El tamaño de la tabla actual es definido por el número de filas, columnas y sus tamaños pero no puede exceder de los valores del tamaño especificado en la llamada de Init(). Si el tamaño real de la tabla excede los valores especificados en la llamada de Init(), se muestran en pantalla las barras de desplazamiento.

Uso. A continuación de la inicialización de la tabla por el método Init(), se define el número de columnas de la tabla por el método SetCollsCount() y se define el número de filas por el método SetRowsCount(). Puede usarse el método AddRow() en lugar del método SetRowsCount(). Cada vez que es llamado, se añade una fila a la tabla. Después de definir el tamaño de la tabla (número de columnas y filas), las celdas pueden rellenarse con sus valores.

Se usa el método SetCellText() para rellenar los valores de las celdas. Además del texto de las celdas, pueden modificarse todas las demás propiedades: color de fondo, color de texto, tamaño de fuente (métodos SetCellBGColor(), SetCellTxtColor(), SetCellFontSize(), SetCellFont()). La altura de fila puede cambiarse modificando el método SetRowHeight() y el ancho de columna puede cambiarse modificando el método SetCollWidth().

El método SetCellsMerge() se usa para combinar múltiples celdas en una sola y tiene cuatro parámetros: índice de fila, indice de columna y los parámetros RowSpan y CollSpan (similar a los atributos RowSpan y CollSpan en HTML).

El parámetro RowSpan define el número de celdas combinadas verticalmente y el parámetro CollSpan define el número de celdas combinadas horizontalmente. Las celdas combinadas pueden restablecerse estableciendo los valores de RowSpan y CollSpan iguales a 1.

Para hacer más cómoda la visualización, la tabla dispone de una función mirilla. Al hacer clic en una celda, la fila y la columna de esa celda es resaltada en un color diferente. Al hacer clic de nuevo en la misma fila, la tabla vuelve al color estándar (y también la barra de desplazamiento). La función mirilla es habilitada/deshabilitada por el método SetAllowSelection(). Los métodos LastClickedRow() y LastClickedColl() ayudan a identificar la celda sobre la que se hizo clic.

Se usa el método HTML() para obtener código HTML de la tabla y guardarlo en un archivo html para poder verlo posteriormente en el navegador. Sin embargo, este método puede usarse también sin tener que mostrar en pantalla el control y obtener únicamente código html de la tabla.

En el archivo eIncGUI_v2_Test_CSpinInputBox.mq5 se encuentra un ejemplo del uso de este control.


Conclusión

El conjunto de controles que hemos visto en este artículo no proporcionarán soluciones para todos los problemas que pueden surgir en la interacción del usuario con el programa, aunque, no obstante, cubrirá los más importantes:

  • Habilitar/deshabilitar usando la casilla de verificación;
  • Selección de diferentes opciones usando un botón de radio y las listas;
  • Algunas opciones para la entrada rápida y sencilla de valores (entrada desde el teclado, entrada desde el botón de giro, entrada del dialer);
  • Medios de visualización de los datos -de nuevo, las listas y la tabla.

En aquellos casos donde estos controles pueden ser insuficientes, pueden usarse algunos de ellos como componentes para desarrollar otros controles que sean más adecuados al problema en cuestión. De cualquier forma, espero que los controles que se proporcionan sean de gran utilidad.


Apéndice

Lista de archivos adjuntos:

  1. IncGUI_v2.mqh es un archivo include con las clases CGraphicObjectShell, CWorkPiece, CColorSchemes, CInputBox y todas las clases de control que hemos visto en este artículo. El archivo debe ubicarse en la carpeta MQL5/Include del terminal de cliente.
  2. eIncGUI_v2_Test_CSpinInputBox.mq5 - un ejemplo del uso de la clase CSpinInputBox. Este y todos los archivos siguientes (desde el 2 al 16) deben ubicarse en la carpeta MQL5/Experts.
  3. eIncGUI_v2_Test_CCheckBox.mq5 - un ejemplo del uso de la clase CCheckBox.
  4. eIncGUI_v2_Test_CRadioGroup.mq5 - un ejemplo del uso de la clase CRadioGroup.
  5. eIncGUI_v2_Test_CVSсrollBar.mq5 - un ejemplo del uso de la clase CVSсrollBar.
  6. eIncGUI_v2_Test_CHSсrollBar.mq5 - un ejemplo del uso de la clase CHSсrollBar.
  7. eIncGUI_v2_Test_CList.mq5 - un ejemplo del uso de la clase CList.
  8. eIncGUI_v2_Test_CListMS.mq5 - un ejemplo del uso de la clase CListMS.
  9. eIncGUI_v2_Test_CComBox.mq5 - un ejemplo del uso de la clase CComBox.
  10. eIncGUI_v2_Test_CHMenu.mq5 - un ejemplo del uso de la clase CHMenu.
  11. eIncGUI_v2_Test_CVMenu.mq5 - un ejemplo del uso de la clase CVMenu.
  12. eIncGUI_v2_Test_CHProgress.mq5 - un ejemplo del uso de la clase CHProgress.
  13. eIncGUI_v2_Test_CDialer.mq5 - un ejemplo del uso de la clase CDialer.
  14. eIncGUI_v2_Test_CDialerInputBox.mq5 - un ejemplo del uso de la clase CDialerInputBox.
  15. eIncGUI_v2_Test_CTable.mq5 - un ejemplo del uso del elemento de la clase CTable.
  16. eIncGUI_v2_Test_All permite la creación de todos los controles de un Expert Advisor.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/313

Controles gráficos personalizados. Parte 3. Formularios Controles gráficos personalizados. Parte 3. Formularios
Este es el último de los tres artículos dedicados a los controles gráficos. En él vamos a ver la creación del principal componente de la interfaz gráfica, el formulario, y su uso en combinación con otros controles. Además de las clases para formularios, las clases CFrame, CButton y CLabel se han añadido a la librería del control.
Asesor Experto basado en las "Nuevas Dimensiones de Trading" ("New Trading Dimensions"), de Bill Williams Asesor Experto basado en las "Nuevas Dimensiones de Trading" ("New Trading Dimensions"), de Bill Williams
En este artículo, trataré el tema del desarrollo del Asesor Experto basándome en el libro "New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds, and Commodities" ("Nuevas dimensiones de trading: como beneficiarse del caos en bolsa, bonos y bienes"), de Bill Williams. La estrategia en sí misma es muy conocida, y su uso todavía causa controversia entre traders. El artículo tiene en cuenta señales de trading del sistema, detalles específicos de implementación, y los resultados de simulaciones en datos históricos.
Resultados del Mercado MQL5 en el primer periodo de 2013 Resultados del Mercado MQL5 en el primer periodo de 2013
Desde el momento de su fundación el Mercado MQL5 (la tienda de robots comerciales e indicadores técnicos) ha atraido a sus filas a más de 250 investigadores y desarrolladores, que han publicado 580 productos. Los resultados del primer periodo de 2013 muestran que algunos vendedores tienen bastante éxito en el Mercado MQL5 y han obtenido con sus ventas un beneficio considerable.
Guía de Simulación y Optimización de Asesores Expertos en MQL5 Guía de Simulación y Optimización de Asesores Expertos en MQL5
Este artículo explica el proceso para identificar y corregir errores de código, así como los pasos para llevar a cabo una simulación y optimizar los parámetros de entrada del Asesor Experto. Aprenderá a usar el Probador de Estrategias del terminal de cliente del MetaTrader 5 para encontrar el mejor símbolo y conjunto de parámetros de entrada para su Asesor Experto.