Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Se ha añadido la posibilidad de cambiar mediante programación el color de los marcos de los elementos y asociarlos a los valores de los parámetros. Se trata de un indicador informativo y útil que ayuda a darse cuenta rápidamente del nivel de riesgo de los valores introducidos. Resultó práctico y claro. Además, en caso de sobrepasar los límites fijados, aparecen ventanas de advertencia.
Algunos ejemplos:
Mañana lo veremos con ejemplos y código.
Antes de continuar con el tema de la implementación de la protección escalonada de los límites de los parámetros y las advertencias al usuario, debemos mencionar otro tema que le precede directamente. A saber, el preajuste de parámetros.
Empezaré por lo conocido: la mayoría de los programas MQL tienen variables de la categoría de entrada. Se declaran a nivel global y son visibles en una única ventana de configuración. La ventana aparece al inicio del programa y dentro de ella el usuario puede cambiar los valores iniciales de las variables "externas", si surge tal necesidad. Pero antes, el usuario inicializa las variables externas dentro del programa. La cuestión es que los preajustes del programa no son universales, y por eso hay una categoría de variables que requieren la posibilidad de ajuste en cada inicio. También se sabe que cualquier intento de acceder manualmente a las variables externas durante la ejecución del programa es imposible y requiere un reinicio. Con una interfaz gráfica, se elimina esta necesidad. Los ajustes del programa pueden abrirse en tiempo de ejecución.
Sin embargo, sigue existiendo la misma necesidad de establecer los valores iniciales de los parámetros del programa al inicio.
Si tenemos una interfaz gráfica , no tiene sentido declarar variables del tipo de entrada, porque ya no necesitamos la ventana de ajustes estándar , pero la esencia sigue siendo la misma. En lugar de variables deentrada, debemos establecer valores iniciales a los parámetros de los controles.
En la inicialización del programa debemos llamar a alguna función que establezca valores iniciales a nuestras propias ventanas, no a la ventana estándar. Como opción, esto se puede hacer en el KIB-constructor, en la etapa de construcción de la interfaz, cuando se establecen los valores V_CURRENT, o los estados ON/OFF, etc., pero ahora es posible inicializar los elementos mediante programación. Ahora es posible combinar la inicialización de elementos en el constructor y en el programa.
Por lo tanto, necesitamos una función especial llamada desde OnInit() para hacer este trabajo.
Que hará exactamente esta función:
¿Cómo se llamará la función?
Yo la llamaría Initialize(), pero cualquiera puede inventar su propia variante.
Loprincipal es que esta función debe estar en cualquier interfaz Expert Advisor. Se puede comparar con la función OnTick() de un Asesor Experto o OnCalculate() de un indicador. Es importante entender esto.
¿Qué valor devolverá la función?
La función será de tipo void. No hay necesidad de devolver un valor. Cuando es llamada, abrirá las ventanas necesarias, inicializará los parámetros de los elementos, y posiblemente preestablecerá algunas propiedades. Eso es básicamente todo. Teóricamente, se pueden establecer límites de parámetros iniciales en ella, pero creo que el control de valores se implementará en una función separada llamada en eventos de elementos desde el archivo API y desde el temporizador. Probablemente escribiré una impresión de las llamadas de control en la próxima versión.
*Es importantetener en cuenta que en estos momentos el concepto de interfaz Expert Advisors se está formando y nos esperan muchos descubrimientos.
He aquí un ejemplo de la función de inicialización de un Asesor Experto de interfaz en el contexto del actual proyecto de demostración:
1. 1. Llamada a la función:
2. Implementación de la función:
Hasta ahora, veo la estructura de la función de la siguiente manera. Una función muy simple. Abre ventanas y envía los valores requeridos a los parámetros de los elementos. Es posible cambiar la inicialización de los elementos y la apertura de las ventanas en algunos lugares, porque la apertura de las ventanas mostrará inmediatamente los valores requeridos de los elementos sin redibujado adicional. Sin embargo, estas son cosas menores.
Entonces pasemos al tema principal: la implementación de la protección paso a paso de los parámetros.
14.realización de la protección escalonada de los límites de los parámetros:
//------------------------------------------------------------------------------------------------------------
Escribiendo la lógica de control de los ajustes dentro de los límites preestablecidos, y creando un sistema de avisos:
//-----------------------------------------------------------------------------
Procedamos:
1. Establezcamos los valores iniciales de los parámetros de los elementos seleccionados y abramos las ventanas necesarias. Para ello, escribamos la funciónInitialise() y llamémosla en la función _OnInit().
Resultado: Se abren las ventanas necesarias y se establecen los valores iniciales de los elementos de destino.
2. Abrir el archivo API y escribir la conexión de los elementos. En el caso de cada elemento, escribir las llamadas y pasar el valor a los otros elementos de destino en la cadena:
3. Pruebe la conexión:
Resultado: los valores de los elementos se conectan según lo previsto.
4. Escribir una función para controlar los parámetros de nuestro grupo de elementos: void Risk_management_group_1().
5. Llame a la función Risk_management_group_1() desde la función _OnInit():
Resultado: funciona según lo previsto, pero al introducir un valor en el campo de entrada, la ventana de advertencia no restablece el valor introducido cuando aparece(requiere mejoras).
(*También - el ajuste del color del marco se añadió en la actualización, pero falta en la versión actual).
La siguiente tarea es considerar la posibilidad de cancelar los parámetros introducidos pulsando el botón "Cancelar".
Esta es una tarea muy difícil, pero ya la he implementado parcialmente. Intentaré restaurar la funcionalidad anterior.
En el último desglose mostré cómo aplicar la indicación de riesgo por colores y abrir ventanas de bloqueo al cruzar los límites de los parámetros establecidos. Sin embargo, se descubrieron dos problemas que no esperaba.
1. La función de gestión de riesgos abre la primera ventana de aviso cuando se cruza un nivel peligroso, pero si se mantiene pulsado el cursor sobre el elemento en ese momento, el valor sigue creciendo y alcanza el siguiente nivel condicional. - Crítico.
2. Cuando se cruza el valor crítico, se abre la última ventana de advertencia, pero tampoco impide que el valor cambie si el usuario sigue manteniendo pulsado el botón izquierdo del ratón.
3. Si el usuario suelta el botón del ratón y quiere cerrar las ventanas de aviso, no puede hacerlo. Para ser más precisos, no puede. La razón es que las dos ventanas de bloqueo empiezan a bloquearse mutuamente. Cuando una de las ventanas de bloqueo está abierta, se cierra fácilmente, pero cuando hay dos ventanas abiertas al mismo tiempo, nada más en la interfaz puede funcionar. El programa entra en estado de estupor, aunque sigue funcionando.
La imagen de abajo muestra cómo ocurrió esto:
Entonces, arreglé los problemas de bloqueo mutuo de las ventanas de configuración y ahora las ventanas no interfieren entre sí. Realizan la función de bloqueo conjuntamente sin entrar en conflicto unas con otras.
Ahora tengo que hacer que la ventana de advertencia detenga automáticamente los cambios en el valor del parámetro, incluso si se pulsa el botón izquierdo del ratón y el elemento está activo.