Operaciones (Trades)

Listar, leer, crear, actualizar y eliminar operaciones con ejecuciones y filtros.

Listar operaciones

Recupera una lista paginada de operaciones con filtrado opcional.

Endpoint: GET /api/v1/trades

Parámetros de consulta

ParámetroTipoDescripción
pageintegerNúmero de página (por defecto 1)
limitintegerElementos por página, máx 100 (por defecto 50)
start_datestringFiltrar operaciones desde esta fecha (ISO 8601)
end_datestringFiltrar operaciones hasta esta fecha (ISO 8601)
symbolstringFiltrar por símbolo de ticker (no sensible a mayúsculas)
account_idstringFiltrar por UUID de cuenta de trading

Ejemplo de solicitud

cURL:

curl "https://app.mypropjournal.com/api/v1/trades?page=1&limit=25&symbol=NQ" \
  -H "Authorization: Bearer mpj_tu_clave_api_aqui" \
  -H "Content-Type: application/json"

JavaScript:

const response = await fetch(
  'https://app.mypropjournal.com/api/v1/trades?page=1&limit=25&symbol=NQ',
  {
    headers: {
      'Authorization': 'Bearer mpj_tu_clave_api_aqui',
      'Content-Type': 'application/json'
    }
  }
);

const data = await response.json();
console.log(`Se encontraron ${data.pagination.total} operaciones`);

Python:

import requests

headers = {
    'Authorization': 'Bearer mpj_tu_clave_api_aqui',
    'Content-Type': 'application/json'
}

params = {
    'page': 1,
    'limit': 25,
    'symbol': 'NQ'
}

response = requests.get(
    'https://app.mypropjournal.com/api/v1/trades',
    headers=headers,
    params=params
)

data = response.json()
print(f"Se encontraron {data['pagination']['total']} operaciones")

Ejemplo de respuesta

{
  "data": [
    {
      "id": "fd07b82a-164c-4c24-885a-7f4db54dab62",
      "account_id": "f1588e0d-93fd-4a76-b876-b0753f93bc09",
      "symbol": "NQ",
      "side": "short",
      "quantity": 1,
      "entry_price": 29298,
      "exit_price": 29290,
      "entry_time": "10:17:54",
      "exit_time": "10:18:29",
      "gross_pnl": 160,
      "net_pnl": 158,
      "total_commission": 2,
      "status": "win",
      "entry_date": "2026-02-05",
      "exit_date": "2026-02-05",
      "asset_class": "futures",
      "executions": [
        {
          "id": "1ed21bd6-8ea2-42d0-b16e-142f9484ecb9",
          "side": "sell",
          "price": 29298,
          "quantity": 1,
          "commission": 1,
          "execution_time": "10:17:54",
          "execution_type": "scale_in",
          "execution_timestamp": "2026-02-05T15:17:54+00:00"
        },
        {
          "id": "2ed21bd6-8ea2-42d0-b16e-142f9484ecb9",
          "side": "buy",
          "price": 29290,
          "quantity": 1,
          "commission": 1,
          "execution_time": "10:18:29",
          "execution_type": "scale_out",
          "execution_timestamp": "2026-02-05T15:18:29+00:00"
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 305,
    "totalPages": 13,
    "has_more": true
  }
}

Campos de respuesta

Cada objeto de operación incluye:

CampoTipoDescripción
idstringIdentificador único de operación (UUID)
account_idstringUUID de cuenta de trading
symbolstringSímbolo de ticker (ej: "NQ", "TSLA")
sidestringDirección de operación: "long" o "short"
quantitynumberTamaño total de posición
entry_pricenumberPrecio promedio de entrada
exit_pricenumberPrecio promedio de salida (null si está abierta)
entry_timestringHora de entrada (formato HH:MM:SS)
exit_timestringHora de salida (formato HH:MM:SS, null si abierta)
gross_pnlnumberGanancia/pérdida antes de comisiones
net_pnlnumberGanancia/pérdida después de comisiones
total_commissionnumberTotal de comisiones pagadas
statusstring"win", "loss", o "breakeven"
entry_datestringFecha de entrada (formato YYYY-MM-DD)
exit_datestringFecha de salida (formato YYYY-MM-DD, null si abierta)
asset_classstring"futures", "stocks", "options", "forex", etc.
executionsarrayArray de objetos de ejecución (ver abajo)

Obtener una sola operación

Recupera información detallada de una operación específica.

Endpoint: GET /api/v1/trades/{id}

Ejemplo de solicitud

cURL:

curl "https://app.mypropjournal.com/api/v1/trades/fd07b82a-164c-4c24-885a-7f4db54dab62" \
  -H "Authorization: Bearer mpj_tu_clave_api_aqui" \
  -H "Content-Type: application/json"

Ejemplo de respuesta

Devuelve un solo objeto de operación con la misma estructura mostrada en el endpoint de lista, incluyendo todas las ejecuciones.

Crear una operación

Agrega una nueva operación a tu diario.

Endpoint: POST /api/v1/trades

Campos requeridos

CampoTipoDescripción
account_idstringUUID de la cuenta de trading
symbolstringSímbolo de ticker
sidestring"long" o "short"
entry_datestringFecha de entrada (formato YYYY-MM-DD)
entry_pricenumberPrecio de entrada

Campos opcionales

CampoTipoDescripción
entry_timestringHora de entrada (formato HH:MM:SS)
quantitynumberTamaño de posición
executionsarrayArray de objetos de ejecución (recomendado)

Estructura de objeto de ejecución

Al proporcionar ejecuciones, cada objeto debe incluir:

CampoTipoDescripción
sidestring"buy" o "sell"
quantitynumberNúmero de acciones/contratos
pricenumberPrecio de ejecución
execution_timestringHora de ejecución (formato HH:MM:SS)
commissionnumberComisiones de transacción opcionales
execution_typestringOpcional: "scale_in", "scale_out", "full"

Ejemplo de solicitud

cURL:

curl -X POST "https://app.mypropjournal.com/api/v1/trades" \
  -H "Authorization: Bearer mpj_tu_clave_api_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": "f1588e0d-93fd-4a76-b876-b0753f93bc09",
    "symbol": "TSLA",
    "side": "long",
    "entry_date": "2024-01-15",
    "entry_price": 245.00,
    "entry_time": "10:30:00",
    "quantity": 50,
    "executions": [
      {
        "side": "buy",
        "quantity": 50,
        "price": 245.00,
        "execution_time": "10:30:00",
        "commission": 0.50,
        "execution_type": "full"
      }
    ]
  }'

JavaScript:

const tradeData = {
  account_id: "f1588e0d-93fd-4a76-b876-b0753f93bc09",
  symbol: "TSLA",
  side: "long",
  entry_date: "2024-01-15",
  entry_price: 245.00,
  entry_time: "10:30:00",
  quantity: 50,
  executions: [
    {
      side: "buy",
      quantity: 50,
      price: 245.00,
      execution_time: "10:30:00",
      commission: 0.50,
      execution_type: "full"
    }
  ]
};

const response = await fetch('https://app.mypropjournal.com/api/v1/trades', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer mpj_tu_clave_api_aqui',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(tradeData)
});

const result = await response.json();
console.log('Operación creada:', result.data.id);

Python:

import requests

trade_data = {
    'account_id': 'f1588e0d-93fd-4a76-b876-b0753f93bc09',
    'symbol': 'TSLA',
    'side': 'long',
    'entry_date': '2024-01-15',
    'entry_price': 245.00,
    'entry_time': '10:30:00',
    'quantity': 50,
    'executions': [
        {
            'side': 'buy',
            'quantity': 50,
            'price': 245.00,
            'execution_time': '10:30:00',
            'commission': 0.50,
            'execution_type': 'full'
        }
    ]
}

response = requests.post(
    'https://app.mypropjournal.com/api/v1/trades',
    headers={
        'Authorization': 'Bearer mpj_tu_clave_api_aqui',
        'Content-Type': 'application/json'
    },
    json=trade_data
)

result = response.json()
print(f"Operación creada: {result['data']['id']}")

Ejemplo de respuesta

{
  "data": {
    "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
    "account_id": "f1588e0d-93fd-4a76-b876-b0753f93bc09",
    "symbol": "TSLA",
    "side": "long",
    "quantity": 50,
    "entry_price": 245.00,
    "entry_time": "10:30:00",
    "entry_date": "2024-01-15",
    "status": "open",
    "asset_class": "stocks",
    "created_at": "2024-01-15T10:30:00Z"
  }
}

Actualizar una operación

Modifica una operación existente.

Endpoint: PUT /api/v1/trades/{id}

Cuerpo de solicitud

Acepta los mismos campos que el endpoint de creación. Todos los campos son opcionales — solo se actualizarán los campos proporcionados.

Ejemplo de solicitud

cURL:

curl -X PUT "https://app.mypropjournal.com/api/v1/trades/fd07b82a-164c-4c24-885a-7f4db54dab62" \
  -H "Authorization: Bearer mpj_tu_clave_api_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "exit_price": 250.00,
    "exit_time": "14:30:00",
    "exit_date": "2024-01-15",
    "status": "win"
  }'

Eliminar una operación

Elimina permanentemente una operación y sus ejecuciones asociadas.

Endpoint: DELETE /api/v1/trades/{id}

Advertencia de Eliminación en Cascada

Eliminar una operación eliminará permanentemente en cascada los siguientes datos relacionados:

  • Todas las ejecuciones asociadas con esta operación
  • Todos los análisis de operaciones vinculados a esta operación
  • Todas las asociaciones de etiquetas para esta operación

Esta acción no se puede deshacer. La respuesta de la API incluirá advertencias sobre qué datos fueron afectados.

Ejemplo de solicitud

cURL:

curl -X DELETE "https://app.mypropjournal.com/api/v1/trades/fd07b82a-164c-4c24-885a-7f4db54dab62" \
  -H "Authorization: Bearer mpj_tu_clave_api_aqui"

Ejemplo de respuesta

{
  "success": true,
  "deleted_id": "fd07b82a-164c-4c24-885a-7f4db54dab62"
}

Respuestas de error

400 Bad Request

Datos o parámetros de solicitud inválidos:

{
  "error": "Validación fallida",
  "code": "VALIDATION_ERROR",
  "details": {
    "entry_price": "Debe ser un número positivo",
    "side": "Debe ser 'long' o 'short'"
  }
}

401 Unauthorized

Clave API faltante o inválida:

{
  "error": "Clave API inválida",
  "code": "INVALID_API_KEY"
}

404 Not Found

La operación no existe o no te pertenece:

{
  "error": "Operación no encontrada",
  "code": "NOT_FOUND"
}

Consulta la página Paginación y errores para la documentación completa de errores.