Seleccionar órdenes y transacciones del historial

MetaTrader 5 le permite crear una instantánea del historial para un período de tiempo específico para un Asesor Experto o un script. La instantánea es una lista de órdenes y transacciones a la que se puede acceder posteriormente a través de las funciones correspondientes. Además, se puede solicitar el historial en relación con órdenes, transacciones o posiciones concretas.

La selección explícita del periodo deseado (por fechas) se realiza mediante la función HistorySelect. A continuación se puede buscar el tamaño de la lista de transacciones y de la lista de órdenes mediante las funciones HistoryDealsTotal y HistoryOrdersTotal, respectivamente. Los elementos de la lista de órdenes pueden comprobarse mediante la función HistoryOrderGetTicket; para los elementos de la lista de transacciones, utilice HistoryDealGetTicket.

Es necesario distinguir entre las órdenes activas (de trabajo) y las órdenes del historial, es decir, las ejecutadas, canceladas o rechazadas. Para analizar las órdenes activas, utilice las funciones comentadas en las secciones relacionadas con obtener una lista de órdenes activas y leer sus propiedades

bool HistorySelect(datetime from, datetime to)

La función solicita el historial de transacciones y órdenes para el periodo especificado de tiempo del servidor (from y to inclusive, to >= from) y devuelve true en caso de éxito.

Incluso si no hay órdenes y transacciones en el periodo solicitado, la función devolverá true en ausencia de errores. Un error puede ser, por ejemplo, la falta de memoria para elaborar una lista de órdenes o transacciones.

Tenga en cuenta que las órdenes tienen dos tiempos: establecimiento (ORDER_TIME_SETUP) y ejecución (ORDER_TIME_DONE). La función HistorySelect selecciona las órdenes por tiempo de ejecución.

Para extraer todo el historial de la cuenta, puede utilizar la sintaxis HistorySelect(0, LONG_MAX).

Otra forma de acceder a una parte del historial es por ID de posición.

bool HistorySelectByPosition(ulong positionID)

La función solicita el historial de transacciones y órdenes con el ID de posición especificado en las propiedades ORDER_POSITION_ID, DEAL_POSITION_ID.

¡Atención! La función no selecciona órdenes por el ID de la posición opuesta para operaciones Close By. En otras palabras: la propiedad ORDER_POSITION_BY_ID se ignora, a pesar de que los datos de la orden intervinieron en la formación de la posición.
 
Por ejemplo, un Asesor Experto podría completar una compra (orden nº 1) y una venta (orden nº 2) en una cuenta con cobertura. Así se formarán las posiciones nº 1 y nº 2. El cierre opuesto de posiciones requiere la orden ORDER_TYPE_CLOSE_BY (nº 3). Como resultado, la llamada HistorySelectByPosition(#1) seleccionará las órdenes nº 1 y nº 3, lo que es de esperar. Sin embargo, la llamada de HistorySelectByPosition(#2) seleccionará sólo la orden nº 2 (a pesar de que la orden nº 3 tiene nº 2 en la propiedad ORDER_POSITION_BY_ID, y estrictamente hablando, la orden nº 3 participó en el cierre de la posición nº 2).

Al ejecutar con éxito cualquiera de las dos funciones, HistorySelect o HistorySelectByPosition, el terminal genera una lista interna de órdenes y transacciones para el programa MQL. También puede cambiar el contexto histórico con las funciones HistoryOrderSelect y HistoryDealSelect, para lo cual necesita conocer de antemano el ticket del objeto correspondiente (por ejemplo, guardarlo del resultado de la solicitud).

Es importante tener en cuenta que HistoryOrderSelect sólo afecta a la lista de órdenes, y HistoryDealSelect sólo se utiliza para la lista de transacciones.

Todas las funciones de selección de contexto devuelven un valor bool en caso de éxito (true) o error (false). El código de error puede leerse en la variable integrada _LastError.

bool HistoryOrderSelect(ulong ticket)

La función HistoryOrderSelect selecciona una orden en el historial por su ticket. A continuación, la orden se utiliza para otras operaciones con la transacción (lectura de propiedades).

Durante la aplicación de la función HistoryOrderSelect, si la búsqueda de una orden por ticket ha tenido éxito, la nueva lista de órdenes seleccionadas en el historial estará formada por la única orden que se acaba de encontrar. En otras palabras: se restablece la lista anterior de órdenes seleccionadas (si la hubiera). Sin embargo, la función no restablece el historial de transacciones previamente seleccionado, es decir, no selecciona la(s) transacción(es) asociada(s) a la orden.

bool HistoryDealSelect(ulong ticket)

La función HistoryDealSelect selecciona una transacción en el historial para acceder a ella a través de las funciones correspondientes. La función no restablece el historial de órdenes, es decir, no selecciona la orden asociada a la transacción seleccionada.

Después de seleccionar un determinado contexto en el historial llamando a una de las funciones anteriores, el programa MQL puede llamar a las funciones para iterar sobre las órdenes y transacciones que entran en este contexto y leer sus propiedades.

int HistoryOrdersTotal()

La función HistoryOrdersTotal devuelve el número de órdenes en el historial (en la selección).

ulong HistoryOrderGetTicket(int index)

La función HistoryOrderGetTicket permite obtener un ticket de orden por su número de serie en el contexto del historial seleccionado. El índice debe estar comprendido entre 0 y N-1, donde N se obtiene de la función HistoryOrdersTotal.

Conociendo el ticket de la orden es fácil obtener todas las propiedades necesarias del mismo utilizando las funciones HistoryOrderGet. Las propiedades de las órdenes históricas son exactamente las mismas que las de órdenes existentes.

Existe un par de funciones similares para trabajar con transacciones.

int HistoryDealsTotal()

La función HistoryDealsTotal devuelve el número de transacciones en el historial (en la selección).

ulong HistoryDealGetTicket(int index)

La función HistoryDealGetTicket permite obtener un ticket de transacción por su número de serie en el contexto del historial seleccionado. Esto es necesario para el tratamiento posterior de la transacción mediante funciones HistoryDealGet. La lista de las propiedades de transacción accesibles a través de estas funciones se describió en la sección anterior.

Consideraremos un ejemplo de utilización de funciones después de estudiar las funciones HistoryOrderGet y HistoryDealGet.