> ## Documentation Index
> Fetch the complete documentation index at: https://api-trading-docs.ap-markets.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Historial de deals

> Consulta ejecuciones y cargos por cuenta y rango de timestamps.

`GET /api/v1/accounts/{login}/deals` consulta el historial de la cuenta verificada.
Está publicado en `/openapi/partners.json`, bajo el mismo prefijo `/api/v1`.
Es una consulta de lectura y no requiere `Idempotency-Key` ni trading habilitado.

## Permisos y parámetros

El token debe tener `GET:/api/v1/accounts/*/deals` o un permiso que lo cubra,
como `GET:/api/v1/accounts/*`. Los tokens con ese permiso general ya cubren esta
ruta. La cuenta debe tener una verificación vigente con el mismo token.

| Parámetro | Descripción |
| - | - |
| `login` | Cuenta verificada, en la ruta. Entero positivo. |
| `from` | Inicio incluido, timestamp Unix en **segundos UTC**. Obligatorio. |
| `to` | Fin incluido, timestamp Unix en **segundos UTC**, mayor o igual que `from`. Obligatorio. |
| `offset` | Desplazamiento desde cero; predeterminado `0`, máximo `4294967295`. |
| `total` | Tamaño máximo de página, de `1` a `100`; predeterminado `100`. No es el conteo global. |

No envíes milisegundos ni fechas de texto. Los timestamps admitidos van de `0`
a `253402300799`. Mantén `from` y `to` fijos mientras recorres las páginas.

```bash theme={null}
curl --fail-with-body --get "$API_BASE/api/v1/accounts/167848/deals" \
  -H "Authorization: Bearer $MT5_API_TOKEN" \
  --data-urlencode "from=1790812800" \
  --data-urlencode "to=1792540799" \
  --data-urlencode "offset=0" \
  --data-urlencode "total=100"
```

El ejemplo cubre del 1 de octubre de 2026 a las 00:00:00 UTC al 20 de octubre
de 2026 a las 23:59:59 UTC. Utiliza fechas con zona horaria al crear timestamps.

## Campos y resultado

La respuesta conserva `retcode` y `answer`, una lista de deals. Una lista vacía
es una consulta correcta sin registros en esa página. Los números pueden venir
como cadenas; conserva su precisión y utiliza aritmética decimal para importes.

| Campo | Uso |
| - | - |
| `Deal` | Identificador único del deal; úsalo para evitar duplicados. |
| `Login`, `Order`, `PositionID` | Cuenta, orden y posición asociadas. No son el ID de solicitud de trading. |
| `Symbol`, `Action`, `Entry`, `Reason` | Instrumento, tipo, entrada/salida y motivo. |
| `Time`, `TimeMsc` | Instante del deal en segundos y milisegundos, respectivamente. |
| `Price`, `PriceSL`, `PriceTP`, `Digits` | Precio ejecutado, protecciones históricas y precisión. |
| `Volume`, `VolumeClosed` | Volumen ejecutado y cerrado en unidades MT5: `10000 = 1 lote`. |
| `VolumeExt`, `VolumeClosedExt` | Representaciones de mayor precisión: `100000000 = 1 lote`. No se suman a los volúmenes anteriores. |
| `Profit`, `Storage`, `Commission`, `Fee` | Beneficio, swap, comisión y cargo adicional, con sus signos y en moneda de la cuenta. |
| `DigitsCurrency` | Decimales de la moneda de la cuenta. |

`Storage` es el campo de swap de esta API. Un campo omitido o `null` significa
que no fue informado; no equivale a cero. Se conservan los ceros explícitos.

## Cierres y resultado por posición

La ruta devuelve todos los deals del período, incluidas aperturas, cierres y
movimientos de saldo. Para deals de compra/venta (`Action` 0/1), `Entry` distingue:

| Entry | Significado |
| - | - |
| `0` | Entrada o ampliación de posición. |
| `1` | Salida, que puede ser parcial. |
| `2` | Reversión: combina salida y nueva entrada. |
| `3` | Cierre por posición opuesta. |

Cuando los cuatro importes están disponibles, el neto contabilizado de un deal es
`Profit + Storage + Commission + Fee`, respetando los signos originales.
Para el neto completo de una posición, reúne **todos sus deals por `PositionID`**,
incluidas las entradas, pues pueden llevar comisión. Si la apertura ocurrió antes
de `from`, amplía la consulta: un rango parcial no representa el resultado completo.

Una salida no demuestra por sí sola que toda la posición esté cerrada. Considera
cierres parciales y reversiones y consulta posiciones abiertas si necesitas su estado
actual. Los cargos diarios/mensuales o movimientos con `PositionID=0` pueden no
atribuirse a una posición; no los repartas ni los sumes a cada posición automáticamente.
La ruta no inventa una asignación ni calcula un resultado neto por posición.

## Paginación

Suma la cantidad recibida a `offset`. Termina al recibir una página vacía o con
menos registros que `total`. Si la página está llena, solicita la siguiente.
El historial puede cambiar por nuevas operaciones o correcciones: no es una
instantánea bloqueada. Deduplica por `Deal` al sincronizar y vuelve a conciliar
los períodos que puedan recibir correcciones. No presupongas un orden distinto
del que entrega MT5.

```python theme={null}
from datetime import datetime, timezone

start = int(datetime(2026, 10, 1, tzinfo=timezone.utc).timestamp())
end = int(datetime(2026, 10, 21, tzinfo=timezone.utc).timestamp()) - 1
offset, page_size = 0, 100
deals_by_id = {}
while True:
    page = client.deals(167848, start, end, offset=offset, total=page_size)["answer"]
    for deal in page:
        deals_by_id[str(deal["Deal"])] = deal
    if len(page) < page_size:
        break
    offset += len(page)
```

`client` es una instancia autenticada del cliente Python entregado. Un `401`
indica token inválido; `403`, falta de permiso o verificación; `422`, parámetros
inválidos. Un `502/503` no debe interpretarse como historial vacío.

Referencia de conceptos: [propiedades de deals de MetaQuotes](https://www.mql5.com/en/docs/constants/tradingconstants/dealproperties).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.