TheXpert: ¿Está tan seguro de que su artículo es perfecto?
Me complace mucho que lo haya leído.
Estaré encantado de responder a todas las preguntas en el hilo correspondiente.
===
Para que no haya malentendidos innecesarios, ¡no tengo nada en contra de Anatoly! Le felicito por el artículo. Pero es necesario responder a las preguntas...
Perdona, ¿te estoy distrayendo por casualidad de escribir otro tutorial o receta?
Si no es así, vamos a seguir discutiendo su artículo sobre el control en la subventana del indicador. Por lo tanto, usted ofrece una solución masiva (o una idea) cómo hacer un menú conveniente en un indicador. Bien, ¡el propósito del artículo es muy digno! Pero, ¿cómo puede un programador "principiante" utilizar todo este arsenal? ¿Dónde colocar las funciones personalizadas? Demuéstrelo con un ejemplo. Y al mismo tiempo explicar lo que hay que arreglar en el código para utilizar, por ejemplo, 5 botones? Considéralo una pregunta de principiante.
No, no lo es. Todavía no estoy escribiendo nada. Tengo que descansar al menos un día al año. Descansar no es interesante, y menos durante mucho tiempo. )
No es una decisión masiva y no he escrito sobre ello. No atribuyamos algo que no ha sucedido. Ya se dijo al principio de la discusión que no es una solución universal, sino un caso especial. En mi opinión, es un buen ejemplo para que un principiante practique. Y no para obtener una solución prefabricada de forma gratuita y correr, con la boca abierta en una amplia sonrisa, al encuentro del sol. ) ¿Comprende? Me gustaría un ejemplo tan simple y claro en el comienzo del aprendizaje de la programación. Especialmente cuando este es el primer lenguaje de programación en su vida y antes de que la actividad de toda su vida estaba en un campo completamente diferente, de ninguna manera conectado con ella.
Con el fin de hacer 5 botones, en este caso, tenemos que cambiar el tamaño de las matrices y excluir elementos innecesarios al declarar matrices para los nombres de los objetos-botones, el texto que aparece en los botones y los estados de los botones.
Hay una matriz de estados de botón, por lo que el mismo principio se puede utilizar para comprobar qué botón está pulsado y en lugar de simplemente cambiar el color del botón, realizar alguna otra acción (requerida por el usuario). Esto puede ser, por ejemplo, funciones de trading (y no sólo): borrar todas las órdenes pendientes, cerrar todas las posiciones, etc. Las ideas son infinitas. Y si no hay ideas, entonces usted ha elegido el tipo equivocado de actividad. )
Para implementar esto, necesitas crear otro array, que será inicializado con identificadores de una enumeración personalizada (que también necesita ser creada), por ejemplo, con el nombre ENUM_SCRIPT. Y luego se llamará a los identificadores, por ejemplo: SCRIPT_01 =0, SCRIPT_02 =2, etc. También en el bucle, al comprobar si el botón del panel está pulsado, tendrás que determinar qué identificador está ligado al botón pulsado y el estado actual del botón, y luego pasar la función correspondiente al programa para su ejecución.
No voy a mostrar un código de ejemplo a propósito. Que sea una tarea para principiantes. )
#define BUTTON_COLUMNS 5// Número de botones por anchura#define BUTTON_ROWS 1// Número de botones por altura
...
//--- Texto mostrado en los botonesstring button_texts[BUTTON_ROWS][BUTTON_COLUMNS]=
{
{"Button 01","Button 02","Button 03","Button 04","Button 05"}
};
//--- Nombres de objetosstring button_object_names[BUTTON_ROWS][BUTTON_COLUMNS]=
{
{"button_01","button_02","button_03","button_04","button_05"}
};
...
//--- Estados de los botonesbool button_states[BUTTON_ROWS][BUTTON_COLUMNS]=
{
{true,false,false,false,false}
};
Pero no entiendo cómo conectar mis funciones a los botones. Muéstrame un ejemplo.
Bueno, continuemos el juego de "principiante" iniciado por ti. )
¿En qué punto estás atascado? Muestre un intento de cómo se entiende en el punto actual. Crea una enumeración con cinco identificadores y un array a cuyos elementos haya que asignar esos identificadores.
...y colocar esta función en esta parte del código:
//--- Seguimiento de los clics del botón izquierdo del ratón en un objeto gráficoif(id==CHARTEVENT_OBJECT_CLICK)
{
//--- Si hace clic en el botónif(InitializeButtonStates(sparam))
{
//--- Establecer los colores para los botones
ChangeButtonColorOnClick();
//--- Ejecutar el scriptScriptOn();
}
//--- Actualizar el gráficoChartRedraw();
return;
}
Y luego puedes pensar en cómo optimizar el código, si lo necesitas. :)
El programa que tiene activado el seguimiento al arrancar lo desactiva al descargar. Y el programa que permanece en el gráfico y necesita seguimiento, comprueba si está activado, y si está desactivado, lo activa.
Es deseable dar su variante en los ejemplos de Asesor Experto y el código del indicador de mi post en la página anterior para excluir la ambigüedad de las declaraciones.
No hay necesidad de comprobar constantemente si alguien ha desactivado el seguimiento de eventos del ratón. Para ser más precisos, si quieres protegerte de cualquier situación, puedes comprobarlo, pero creo que es demasiado.
¿Quizás deberíamos sugerir a los desarrolladores que generen CHARTEVENT_CHART_CHANGE cuando CHART_EVENT_MOUSE_MOVE cambie? Entonces sería posible restaurar elegantemente la configuración necesaria cuando el Asesor Experto se está ejecutando.
Hasta ahora, tengo esta variante:
#property copyright"Copyright 2013, komposter"#property link"http://www.komposter.me/"#property version"1.00"#property indicator_chart_windowinputbool EnableMouseDetect = false; // true - funciona con seguimiento del ratón, false - sin élbool PrevState = false;
//+------------------------------------------------------------------+//| Función de inicialización del indicador personalizada |//+------------------------------------------------------------------+intOnInit()
{
if ( EnableMouseDetect )
{
//--- Obtener el estado actual
PrevState = (bool)ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE);
//--- Activar el seguimiento de eventos del ratónif ( PrevState == false ) ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
}
return(0);
}
//+------------------------------------------------------------------+//| Función de desinicialización del experto ||//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if ( EnableMouseDetect )
{
//--- Desactivar el seguimiento de eventos del ratónif ( PrevState == false )
{
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
ChartRedraw(); // Sin esta línea, el seguimiento se desactiva sólo cuando llega un tick. ¿Es así como está diseñado?
}
}
}
//+------------------------------------------------------------------+//| OnTick|//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime& time[],
constdouble& open[],
constdouble& high[],
constdouble& low[],
constdouble& close[],
constlong& tick_volume[],
constlong& volume[],
constint& spread[])
{
return(rates_total);
}
//+------------------------------------------------------------------+//| Función ChartEvent|//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam)
{
//--- Seguimiento del movimiento del ratón y de la pulsación del botón izquierdo del ratónif(id==CHARTEVENT_MOUSE_MOVE)
{
staticint count=1;
Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
count++;
}
}
//+------------------------------------------------------------------+
Hice un indicador, pero con un parámetro: ejecutar con EnableMouseDetect = true - controla el seguimiento, false - sólo imprime el número de eventos, si el seguimiento está habilitado.
------------------ Ahora lo he pensado un poco más, y tengo que estar de acuerdo - esta opción no funcionará. Si ejecutas primero un programa que rastrea el ratón (habilitará el rastreo), luego el segundo (verá lo que ya está habilitado), y luego eliminas el primero, deshabilitará el rastreo, y el segundo se quedará sin nada. Es decir, tenemos que idear algún tipo de semáforo para señalar que el rastreo es necesario.
Y a la luz de la investigación realizada aquí (sobre la carga en el procesador) en tales muletas no es necesario.
Así que propongo votar mi propuesta a los desarrolladores, y el tema puede ser cerrado.
ChartRedraw(); // Sin esta línea, el seguimiento se desactiva sólo cuando llega un tick. ¿Es así como está diseñado?
MT5 tiene actualización asíncrona de las propiedades del gráfico. Es decir, el hecho de que establezcamos una propiedad no significa que el terminal la recoja inmediatamente. La función ChartRedraw() se utiliza para que todas las propiedades sean releídas por el terminal. También se puede utilizar la función ChartGet... ObjectGet, en este caso las propiedades también serán releídas.
¿Está tan seguro de que su artículo es perfecto?
Me complace mucho que lo haya leído.
Estaré encantado de responder a todas las preguntas en el hilo correspondiente.
===
Para que no haya malentendidos innecesarios, ¡no tengo nada en contra de Anatoly! Le felicito por el artículo. Pero es necesario responder a las preguntas...
Perdona, ¿te estoy distrayendo por casualidad de escribir otro tutorial o receta?
Si no es así, vamos a seguir discutiendo su artículo sobre el control en la subventana del indicador. Por lo tanto, usted ofrece una solución masiva (o una idea) cómo hacer un menú conveniente en un indicador. Bien, ¡el propósito del artículo es muy digno! Pero, ¿cómo puede un programador "principiante" utilizar todo este arsenal? ¿Dónde colocar las funciones personalizadas? Demuéstrelo con un ejemplo. Y al mismo tiempo explicar lo que hay que arreglar en el código para utilizar, por ejemplo, 5 botones? Considéralo una pregunta de principiante.
No, no lo es. Todavía no estoy escribiendo nada. Tengo que descansar al menos un día al año. Descansar no es interesante, y menos durante mucho tiempo. )
No es una decisión masiva y no he escrito sobre ello. No atribuyamos algo que no ha sucedido. Ya se dijo al principio de la discusión que no es una solución universal, sino un caso especial. En mi opinión, es un buen ejemplo para que un principiante practique. Y no para obtener una solución prefabricada de forma gratuita y correr, con la boca abierta en una amplia sonrisa, al encuentro del sol. ) ¿Comprende? Me gustaría un ejemplo tan simple y claro en el comienzo del aprendizaje de la programación. Especialmente cuando este es el primer lenguaje de programación en su vida y antes de que la actividad de toda su vida estaba en un campo completamente diferente, de ninguna manera conectado con ella.
Con el fin de hacer 5 botones, en este caso, tenemos que cambiar el tamaño de las matrices y excluir elementos innecesarios al declarar matrices para los nombres de los objetos-botones, el texto que aparece en los botones y los estados de los botones.
Hay una matriz de estados de botón, por lo que el mismo principio se puede utilizar para comprobar qué botón está pulsado y en lugar de simplemente cambiar el color del botón, realizar alguna otra acción (requerida por el usuario). Esto puede ser, por ejemplo, funciones de trading (y no sólo): borrar todas las órdenes pendientes, cerrar todas las posiciones, etc. Las ideas son infinitas. Y si no hay ideas, entonces usted ha elegido el tipo equivocado de actividad. )
Para implementar esto, necesitas crear otro array, que será inicializado con identificadores de una enumeración personalizada (que también necesita ser creada), por ejemplo, con el nombre ENUM_SCRIPT. Y luego se llamará a los identificadores, por ejemplo: SCRIPT_01 =0, SCRIPT_02 =2, etc. También en el bucle, al comprobar si el botón del panel está pulsado, tendrás que determinar qué identificador está ligado al botón pulsado y el estado actual del botón, y luego pasar la función correspondiente al programa para su ejecución.
No voy a mostrar un código de ejemplo a propósito. Que sea una tarea para principiantes. )
Hice los cambios como me dijiste:
Y esto es lo que tengo en la pantalla:
¿Cómo lo arreglo? (soy principiante)
Hice los cambios como me dijiste:
Y esto es lo que tengo en la pantalla:
¿Cómo lo arreglo? (soy principiante)
Así
¡Genial! Funciona.
Pero no entiendo cómo conectar mis funciones a los botones. Muéstrame un ejemplo.
¡Genial! Funciona.
Pero no entiendo cómo conectar mis funciones a los botones. Muéstrame un ejemplo.
Bueno, continuemos el juego de "principiante" iniciado por ti. )
¿En qué punto estás atascado? Muestre un intento de cómo se entiende en el punto actual. Crea una enumeración con cinco identificadores y un array a cuyos elementos haya que asignar esos identificadores.
¿Qué hacemos ahora?
¿Qué hacemos ahora?
Este es el tipo de array que necesitas:
//--- Scripts ENUM_SCRIPT buttons_scripts[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]= { {SCRIPT_01,SCRIPT_02,SCRIPT_03,SCRIPT_04,SCRIPT_05} };Entonces necesitas escribir una función como esta:
...y colocar esta función en esta parte del código:
Y luego puedes pensar en cómo optimizar el código, si lo necesitas. :)
Así es como yo lo tengo hecho.
El programa que tiene activado el seguimiento al arrancar lo desactiva al descargar. Y el programa que permanece en el gráfico y necesita seguimiento, comprueba si está activado, y si está desactivado, lo activa.
Es deseable dar su variante en los ejemplos de Asesor Experto y el código del indicador de mi post en la página anterior para excluir la ambigüedad de las declaraciones.
No hay necesidad de comprobar constantemente si alguien ha desactivado el seguimiento de eventos del ratón. Para ser más precisos, si quieres protegerte de cualquier situación, puedes comprobarlo, pero creo que es demasiado.
¿Quizás deberíamos sugerir a los desarrolladores que generen CHARTEVENT_CHART_CHANGE cuando CHART_EVENT_MOUSE_MOVE cambie? Entonces sería posible restaurar elegantemente la configuración necesaria cuando el Asesor Experto se está ejecutando.
Hasta ahora, tengo esta variante:
Hice un indicador, pero con un parámetro: ejecutar con EnableMouseDetect = true - controla el seguimiento, false - sólo imprime el número de eventos, si el seguimiento está habilitado.
------------------
Ahora lo he pensado un poco más, y tengo que estar de acuerdo - esta opción no funcionará. Si ejecutas primero un programa que rastrea el ratón (habilitará el rastreo), luego el segundo (verá lo que ya está habilitado), y luego eliminas el primero, deshabilitará el rastreo, y el segundo se quedará sin nada. Es decir, tenemos que idear algún tipo de semáforo para señalar que el rastreo es necesario.
Y a la luz de la investigación realizada aquí (sobre la carga en el procesador) en tales muletas no es necesario.
Así que propongo votar mi propuesta a los desarrolladores, y el tema puede ser cerrado.