Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte V): Clases y colección de eventos comerciales, envío de eventos al programa"

 

Artículo publicado Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte V): Clases y colección de eventos comerciales, envío de eventos al programa:

En anteriores artículos comenzamos a crear una gran biblioteca multiplataforma cuyo objetivo es simplificar la escritura de programas para las plataformas MetaTrader 5 y MetaTrader 4. En la cuarta parte, hemos puesto a prueba el seguimiento de eventos comerciales en la cuenta. En esta parte, vamos a crear las clases de los eventos comerciales y a colocarlas en la colección de eventos desde la que serán enviadas al objeto básico de la biblioteca Engine y al gráfico del programa de control.

Ahora, ya podemos compilar el asesor e iniciarlo en el simulador. Al pulsar los botones, en el diario del simulador se mostrarán breves mensajes de dos líneas sobre los eventos sucedidos en la cuenta.


Las entradas del manejador de eventos del asesor no se mostrarán en el diario, estas funcionan fuera del simulador. Si clicamos en los botones del asesor en una cuenta demo, en el diario del terminal se mostrarán tres líneas: dos líneas del método de muestra de mensajes breves de la clase CEvent y una línea del manejador OnChartEvent() del asesor.

Ejemplo de muestra de información en el diario del asesor al colocar y eliminar una orden pendiente:

- Pending order placed: 2019.04.05 23:19:55.248 -                                                              
EURUSD 0.10 Sell Limit #375419507 at price 1.14562                                                             
OnChartEvent: id=1001, event=TRADE_EVENT_PENDING_ORDER_PLASED, lparam=375419507, dparam=1.14562, sparam=EURUSD 
- Pending order removed: 2019.04.05 23:19:55.248 -                                                             
EURUSD 0.10 Sell Limit #375419507 at price 1.14562                                                             
OnChartEvent: id=1002, event=TRADE_EVENT_PENDING_ORDER_REMOVED, lparam=375419507, dparam=1.14562, sparam=EURUSD

Autor: Artyom Trishkin

 
Me pregunto cómo maneja la biblioteca muchos matices comerciales. Así que probablemente vale la pena tratar de hacer al menos la prueba inicial

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

Menos código y más rodar... escribiendo un EA

fxsaber, 2019.03.12 21:46

Esta tarea bien puede considerarse una prueba inicial sobre la capacidad de escribir trading bajo MT5. Para que todo el mundo pueda probar suerte.

 
fxsaber:
Me pregunto cómo maneja la biblioteca muchos matices comerciales. Así que probablemente valga la pena intentar pasar al menos la prueba inicial

Todavía no hay clases de trading en la librería. Por el momento el trabajo con el historial de la cuenta y el estado del mercado activo está llegando a su fin - el seguimiento de los eventos de la cuenta de compensación se publicará en el próximo artículo, a continuación, el trabajo con la cuenta en MetaTrader 4, y luego, después de preparar las clases para la salida de mensajes, se describirá el trabajo con las clases de comercio.

 
Artyom Trishkin:

Todavía no hay clases de comercio en la biblioteca. Por el momento el trabajo con el historial de la cuenta y el estado del mercado activo está llegando a su fin - el seguimiento de los eventos de la cuenta de compensación se publicará en el próximo artículo, a continuación, el trabajo con la cuenta en MetaTrader 4, y luego, después de preparar las clases para la salida de mensajes, se describirá el trabajo con las clases comerciales.

Entendido. MT5 es tan complejo en este sentido que creo que necesitamos un artículo entero que describa en detalle las sutilezas de trading que surgen en MT5 y cómo tenerlas en cuenta.

 
Artyom Trishkin: seguimiento de eventos de cuentas de compensación se publicará en el próximo artículo, entonces la
la biblioteca detectará automáticamente y trabajará tanto con los tipos de cuenta de compensación como de cobertura?
 
fxsaber:

Entendido. MT5 es tan complejo en este aspecto que probablemente necesite un artículo entero describiendo en detalle las sutilezas de trading que surgen en MT5 y cómo tenerlas en cuenta.

Estoy ocupado tratando con este tipo de situaciones. Espero ser capaz de manejarlas todas correctamente.

Algo más es interesante - sobre la base de la biblioteca descrita se crearán funciones de caso de usuario para facilitar el acceso a los datos recogidos y almacenados en la biblioteca, para el uso de clases de negociación, y en consecuencia - para la creación simple y fácil de los programas basados en ella.
Aunque ya tal como es - existe la posibilidad de utilizarla, pero a un nivel inferior de acceso - por punteros a listas de colecciones, y desde ellas - por punteros a cualquiera de sus datos. Pero esto no se corresponde con las "pretensiones" expuestas al principio sobre la facilidad de crear programas propios a partir de la biblioteca. Pero esto es sólo el principio :)

 
Igor Makanu:
¿La biblioteca detectará automáticamente y trabajará tanto con cuentas de compensación como con cuentas de cobertura?

Sí, ya está hecho. Se publicará en el próximo artículo.

 
Artyom Trishkin:

Sí. Ya. El próximo artículo será publicado.

Pero por ahora sólo trabajar con la historia de la cuenta y el estado del mercado. Entonces será posible obtener la historia de cualquier posición en cualquier tipo de cuenta sobre la base de los datos recogidos. Lo incluiré en mis planes.
 

Muy potente como herramienta de pruebas, ¡gracias por compartirlo!

 

Hola Artyom, ¡enhorabuena por el gran trabajo! Siguiendo la descripción del texto, parece que a la función CHistoryCollection::OrderSearch(...) le falta un break.

El bucle for siempre completa todas las iteraciones desde start-1 hasta 0, tanto si encuentra el "pedido perdido" como si no.

Tal vez, sería más eficiente incluir una pausa después de encontrar el "orden perdido ":

ulong CHistoryCollection::OrderSearch(const int start,ENUM_ORDER_TYPE &order_type) 
  { 
   ulong order_ticket=0; 
   for(int i=start-1;i>=0;i--) 
     { 
      ulong ticket=::HistoryOrderGetTicket(i); 
      if(ticket==0) 
         continue; 
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::HistoryOrderGetInteger(ticket,ORDER_TYPE); 
      if(this.IsPresentOrderInList(ticket,type)) 
         continue; 
      order_ticket=ticket; 
      order_type=type; 
      break; 
     } 
   return order_ticket; 
  } 

¿Qué opinas?

Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Requests to execute trade operations are formalized as orders. Each order has a variety of properties for reading. Information on them can be obtained using functions Position identifier that is set to an order as soon as it is executed. Each executed order results in a deal that opens or modifies an already existing position. The identifier of...
 
Alvaro Arioni :

Hola Artyom, ¡enhorabuena por el gran trabajo! Siguiendo la descripción en el texto, parece que la función CHistoryCollection::OrderSearch(...) puede tener una ruptura que falta.

El bucle for siempre completa todas las iteraciones desde start-1 hasta 0 , tanto si encuentra el "pedido perdido" como si no.

Tal vez, sería más eficiente incluir una pausa después de encontrar el "orden perdido":

...

¿Qué te parece?

Puede haber más de una orden perdida