Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte VIII): Eventos de modificación de órdenes y posiciones"

 

Artículo publicado Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte VIII): Eventos de modificación de órdenes y posiciones:

En artículos anteriores, comenzamos a crear una gran biblioteca multiplataforma, cuyo cometido es simplificar la escritura de programas para las plataformas MetaTrader 5 y MetaTrader 4. En el séptimo artículo, añadimos el seguimiento de los eventos de activación de órdenes StopLimit y preparamos la funcionalidad para monitorear el resto de eventos que tienen lugar con las órdenes y posiciones. En el presente artículo, vamos a crear una clase que monitoreará los eventos de modificación de las órdenes y posiciones de mercado.

Vamos a compilar el asesor.
Establecemos en sus parámetros los valores StopLoss in points y TaleProfit in points iguales a cero, para abrir las posiciones y esteblecer las órdenes pendientes desde el inicio sin niveles stop; asimismo, establecemos en los parámetros StopLoss for modification (points) y TakeProfit for modification (points) los valores 20 y 60 respectivamente (valores por defecto), estos niveles de StopLoss y TakeProfit serán establecidos al pulsar los botones.
Iniciamos el asesor en el simulador y colocamos las órdenes pendientes. A continuación, pulsamos por turno los botones para establecer el StopLoss y el TakeProfit: los niveles serán colocados, y las entradas correspondientes sobre ello se mostrarán en el diario. Después, activamos el trailing y observamos las órdenes. Estas se desplazan tras el precio, y en el diario se muestran las entradas correspondientes a estos eventos. Los niveles de StopLoss para las posiciones aparecidas como resultado de la activación de las órdenes seguirán al precio, y en el diario se mostrarán las entradas correspondientes a estos eventos.

Compensación:


Cobertura:


Autor: Artyom Trishkin

 

Buenas noches, Artem. Siempre se vive y se aprende. Y yo estoy aprendiendo, utilizando tu trabajo como material metodológico. Gracias por tu considerable trabajo y experiencia.

Por supuesto, no sin malentendidos, y para ser aún más preciso - cuanto más aprendo, más no entiendo.

En el archivo adjunto he intentado modificar su Asesor Experto TestDoEasyPart08, añadiendo un indicador personalizado, también su iCrossAD.

Utilicé la función iCustom(asymbol.Name(), _Period, "iCrossAD");

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("¡Falló la creación del descriptor del indicador iCrossAD!".);
      return(INIT_FAILED);
   }

Luego intenté copiar los datos del indicador a los buffers del EA y comprobar lo bien que lo conseguí.

void OnTick()
  {
//+------------------------------------------------------------------+//////////////////////////////
   int      buf_size = 30;
   double   Buf_Arrow_Sell[], Last_Arrow_Sell;
   double   Buf_Arrow_Buy[], Last_Arrow_Buy;
   
   ArraySetAsSeries(Buf_Arrow_Sell, true);
   ArraySetAsSeries(Buf_Arrow_Buy, true);
   
   if (CopyBuffer(CrossAD, 3, 0, buf_size, Buf_Arrow_Sell) != buf_size || ArraySize(Buf_Arrow_Sell) != buf_size)
   {  
      Print("Error al copiar datos de iCrossAD correctamente");
      return;
   }
      else Last_Arrow_Sell = Buf_Arrow_Sell[0];
   
   if (CopyBuffer(CrossAD, 2, 0, buf_size, Buf_Arrow_Buy) != buf_size || ArraySize(Buf_Arrow_Buy) != buf_size)
   {  
      Print("Error al copiar datos de iCrossAD correctamente");
      return;
   }
      else Last_Arrow_Buy = Buf_Arrow_Buy[0];
      
//+------------------------------------------------------------------+
Comment("Salida de datos fractales"., 
         "\n Last_Arrow_Buy     = ",Last_Arrow_Buy,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell    = ",Last_Arrow_Sell
         ); 
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+//////////////////////////////

Todo este truco no quiere funcionar, por favor diganme donde estoy haciendo mal y como hacerlo realmente ????.

Archivos adjuntos:
 
La idea es utilizar su TestDoEasyPart08 o sus futuras y más potentes modificaciones como base, añadirle datos de varios indicadores y, en función de sus combinaciones, gestionar las operaciones mediante programación/virtualmente pulsando los botones, si el curso de las operaciones no es del agrado del administrador del terminal, éste puede intervenir manualmente, utilizando los mismos botones y el ratón.
 
Sergey Voytsekhovsky:

Buenas noches, Artem. Siempre se vive y se aprende. Y yo estoy aprendiendo, utilizando tu trabajo como material metodológico. Gracias por tu considerable trabajo y experiencia.

Por supuesto, no está exento de malentendidos, y para ser aún más preciso: cuanto más aprendo, más no entiendo.

En el archivo adjunto es un intento de modificar su Asesor Experto TestDoEasyPart08, añadiendo un indicador personalizado, también su iCrossAD.

He utilizado la función iCustom(asymbol.Name(), _Period, "iCrossAD");

Luego intenté copiar los datos del indicador a los buffers del EA y comprobar lo bien que lo conseguí

Todo este truco no quiere funcionar, por favor diganme donde lo estoy haciendo mal y como hacerlo de verdad ???.

"No quiere trabajar" - ¿qué es exactamente lo que no funciona?

Esto es lo que yo haría a nivel global:

   int      buf_size = 30;
   double   Buf_Arrow_Sell[], Last_Arrow_Sell;
   double   Buf_Arrow_Buy[], Last_Arrow_Buy;

Esto en OnInit():

   ArraySetAsSeries(Buf_Arrow_Sell, true);
   ArraySetAsSeries(Buf_Arrow_Buy, true);

Y comprobar si el indicador alguna vez tiene valores en los buffers en la barra cero - sólo los comprueba en la barra cero. No recuerdo qué da ahí y en qué barra.

 
  • "¿Qué es exactamente lo que no funciona...?" - En este momento estoy intentando ver los valores de las últimas flechas Arriba y Abajo del indicador en los Comentarios. Si consigo esto, podré compararlas por tiempo, y por tanto sabré cual fue la última, y por tanto "actual". Esto se puede considerar como una señal al cambiar el valor o como un filtro para otras señales (puede/no puede). Pero aquí está el problema, no puedo introducir estos valores en los Comentarios y aún más - no puedo ver los Comentarios en sí, el texto debería ser visible?

  • " Esto es lo que yo haría a nivel global: ..." - ¡¡¡¡Lo moví, traté de darme cuenta por qué es así, creo que lo tengo, gracias por la ciencia!!!!

  • "Esto es lo que haría en OnInit(): ..." - Movido, muchas gracias, lo recordaré.

  • "Y comprobar si el indicador tiene alguna vez valores en los buffers en la barra cero: ..." - Intentaré organizar un comentario dentro del indicador y ejecutar el indicador para ver el valor en sí con mis ojos, pero ¿cómo se mostrarán luego en un gráfico? ¿Activar el indicador en otro gráfico?

  • "se comprueban sólo en la barra cero ..." - Sí, me doy cuenta, accediendo a la matriz con estas flechas, probablemente obtendré casi siempre un valor vacío y sólo en raras ocasiones, cuando se dibuja una flecha, el valor no estará vacío. Así que tengo que organizar ya sea un interruptor de la última señal en el lado del indicador, o ejecutar un bucle, escribir los últimos valores hasta el primero no vacío aquí en el Asesor de Expertos? Es decir, exactamente el mismo interruptor como en el lado del indicador?????

¡¡¡¡Por favor, ayuda con el comentario, no puedo entender por qué no se muestra!!!!

Archivos adjuntos:
 
Sergey Voytsekhovsky:
  • "¿Qué es exactamente lo que no funciona...?" - En este momento estoy intentando ver los valores de las últimas flechas Arriba y Abajo del indicador en los Comentarios. Si consigo esto, podré compararlas por tiempo, y por tanto sabré cual fue la última, y por tanto "actual". Esto se puede considerar como una señal al cambiar el valor o como un filtro para otras señales (puede/no puede). Pero aquí está el problema, no puedo poner estos valores en los Comentarios y aún más - no puedo ver los Comentarios en sí, el texto debería ser visible?

  • ¡¡¡¡" Esto es lo que yo haría a nivel global:" - Lo moví, intenté darme cuenta de por qué es así, creo que lo tengo, gracias por la ciencia!!!!

  • "Este en OnInit():" - Movido, muchas gracias, lo recordaré.

  • "Y comprobar si el indicador tiene alguna vez valores en los buffers en la barra cero - ..." - Intentaré organizar un comentario dentro del indicador y ejecutar el indicador para ver el valor en sí con mis ojos, pero ¿cómo se mostrarán luego en un gráfico? ¿Activar el indicador en otro gráfico?

  • "se comprueban sólo en la barra cero ..." - Sí, me doy cuenta, accediendo a la matriz con estas flechas, probablemente obtendré casi siempre un valor vacío y sólo en raras ocasiones, cuando se dibuja una flecha, el valor no estará vacío. Así que tengo que organizar ya sea un interruptor de la última señal en el lado del indicador, o ejecutar un bucle, escribir los últimos valores hasta el primero no vacío? Me refiero a exactamente el mismo interruptor como en el lado del indicador????

¡¡¡¡Por favor, ayuda con el comentario, no puedo entender por qué no se muestra!!!!

¿Qué se escribe en el registro "Expertos"? ¿Se crean las manijas del indicador?

 
Artyom Trishkin:

¿Qué se escribe en el diario "Expertos"? ¿Se crean manillas indicadoras?

Buenas tardes. Sí, se crea el asa, es igual a 10.

He avanzado un poco (¡muy poco!). Hay registros Comment

Hay registros de Print()


2019.05.19 17:31:13.127 2018.01.02 00:00:00 Asa iCrossAD = 10

2019.05.19 17:31:13.580 2018.01.02 09:00:00:00 Datos copiados del 2º búfer del indicador iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.797693134862316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:00 Datos copiados de la 3ª memoria intermedia del indicador iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.797693134862316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:20 Datos copiados de la 2ª memoria intermedia del indicador iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.797693134862316e+308

2019.05.19 17:31:13.581 2018.01.02 09:00:20 Datos copiados de la tercera memoria intermedia del indicador iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.797693134862316e+308


Dos búferes del indicador, desde los que se copian los datos, contienen los valores a los que se fijan las flechas del indicador. Se escriben allí en el momento de fijar las flechas. En consecuencia, concluyo que deberían llenarse con precios dobles en el momento de la formación de la flecha. Pero por alguna razón obtengo una cifra cósmica, si no me equivoco, es el máximo de valores dobles posibles en MT5.

Pero he probado y conseguido esto en el tester, no había cotizaciones ayer y hoy, hoy es domingo.

Si hay ganas, por favor ayudenme a entender. Adjunto Expert Advisor e indicador en el post. El Asesor Experto ha sido cambiado, escribí sobre ello más arriba, el indicador también es suyo, no hay cambios en él.

Archivos adjuntos:
 
Sergey Voytsekhovsky:

Buenas tardes. Sí, el mango está creado, es igual a 10.

He avanzado un poco (¡muy poco!). Los registros de comentarios han aparecido

Hay registros Print()


2019.05.19 17:31:13.127 2018.01.02 00:00:00 Mango iCrossAD = 10

2019.05.19 17:31:13.580 2018.01.02 09:00:00:00 Datos copiados del 2º búfer del indicador iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.797693134862316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:00 Datos copiados de la 3ª memoria intermedia del indicador iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.79769313486262316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:20 Datos copiados del 2º búfer del indicador iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.79769313486262316e+308

2019.05.19 17:31:13.581 2018.01.02 09:00:20 Datos copiados de la tercera memoria intermedia del indicador iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.79769313486262316e+308


Dos búferes del indicador, desde los que se copian los datos, contienen los valores a los que se fijan las flechas del indicador. Se escriben allí en el momento de fijar las flechas. En consecuencia, concluyo que no deben llenarse con precios dobles. Pero por alguna razón tengo una cifra cósmica, si no me equivoco, es el máximo de valores dobles posibles en MT5.

Sin embargo, he probado y logrado esto en el tester, no hubo cotizaciones ayer y hoy, hoy es domingo.

Si hay algún deseo, por favor ayúdenme a entender. Adjunto Asesor Experto e indicador en el post. El Asesor Experto ha sido cambiado, escribí sobre ello más arriba, el indicador también es suyo, no hay cambios en él.

Bueno, aquí estamos discutiendo cuestiones acerca de la biblioteca, no trivial ignorancia acerca de los valores vacíos de los búferes de los indicadores. EMPTY_VALUE == DBL_MAX
 
Artyom Trishkin:
Bueno, aquí discutimos cuestiones sobre la biblioteca, no ignorancia trivial sobre los valores vacíos de los buffers indicadores. VALOR_VACIO == DBL_MAX

Entendido, oído, gracias. Creo que sabía algo sobre valores vacíos, estudiaré la pregunta.

Si no es apropiado aquí, ¿puedes recomendarme algún hilo donde pueda obtener respuestas a preguntas tan lamer de ti o de tus colegas?

Si no existe tal lugar, probablemente valdría la pena crear uno.

Siento molestarle, pero aquí no hay conversaciones animadas, no hay nadie que interfiera, y quién sino el autor dará los mejores consejos.

Además, estoy intentando utilizar su biblioteca. Primitiva, por supuesto, pero lo mejor que puedo, lo siento.

 
Sergey Voytsekhovsky:

Roger, te he oído, gracias. Pensé que sabía algo acerca de los valores vacíos, voy a mirar en él.

Si no es apropiado aquí, ¿puedes recomendarme algún otro hilo donde pueda obtener respuestas a preguntas tan lamer de ti o de tus colegas?

Si no existe tal lugar, probablemente valdría la pena crear uno.

Siento molestarle, pero aquí no hay discusiones animadas, no hay nadie a quien molestar, y quién sino el autor dará los mejores consejos.

Además, estoy intentando utilizar su biblioteca. Primitivo, por supuesto, pero como puedo, lo siento.

Para preguntas no relacionadas con la biblioteca, por favor escriba aquí:

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2016.11.09
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Artyom Trishkin:

Para preguntas no relacionadas con la biblioteca, por favor publique aquí:

Muchas gracias, fui, miré, leí. Justo lo que necesito, lo utilizaré.