Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte VII)"

 

Artículo publicado Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte VII): Eventos de activación de órdenes StopLimit, preparación de la funcionalidad para los eventos de modificación de órdenes y posiciones:

En anteriores artículos comenzamos a crear una gran biblioteca multiplataforma cuyo objetivo es simplificar la creación de programas para las plataformas MetaTrader 5 y MetaTrader 4. En la sexta parte, enseñamos a la biblioteca a trabajar con posiciones en las cuentas de compensación. En esta parte, implementaremos el seguimiento de los eventos de activación de órdenes StopLimit y prepararemos la funcionalidad necesaria para monitorear la modificación de órdenes y posiciones.

Para comprobar las mejoras realizadas, vamos a usar el asesor del artículo anterior. Solo tenemos que cambiar el nombre de TestDoEasyPart06.mq5 de la carpeta \MQL5\Experts\TestDoEasy\Part06 a TestDoEasyPart07.mq5 y guardarlo en la nueva subcarpeta \MQL5\Experts\TestDoEasy\ Part07.

Lo compilamos, lo iniciamos en el simulador, colocamos una StopLimit y esperamos a que se active:

Autor: Artyom Trishkin

 

Me gustaría ver la implementación de varios CTs utilizando esta librería y otras alternativas.

Y análisis comparativos, por supuesto. En particular, el rendimiento en el Probador/Optimizador, el tamaño del código y la velocidad de su escritura.

 
fxsaber:

Me gustaría ver la implementación de varios CTs utilizando esta biblioteca y alternativas.

Y análisis comparativos, por supuesto. En particular, el rendimiento en el Probador/Optimizador, el tamaño del código y la velocidad de su escritura.

Todavía es pronto. De momento no hemos preparado la funcionalidad necesaria para hacer realidad la declarada sencillez de crear nuestros propios programas. Todavía se está creando la base necesaria. En la octava parte se implementa y describe la funcionalidad para el seguimiento de otros eventos, como la modificación de órdenes y posiciones, sus niveles de stop. Se está preparando el siguiente artículo, que iniciará la finalización para la compatibilidad con MQL4. El siguiente paso será crear clases comerciales completas, luego trabajar con símbolos y cuentas. Y luego crearemos funciones de caso de usuario para un acceso fácil y rápido a cualquier dato recogido y controlado por la biblioteca. Y esta no será la etapa final, ya que se está preparando un conjunto de posibilidades de uso de nuevos objetos gráficos integrados en la biblioteca, con acceso a ellos como estándar. Es decir, la biblioteca tendrá la capacidad de crear sus propios objetos gráficos, y disponer de su propio caparazón gráfico en el lienzo + la posibilidad de crear a partir de este conjunto sus propios elementos gráficos para sus programas. Esto es de lo previsto anteriormente, pero todavía hay planes para su aplicación.

Y la realización de TC - será posible, en particular, después de la creación de casos de usuario-funciones. Aunque, por supuesto, es posible hacer algo incluso ahora, pero no rápida y fácilmente - porque requiere acceso directo a listas y objetos de biblioteca por punteros, y esto no es "tomar y obtener" - sin embargo, tal acceso está parcialmente organizado en los ejemplos de asesores adjuntos a los artículos.

 
Artyom Trishkin:

... Y esta no será la etapa final, ya que se está preparando un conjunto de posibilidades para utilizar nuevos objetos gráficos integrados en la biblioteca, con el acceso habitual a ellos - como a los estándar. Es decir, la biblioteca tendrá la capacidad de crear sus propios objetos gráficos, y tener su propio caparazón gráfico en el lienzo + la capacidad de crear a partir de este conjunto de sus propios elementos gráficos para sus programas....

¿Escribirás una biblioteca gráfica sobre kanvas?
 
Реter Konow:
¿Escribirás una biblioteca gráfica en canvas?

Sí, por supuesto. No sólo sobre él. Algunos objetos "compuestos" del conjunto de objetos gráficos estándar estarán disponibles para su creación, además se ofrecerán formularios para crear tu propia GUI con acceso completo a todos los datos recogidos y controlados por la librería - algún conjunto de objetos listos, más la posibilidad de construir tu propia GUI a partir de ellos. Naturalmente, todo se hace para que el usuario tenga acceso completo a cualquier necesidad de una biblioteca - "out of the box" por así decirlo. Conecta una librería y tendrás toda la funcionalidad necesaria para crear cualquiera de tus deseos - sin buscar las soluciones necesarias escritas y publicadas en algún sitio.

 
Artyom Trishkin:

Sí, claro. No sólo en ella. Habrá disponibles para su creación algunos objetos "compuestos" a partir del conjunto de objetos gráficos estándar, además se ofrecerán formularios para crear tu propia GUI con acceso completo a todos los datos recogidos y controlados por la librería - algún conjunto de objetos listos, más la posibilidad de construir tu propia GUI a partir de ellos. Naturalmente, todo se hace para que el usuario tenga acceso completo a cualquier necesidad de una biblioteca - "out of the box" por así decirlo. Conecte una librería, y tendrá toda la funcionalidad necesaria para crear completamente cualquiera de sus deseos - sin buscar las soluciones requeridas escritas y publicadas en alguna parte.

Es decir, creará un entorno de software multiplataforma con un conjunto completo de posibilidades para crear cualquier EA. Librería universal para ambas plataformas, con gráficos sobre lienzo.

Una idea a gran escala. Será interesante ver la implementación de la última parte. El gráfico anterior. Biblioteca fue escrito por un año y medio, pero puesto que ya existe una base seria, tal vez será más rápido.
 
Реter Konow:
Es decir, creará un entorno de software multiplataforma con todas las posibilidades para crear cualquier EA. Librería universal para ambas plataformas con gráficos sobre lienzo.

Una idea a gran escala. Será interesante ver la implementación de la última parte. El gráfico anterior. Biblioteca fue escrito por un año y medio, pero puesto que ya existe una base seria, tal vez será más rápido.
Todo será. Pero poco a poco - paso a paso. Después de todo, está previsto no sólo una biblioteca de este tipo, pero el material educativo. Siempre se puede no sólo lo utilizan, sino también leer y entender cómo se hace todo.
 
Artyom Trishkin:

...sin encontrar las soluciones necesarias escritas y publicadas en alguna parte.

¿Significa eso que la biblioteca se convertirá en una biblioteca de personal?
 
Реter Konow:
¿Significa eso que la biblioteca se convertirá en una biblioteca de personal?
No. Significa que una biblioteca será suficiente.
 
Artyom Trishkin:
No. Esto significa que una biblioteca será suficiente.
Buena suerte.
 

Artem, ¡gracias!

En el método:

//+------------------------------------------------------------------+
//|| Actualiza la lista de pedidos|
//+------------------------------------------------------------------+
void CMarketCollection::Refresh(void)

Una "orden de mercado" se crea dinámicamente

#else 
//--- Posiciones
   int total_positions=::PositionsTotal();
   for(int i=0; i<total_positions; i++)
     {
      ulong ticket=::PositionGetTicket(i);
      if(ticket==0) continue;
      CMarketPosition *position=new CMarketPosition(ticket);
      if(position==NULL) continue;
      //--- Añadir un objeto de posición a la lista de órdenes de mercado y posiciones
      if(!this.AddToListMarket(position))
         continue;
      //--- Obtener el índice de orden de control por ticket e identificador de posición
      int index=this.IndexControlOrder(ticket,position.PositionID());
      //--- Si el pedido no está en la lista de pedidos de control - añádalo
      if(index==WRONG_VALUE)
        {
         if(!this.AddToListControl(position))
           {
            ::Print(DFUN_ERR_LINE,TextByLanguage("Fallo al añadir posición de control","Failed to add a control position "),position.TypeDescription()," #",position.Ticket());
           }
        }
      //--- Si el pedido ya existe en la lista de pedidos de control - compruebe si hay cambios en sus propiedades
      else if(index>WRONG_VALUE)
        {
         this.OnChangeEvent(position,index);
        }
     }
//--- Pedidos
   int total_orders=::OrdersTotal();
   for(int i=0; i<total_orders; i++)
     {
      ulong ticket=::OrderGetTicket(i);
      if(ticket==0) continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::OrderGetInteger(ORDER_TYPE);
      //--- Orden de mercado
      if(type<ORDER_TYPE_BUY_LIMIT)
        {
         CMarketOrder *order=new CMarketOrder(ticket);
         if(order==NULL) continue;
         //--- Añadir objeto de orden de mercado a la lista de órdenes de mercado y posiciones
         if(!this.AddToListMarket(order))
            continue;
        }
      //--- Orden pendiente
      else
        {
         CMarketPending *order=new CMarketPending(ticket);
         if(order==NULL) continue;
         //--- Añadir un objeto de orden pendiente a la lista de órdenes de mercado y posiciones
         if(!this.AddToListMarket(order))
            continue;
         //--- Obtener el índice de orden de control por ticket e identificador de posición
         int index=this.IndexControlOrder(ticket,order.PositionID());
         //--- Si el pedido no está en la lista de pedidos de control - añádalo
         if(index==WRONG_VALUE)
           {
            if(!this.AddToListControl(order))
              {
               ::Print(DFUN_ERR_LINE,TextByLanguage("Fallo al añadir orden de control","Failed to add a control order "),order.TypeDescription()," #",order.Ticket());
              }
           }
         //--- Si el pedido ya existe en la lista de pedidos de control - compruebe si hay cambios en sus propiedades
         else if(index>WRONG_VALUE)
           {
            this.OnChangeEvent(order,index);
           }
        }
     }
#endif 

Luego se pasa por referencia al método :

         //--- Añadir objeto de orden de mercado a la lista de órdenes de mercado y posiciones
         if(!this.AddToListMarket(order))
            continue;

En el método"AddToListMarket" la orden de mercado no se tiene en cuenta en la suma hash "hash_sum" entonces ¿por qué necesitamos introducirla y controlarla?
Por favor, explique por qué lo necesitamos, si podemos averiguar toda la información de la posición o de la orden pendiente?