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

 

Artículo publicado Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte IV): Eventos comerciales:

En los anteriores artículos, comenzamos a crear una gran biblioteca multiplataforma, cuyo objetivo es facilitar la escritura de programas para las plataformas MetaTrader 5 y MetaTrader 4. Ya disponemos de una colección de órdenes y transacciones históricas, y órdenes y posiciones de mercado, así como de una clase para seleccionar y filtrar órdenes cómodamente. En esta parte, vamos a continuar desarrollando el objeto básico, además de enseñar a la biblioteca Engine a monitorear los eventos comerciales en la cuenta.

Vamos a iniciar el asesor en el simulador y pulsar los botones:

Todo funciona correctamente, y en el diario se muestran mensajes sobre los eventos sucedidos.

Debemos notar que, en este momento, siempre se fija el último evento. Es decir, si cerramos de una vez varias posiciones, en el evento entrará solo la última posición de la multitud cerrada. Solo es posible monitorear el evento de cierre múltiple según el número de nuevas transacciones u órdenes en la historia, obteniendo después la lista de todas las nuevas posiciones cerradas según su número y determinando ya sus componentes al completo. A continuación, haremos para ello una clase aparte de colección de eventos para trabajar con los eventos de la cuenta, para que así en el programa siempre se pueda tener acceso a todos los eventos sucedidos.

Autor: Artyom Trishkin

 

Artyom Trishkin, gracias por su trabajo, se siente como una poderosa biblioteca. Por favor, si no es dificil - puedes indicar brevemente que funcionalidad planeas cubrir (ya cubierta y preparandose para su publicacion) excepto el trabajo con ordenes/historia. Acabo de empezar a escribir una biblioteca similar sobre la base de una biblioteca estándar, pero empecé desde el lado de la funcionalidad como herramientas de análisis técnico. La idea es escribir todas las herramientas de análisis usadas en TA clásico y RA en la librería y hacerlas interoperables con herramientas de indicadores y otras. CExpertSignal.

Tal vez, si su funcionalidad cubre lo que he planeado, entonces debería considerar la opción de continuar-desarrollar lo que ya ha escrito.

 
alex_all:

Artyom Trishkin, gracias por su trabajo, se siente como una poderosa biblioteca. Por favor, si no es dificil - puedes indicar brevemente que funcionalidad planeas cubrir (ya cubierta y preparandose para su publicacion) excepto el trabajo con ordenes/historia. Acabo de empezar a escribir una biblioteca similar sobre la base de una biblioteca estándar, pero empecé desde el lado de la funcionalidad como herramientas de análisis técnico. La idea es escribir todas las herramientas de análisis usadas en TA clásico y RA en la librería y hacerlas interoperables con herramientas de indicadores y otras. CExpertSignal.

Tal vez si su funcionalidad cubre lo que he planeado, entonces debería considerar la opción de continuar-desarrollar lo que ya ha escrito.

Todo lo que se describe actualmente en los artículos es sólo el principio. El trabajo con los sistemas de órdenes de terminal será muy sencillo. Dar al programa bajo demanda casi cualquier dato sobre cualquier orden, trato, posición, evento que haya ocurrido alguna vez, etc. Eso es lo que pasa con los sistemas de órdenes. Hasta que no se termine y publique el trabajo y los artículos sobre el trabajo con los sistemas de órdenes de ambos terminales, no se publicarán otras funcionalidades - todo en orden.
Pero de acuerdo con la estructura establecida, se preparará y publicará el trabajo con los datos de precios, el trabajo con los indicadores, con los objetos gráficos, habrá un caparazón gráfico en toda regla en el lienzo, integrado en la estructura de la biblioteca de acuerdo con el paradigma establecido inicialmente. Es decir, será posible utilizar plenamente una sola biblioteca sin necesidad de acoplarla a otras. A modo de ejemplo - obtener datos pulsando sobre el icono de una posición abierta, una orden establecida, obtener datos pulsando sobre una barra de precios, buscar algunos datos en las colecciones existentes, procesarlos, etc.

Planeo organizar un acceso rápido y cómodo de tal manera que el usuario no tenga que pensar en cómo obtener los datos necesarios, sino sólo solicitarlos y obtenerlos con una de las numerosas funciones que se prepararán, su lista completa será recopilada y publicada en los artículos finales de esta serie.

Hay muchos planes y muchas novedades. Estoy preparando el material. Incluidas las peticiones (de las que aún no hay ninguna )

 
Artyom Trishkin:

Todo lo que ahora se describe en los artículos es sólo el principio. Trabajar con los sistemas de órdenes de los terminales será muy sencillo. Dar al programa bajo demanda casi cualquier dato sobre cualquier orden, trato, posición, evento que haya ocurrido, etc. Es lo que tienen los sistemas de órdenes. Hasta que no se finalice y publique el trabajo y la publicación de artículos sobre el trabajo con los sistemas de órdenes de ambos terminales, no se publicarán otras funcionalidades - todo en orden.
Pero de acuerdo con la estructura establecida, se preparará y publicará el trabajo con los datos de precios, el trabajo con los indicadores, con los objetos gráficos, habrá un caparazón gráfico en toda regla en el lienzo, integrado en la estructura de la biblioteca de acuerdo con el paradigma establecido inicialmente. Es decir, será posible utilizar plenamente una sola biblioteca sin necesidad de acoplarla a otras. Como ejemplo - obtener datos pulsando sobre el icono de una posición abierta, una orden establecida, obtener datos pulsando sobre una barra de precios, buscar algunos datos en las colecciones existentes, procesarlos, etc.

Planeo organizar el acceso rápido y cómodo de tal manera que el usuario no tenga que pensar en cómo obtener los datos requeridos, sino sólo solicitarlos y obtenerlos con una de las numerosas funciones que se prepararán, su lista completa será recopilada y publicada en los artículos finales de esta serie.

Hay muchos planes y muchas novedades. Estoy preparando el material. Incluidas las peticiones (que aún no están disponibles).

Muy interesante. Ya he visto dos versiones similares de la biblioteca aquí. Universal Expert Advisor y Cross-platform library. La primera no es del todo multiplataforma. Y la segunda tiene muchos inconvenientes, en concreto, carece de muchas funciones que serían multiplataforma. Por ejemplo, la hora de apertura o el precio de apertura de una posición/orden. Tienes que usar macros de la versión MQL tú mismo y escribir el código por separado. Pero hay muchas cosas interesantes, en particular, me gusta la presencia de varias paradas, trailing es muy potente y personalizable. MM opciones interesantes. Esta es una serie de artículos aquí de algún italiano, creo que usted consigue la idea. De todos modos, es interesante ver lo que se obtiene y sería genial si se utiliza la experiencia de desarrollos similares anteriores y tomar lo mejor. Gracias.

 
leonerd:

Muy interesante. Ya he visto aquí dos versiones similares de la biblioteca. Universal Expert Advisor y Cross-platform Library. El primero no es realmente multiplataforma. Y la segunda tiene muchos inconvenientes, en particular, la falta de muchas funciones que serían multiplataforma. Por ejemplo, la hora de apertura o el precio de apertura de una posición/orden. Tienes que usar macros de la versión MQL tú mismo y escribir el código por separado. Pero hay muchas cosas interesantes, en particular, me gusta la presencia de varias paradas, trailing es muy potente y personalizable. MM opciones interesantes. Esta es una serie de artículos aquí de algún italiano, creo que usted consigue la idea. De todos modos, es interesante ver lo que se obtiene y sería genial si se utiliza la experiencia de desarrollos similares anteriores y tomar lo mejor. Gracias.

Gracias por la opinión. Pero no soy capaz de leer artículos y buscar lo que necesito porque no tengo tiempo para eso, pero tomar peticiones de futuras funcionalidades, planificarlas e incluirlas en la lista para su implementación es siempre bienvenido. Habría sugerencias. Hasta ahora estoy haciendo lo que se planeó originalmente para la implementación.

 

¿Funcionará esta biblioteca con instrumentos de cambio en Moex?

En mi opinión, no se debe sobrecargar la librería para trabajar con órdenes con otras funcionalidades no relacionadas con la gestión monetaria, es mejor hacer librerías separadas.

Y sí, falta una descripción detallada del manual de la librería.

 
Aleksey Vyazmikin:

¿Funcionará esta biblioteca con instrumentos de stock en Moex?

En mi opinión, no se debe sobrecargar la biblioteca para trabajar con órdenes con otras funcionalidades no relacionadas con la gestión monetaria, es mejor hacer bibliotecas separadas.

Y sí, falta una descripción detallada del manual de la biblioteca.

Pruebas se verá. Lo que se notará - se arreglará. Habrá documentación para la biblioteca. No de inmediato.

 

Artem, acerca de los deseos - Creo que sí - si usted tiene alguna idea en términos de elegir qué camino tomar en tal o cual decisión, lo que es importante y qué descartar, etc ...,

entonces usted puede publicar su formulación en forma de una encuesta, etc, los miembros del foro con mucho gusto dar retroalimentación sobre lo que piensan al respecto.

Pero que alguien desee algo concreto, sin conocer todas las ideas del proyecto, me parece un fallo, porque ya sabes, como siempre - incluso una biblioteca ya lista y documentada cada uno la lee de forma diferente y toma de ella algo propio que le es relevante en el momento.

¡Así que te deseo éxito y determinación en tu empeño! :)

 

Leído, compilado, ¡a correr!


Si pudiera calificar 5 de 5 estrellas

Top Artyom

 
Christian:

Leído, compilado, ¡en marcha!


Si pudiera calificar 5 de 5 estrellas

Top Artyom

Thank you
 

Artem, en primer lugar. En primer lugar. Me gustaría decir muchas gracias por la serie de artículos y la biblioteca. ¡He entendido todo sobre OOP leyendo tus articulos! Tus articulos realmente enseñan y ayudan a los que lo necesitan, a mi me ayudaron. Tu uso de diferentes algoritmos en los mismos lugares donde podrías simplemente repetirte es también muy acertado.

Ahora si puedo ir al grano: ::GetListByTime - en este método seleccionas los pedidos por intervalo de tiempo para pasar la lista al programa que llama, en la Parte 3 escribes que:

"La propiedad deseada para la búsqueda y comparación se establece en las propiedades de la orden dependiendo de por qué hora se ordene la lista: si es por hora de apertura, entonces la propiedad para la búsqueda será hora de apertura, si es por hora de cierre, entonces las órdenes se compararán por su hora de cierre, etc."

Pero, ¿cómo? - En el propio método no hay posibilidad de cambiar la ordenación de la lista de órdenes con la que estamos trabajando.

Entiendo, pero puedo estar equivocado, que sea cual sea el intervalo de tiempo que pasemos (hora de cierre, por ejemplo), los métodos SearchGreatOrEqual () y SearchLessOrEqual() buscarán en la lista ordenada por hora de apertura de MT5 y hora de cierre de MT4? Ya que por defecto la inicialización de la lista de órdenes en el constructor de la clase COrder collections se especifica mayoritariamente por la hora de apertura o ticket de la orden.

//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection(void) : m_index_deal(0),m_delta_deal(0),m_index_order(0),m_delta_order(0),m_is_trade_event(false)
  {
   this.m_list_all_orders.Sort(#ifdef __MQL5__ SORT_BY_ORDER_TIME_OPEN #else  SORT_BY_ORDER_TIME_CLOSE #endif );
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_HISTORY_ID);
  }
//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CMarketCollection::CMarketCollection(void) : m_is_trade_event(false),m_is_change_volume(false),m_change_volume_value(0)
  {
   this.m_list_all_orders.Sort(SORT_BY_ORDER_TIME_OPEN);
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_MARKET_ID);
   ::ZeroMemory(this.m_struct_prev_market);
   this.m_struct_prev_market.hash_sum=WRONG_VALUE;
   this.m_list_control.Clear();
   this.m_list_control.Sort();
   this.m_list_changed.Clear();
   this.m_list_changed.Sort();
   this.m_k_pow=(ulong)pow(10,6);
  }

Así que el método anterior (::GetListByTime) funcionará así, siempre buscará por la hora de apertura de MT5 o la hora de cierre de MT4.

//--- Compara objetos COrder entre sí por todas las propiedades posibles (para ordenar listas por la propiedad especificada del objeto COrder
virtual int Compare(const CObject *node,const int mode=0) const;

lohas escrito de forma muy restringida(restringida - no significa que seaincorrecto) y utilizará el modo de ordenación seleccionado en el constructor de la clase de colecciones de órdenes de la librería estándar MQL cuando busque órdenes según la plantilla. Así que: (en la parte 3)

//+------------------------------------------------------------------+
//| Selecciona pedidos de la colección a lo largo del tiempo ||
//| en el rango de hora_inicial, a hora_final |
//+------------------------------------------------------------------+
CArrayObj *CHistoryCollection::GetListByTime(const datetime begin_time=0,const datetime end_time=0,
                                             const ENUM_SELECT_BY_TIME select_time_mode=SELECT_BY_TIME_CLOSE)
  {
   ENUM_ORDER_PROP_INTEGER property=(select_time_mode==SELECT_BY_TIME_CLOSE ? ORDER_PROP_TIME_CLOSE : ORDER_PROP_TIME_OPEN);

   CArrayObj *list=new CArrayObj();
   if(list==NULL)
     {
      ::Print(DFUN+TextByLanguage("Error de creación de lista temporal","Error creating temporary list"));
      return NULL;
     }
   datetime begin=begin_time,end=(end_time==0 ? END_TIME : end_time);
   if(begin_time>end_time) begin=0;
   list.FreeMode(false);
   ListStorage.Add(list);
   //---
   this.m_order_instance.SetProperty(property,begin);
   int index_begin=this.m_list_all_orders.SearchGreatOrEqual(&m_order_instance);
   if(index_begin==WRONG_VALUE)
      return list;
   this.m_order_instance.SetProperty(property,end);
   int index_end=this.m_list_all_orders.SearchLessOrEqual(&m_order_instance);
   if(index_end==WRONG_VALUE)
      return list;
   for(int i=index_begin; i<=index_end; i++)
      list.Add(this.m_list_all_orders.At(i));
   return list;
  }

no son necesarias, porque la librería estándar (métodos SearchGreatOrEqual() y SearchLessOrEqual()) seguirá buscando por el código de ordenación pasado en el constructor.
Puede simplemente eliminar estas líneas resaltadas en rojo y añadir líneas de compilación condicional para establecer la propiedad para el objeto:

   COrder            m_order_instance;       // Objeto de orden para buscar por propiedad

todavía la lista puede ser ordenada en sólo dos maneras o la apertura de MT5 o el cierre de MT4?
¿CORRECTO?

P.D. esto es necesario sólo para entender la lógica OOP!?!?

Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
  • www.mql5.com
В первой части данного цикла статей мы начали создавать большую кроссплатформенную библиотеку, целью которой является облегчение создания программ для платформы MetaTrader 5 и MetaTrader 4. Во второй части продолжили развитие библиотеки и сделали коллекцию исторических ордеров и сделок. В данной части повествования создадим класс для удобного...