Discusión sobre el artículo "Libro de Recetas MQL5: El Historial de Transacciones y la Biblioteca de Funciones para Obtener Propiedades de Posición"

 

Artículo publicado Libro de Recetas MQL5: El Historial de Transacciones y la Biblioteca de Funciones para Obtener Propiedades de Posición:

Es momento de resumir brevemente la información facilitada los artículos anteriores sobre propiedades de posición. En este artículo crearemos unas cuantas funciones adicionales para obtener las propiedades que solo se pueden conseguir tras acceder al historial de transacciones. También nos familiarizaremos con estructuras de datos que nos permitirán acceder a propiedades de posición y del símbolo de una forma más conveniente.

MQL5 Cookbook: The History of Deals And Function Library for Getting Position Properties

Autor: Anatoli Kazharski

 
El artículo es bueno, me ha gustado. A menudo sucede que la posición actual se compone de varias ofertas, y además de la primera y la última, me gustaría conocer los parámetros de 2, 3, etc. ofertas. Tal función enriquecería el artículo.
 
paladin800:
El artículo es bueno, me ha gustado. A menudo sucede que la posición actual se compone de varias ofertas, y además de la primera y la última, me gustaría conocer los parámetros de 2, 3, etc. ofertas. Una característica así enriquecería el artículo.
De momento que sea una tarea para casa. Pero intentaré escribir algo más sobre este tema más adelante.
 

Pregunta al autor del artículo.

¿Cómo puedo obtener el ID de la posición en la que participó la operación inmediatamente después de la apertura de la posición?



 
denkir:

Pregunta al autor del artículo.

¿Cómo obtener el identificador de la posición en la que se ha realizado la operación inmediatamente después de la apertura de la posición?

Seleccione la posición usando la función PositionSelect() y obtenga su identificador usando la función PositionGetInteger() y el identificador mql5 - POSITION_IDENTIFIER.

Ejemplo de la Ayuda:

//+------------------------------------------------------------------+
//| Función comercial|
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- comprueba si la posición está disponible e imprime la hora de su cambio
   if(PositionSelect(_Symbol))
     {     
//--- obtener el identificador de posición para seguir trabajando con él
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- obtener el tiempo de formación de la posición en milisegundos desde el 01.01.1970
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- obtener el tiempo del último cambio de posición en segundos desde el 01.01.1970
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- obtener el tiempo del último cambio de posición en milisegundos desde el 01.01.1970
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

Seleccione una posición utilizando la función PositionSelect() y obtenga su identificador utilizando la función PositionGetInteger() y el identificador mql5 - POSITION_IDENTIFIER.

Ejemplo de la Ayuda:

¡Gracias, tol64! En principio, tienes razón.

Y disculpa que la primera pregunta haya sido escueta... a pesar de haber dado una referencia al identificador de posición.

El problema es el siguiente. Es necesario, después de abrir una posición, capturar esta apertura en el historial de transacciones con la ayuda de la clase CDealInfo utilizando el método ::PositionId(). Y preferiblemente con el menor intervalo de tiempo entre el momento de la apertura y el momento en que aparece en el historialuna operación de tipo DEAL_ENTRY_IN o DEAL_ENTRY_INOUT .

¿Es posible hacerlo así? No a través de la lista de posiciones activas, sino a través de la lista de operaciones en el historial...
 
denkir:

¡Gracias, tol64! En principio, la verdad es tuya.

Y pido disculpas por la brevedad de la primera pregunta... a pesar de que di un enlace a la identificación de la posición.

El problema es el siguiente. Después de abrir una posición, es necesario capturar esta apertura en el historial de transacciones utilizando la clase CDealInfo con el método ::PositionId(). Y preferiblemente con el menor espacio de tiempo entre el momento de la apertura y el momento en que aparece en el históricouna operación de tipo DEAL_ENTRY_IN o DEAL_ENTRY_INOUT .

¿Es posible hacerlo así? No a través de la lista de posiciones activas, sino a través de la lista de operaciones en el historial...

En mi opinión, el seguimiento del evento en OnTrade(), como en el ejemplo anterior, es bastante adecuado para esto. Pero yo pensaría que de repente una posición no puede ser seleccionada por un evento de trade, y la siguiente no lo será pronto. Entonces usted necesita para realizar un seguimiento del medio ambiente por temporizador. Incluso milisegundos se puede establecer ahora.

Bueno, o en lugar de rastrear la posición abierta, escanear el historial de operaciones (número de operaciones). Recordamos la anterior y compararla con la actual. También puede hacerlo en el temporizador. Hay muchas variantes. Todo depende de la tarea específica.

 

Anatoly, he encontrado un problema aquí. Por favor, comparte tu experiencia. O bien hay un error al trabajar con funciones, o estoy yendo "mal". Pero creo que he hecho todo correctamente....

Tengo una pregunta sobre las variantes de funciones en las que la segunda no "funciona".

Por ejemplo:

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // billete
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // identificador de la propiedad
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // billete
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // identificador de la propiedad
   double&                     double_var         // aquí tomamos el valor de la propiedad
   );

He adjuntado el código fuente.

Archivos adjuntos:
 
denkir:

Anatoly, he encontrado un problema aquí. Por favor, comparte tu experiencia. O bien hay un error al trabajar con funciones, o estoy yendo "mal". Pero creo que he hecho todo correctamente....

La pregunta es acerca de las variantes de la función en la que el segundo no "trabajo".

...

¿Qué ves en el log? No tengo problemas al ejecutar el script.
 
tol64:
¿Qué ves en el log? No veo ningún problema al ejecutar el script.

Veo que con la configuración por defecto del script hay una entrada como "Fallo al devolver la función HistoryOrderGetDouble()".

Es decir, la versión booleana de la función no obtiene el valor de la propiedad.

 
denkir:

Veo que con la configuración por defecto del script hay un registro como "Fallo al devolver la función HistoryOrderGetDouble()".

Es decir, la versión booleana de la función no obtiene el valor de la propiedad.

En mi caso todo pasa con éxito. Mira todo con más detalle (salida al log) para averiguar el motivo. Número de pedidos, tickets, número de error, etc.