Oryon

documentación

API para usuarios avanzados

Oryon es determinista por diseño. Puedes exportar estrategias, lanzar backtests desde otros scripts, consultar el estado del servicio o conectar tu propio runner. Aquí está el contrato mínimo.

MetodologíaSeguridadEstado

Formato de estrategia

La estrategia es un JSON validado con Zod. Puedes exportarla desde la biblioteca o desde un enlace compartido. Campos clave: schemaVersion, name, market, symbol, timeframe, direction, indicators, entry, exit, risk y costs.

{
  "schemaVersion": 1,
  "name": "Cruce EMA 20/50",
  "description": "Tendencia clásica",
  "market": "crypto",
  "symbol": "BTCUSD",
  "timeframe": "1h",
  "direction": "both",
  "reverseOnOpposite": true,
  "indicators": [
    { "id": "ema_fast", "kind": "ema", "period": 20, "source": "close" },
    { "id": "ema_slow", "kind": "ema", "period": 50, "source": "close" }
  ],
  "entry": {
    "long": { "mode": "all", "conditions": [
      { "left": { "type": "indicator", "indicatorId": "ema_fast" },
        "op": "crossAbove",
        "right": { "type": "indicator", "indicatorId": "ema_slow" } }
    ] },
    "short": null
  },
  "exit": { "long": null, "short": null },
  "risk": { "positionSizePct": 10, "sizingMode": "riskPct",
            "riskPerTradePct": 1, "maxLeverage": 1,
            "stopLossMode": "atr", "stopLossAtrMultiple": 2.5,
            "takeProfitMode": "atr", "takeProfitAtrMultiple": 4 },
  "costs": { "spreadPct": 0.01, "commissionPct": 0.02, "slippagePct": 0.01,
             "swapLongPctPerDay": 0.005, "swapShortPctPerDay": 0.005,
             "spreadBySession": { "asia": 1.4, "london": 1,
                                  "overlap": 0.9, "newYork": 1.1,
                                  "offHours": 1.6 } },
  "timeFilter": { "enabled": true, "days": [1,2,3,4,5],
                  "startHourUtc": 7, "endHourUtc": 20,
                  "sessions": ["london", "overlap", "newYork"] }
}

El motor rechaza referencias a indicadores inexistentes, ids duplicados y grupos de entrada vacíos. El mismo JSON se usa en backtest, cartera, despliegue y exportación MQL5.

Autenticación

  • Web: cookie de sesión httpOnly `oryon_session`. Las mutaciones requieren Origin de confianza.
  • Runner/PC: `Authorization: Bearer <token>` o cabecera `x-oryon-runner`. El token se obtiene al emparejar el PC y en la web solo vive su hash.
  • No hay API keys de usuario. Si automatizas desde un script, inicia sesión y reutiliza la cookie o usa el token del runner para las rutas de runner.
  • Públicas sin sesión: backtest, walkforward, optimize, demo, status, shares y waitlist. Estrategias, cuenta, billing y runner requieren su credencial.

Backtest y demo

POST /api/backtest acepta `strategy`, `bars`, `dataSource` (`real` o `synthetic`) y `trials`. Es público, pero tiene rate limit por IP. Si hay sesión, descuenta cuota de backtests del plan.

curl -X POST https://tu-dominio/api/backtest \
  -H "Content-Type: application/json" \
  -d '{"strategy": { ... }, "bars": 1500, "dataSource": "real"}'

GET /api/demo?preset=ema|rsi|breakout devuelve un backtest real precargado y cacheado. No requiere cuenta.

curl "https://tu-dominio/api/demo?preset=ema"

Realismo del backtest

  • `costs.spreadBySession` multiplica el spread según la sesión UTC. `swapLongPctPerDay` y `swapShortPctPerDay` prorratean swap/funding por el tiempo en mercado.
  • `timeFilter` bloquea entradas fuera de días, horas o sesiones. Las salidas por stop, objetivo, señal o tiempo siempre se permiten.
  • Las condiciones `higherTimeframe` usan la última vela cerrada de una temporalidad superior; se agregan las velas base y no se mira el futuro.
  • `risk.sizingMode: "riskPct"` calcula el notional desde la distancia real al stop. `maxLeverage` limita el tamaño; si no hay stop, se usa el % fijo como respaldo.

Monitor y diario

  • POST /api/monitors crea una vigilancia diaria o semanal. POST /api/monitors/[id]/run la ejecuta ahora. El cron llama a /api/monitors/run con el secreto del servidor.
  • Cada ejecución guarda régimen, métricas y avisos. Si cambia el régimen o se cruza un umbral, se envía un aviso `monitor_alert`.
  • POST /api/journal guarda notas, etiquetas, captura y lección. PATCH/DELETE /api/journal/[id] edita o borra. Las capturas se validan y nunca se sirven desde disco.
  • El historial de versiones calcula los cambios frente a la versión anterior; no sobrescribe definiciones antiguas.

Integraciones

  • TradingView: POST /api/integrations/tradingview/[token] acepta JSON o texto y guarda una señal. El token solo se muestra al crear la conexión.
  • Binance y Bybit se conectan en modo de solo lectura para probar credenciales y consultar la cuenta. La ejecución sigue reservada a MT5.
  • cTrader guarda la configuración OAuth; el flujo completo queda pendiente de una fase posterior.

Cartera y optimización

  • POST /api/portfolio/backtest: `versionIds` (2–12), límites y `dataSource`. Requiere sesión y descuenta cuota de carteras.
  • POST /api/walkforward, /api/optimize y /api/optimize/sensitivity usan el mismo formato de estrategia y tienen rate limits más estrictos.

Runner y estado

El PC reporta latido, despliegues y resultados del Strategy Tester. La web no habla directamente con MetaTrader.

curl -X POST https://tu-dominio/api/runner/report \
  -H "Authorization: Bearer $ORYON_RUNNER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"host":"mi-pc","account":"demo","equity":10000,"running":[]}'

GET /api/status es público y devuelve el estado de la web, la base de datos y los proveedores de datos. Ideal para monitores.

curl https://tu-dominio/api/status

Webhooks de avisos

Los avisos salientes pueden enviarse a un webhook. Si configuras un secreto, se firma el cuerpo con HMAC-SHA256 en `X-Oryon-Signature: sha256=...`.

POST https://tu-servidor/hook
Content-Type: application/json
X-Oryon-Event: order_rejected
X-Oryon-Signature: sha256=<hmac>

{
  "event": "order_rejected",
  "title": "Orden rechazada",
  "body": "EURUSD · ...",
  "severity": "warning",
  "url": "https://tu-dominio/operar/...",
  "timestamp": "2026-11-09T12:00:00.000Z",
  "data": {}
}

Cuotas y errores

  • Cuando se supera una cuota, la API responde 402 con `{ ok:false, upgrade:true, plan, quota }`.
  • El rate limit por IP responde 429 con `Retry-After`. Los límites exactos están en Precios.
  • Los errores de validación responden 422 con `issues` legibles. No se guarda nada a medias.

Seguridad

No hay secretos en el cliente. Las claves de IA se cifran en servidor, las sesiones se guardan como hash y el token del runner se compara contra su hash. CSP, HSTS, Origin checks y rate limit se aplican en el proxy.

Para reportar una vulnerabilidad: oryon.help@outlook.com.

Exportar e importar

GET /api/strategies/[id]/export?version=... descarga un JSON con `{ format, formatVersion, exportedAt, strategy }`. POST /api/strategies/import acepta ese JSON o una estrategia suelta y valida con el mismo esquema.

La API puede cambiar antes de la versión 1.0. Si dependes de ella en producción, escríbenos y mantenemos compatibilidad para tu caso.