Oryon

documentação

API para utilizadores avançados

O Oryon é determinista por design. Podes exportar estratégias, lançar backtests a partir de outros scripts, consultar o estado do serviço ou ligar o teu próprio runner. Aqui está o contrato mínimo.

MetodologiaSegurançaEstado

Formato de estratégia

A estratégia é um JSON validado com Zod. Podes exportá-la da biblioteca ou de um link partilhado. Campos-chave: schemaVersion, name, market, symbol, timeframe, direction, indicators, entry, exit, risk e 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"] }
}

O motor rejeita referências a indicadores inexistentes, ids duplicados e grupos de entrada vazios. O mesmo JSON é usado no backtest, na carteira, na implantação e na exportação MQL5.

Autenticação

  • Web: cookie de sessão httpOnly `oryon_session`. As mutações requerem Origin de confiança.
  • Runner/PC: `Authorization: Bearer <token>` ou o cabeçalho `x-oryon-runner`. O token é obtido ao emparelhar o PC e na web só vive o seu hash.
  • Não há API keys de utilizador. Se automatizares a partir de um script, inicia sessão e reutiliza o cookie ou usa o token do runner para as rotas de runner.
  • Públicas sem sessão: backtest, walkforward, optimize, demo, status, shares e waitlist. Estratégias, conta, billing e runner requerem a sua credencial.

Backtest e demo

POST /api/backtest aceita `strategy`, `bars`, `dataSource` (`real` ou `synthetic`) e `trials`. É público, mas tem rate limit por IP. Com sessão, desconta quota de backtests do plano.

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 devolve um backtest real pré-carregado e em cache. Não requer conta.

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

Realismo do backtest

  • `costs.spreadBySession` multiplica o spread conforme a sessão UTC. `swapLongPctPerDay` e `swapShortPctPerDay` rateiam swap/funding pelo tempo em mercado.
  • `timeFilter` bloqueia entradas fora dos dias, horas ou sessões. As saídas por stop, objetivo, sinal ou tempo são sempre permitidas.
  • As condições `higherTimeframe` usam a última vela fechada de uma temporalidade superior; as velas base são agregadas e não se olha para o 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 e diário

  • POST /api/monitors cria uma vigilância diária ou semanal. POST /api/monitors/[id]/run executa-a agora. O cron chama /api/monitors/run com o segredo do servidor.
  • Cada execução guarda regime, métricas e avisos. Se o regime mudar ou um limite for ultrapassado, é enviado um aviso `monitor_alert`.
  • POST /api/journal guarda notas, etiquetas, captura e lição. PATCH/DELETE /api/journal/[id] edita ou apaga. As capturas são validadas e nunca são servidas a partir do disco.
  • O histórico de versões calcula as alterações face à versão anterior; não substitui definições antigas.

Integrações

  • TradingView: POST /api/integrations/tradingview/[token] aceita JSON ou texto e guarda um sinal. O token só é mostrado ao criar a ligação.
  • A Binance e a Bybit ligam-se em modo de só leitura para testar credenciais e consultar a conta. A execução continua reservada ao MT5.
  • O cTrader guarda a configuração OAuth; o fluxo completo fica pendente de uma fase posterior.

Carteira e otimização

  • POST /api/portfolio/backtest: `versionIds` (2–12), limites e `dataSource`. Requer sessão e desconta quota de carteiras.
  • POST /api/walkforward, /api/optimize e /api/optimize/sensitivity usam o mesmo formato de estratégia e têm rate limits mais estritos.

Runner e estado

O PC reporta batimento, implantações e resultados do Strategy Tester. O site não fala diretamente com o 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 é público e devolve o estado do site, da base de dados e dos fornecedores de dados. Ideal para monitores.

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

Webhooks de avisos

Os avisos de saída podem ser enviados para um webhook. Se configurares um segredo, o corpo é assinado com HMAC-SHA256 em `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": {}
}

Quotas e erros

  • Quando uma quota é ultrapassada, a API responde 402 com `{ ok:false, upgrade:true, plan, quota }`.
  • O rate limit por IP responde 429 com `Retry-After`. Os limites exatos estão em Preços.
  • Os erros de validação respondem 422 com `issues` legíveis. Não se guarda nada a meio.

Segurança

Não há segredos no cliente. As chaves de IA são cifradas no servidor, as sessões são guardadas como hash e o token do runner é comparado com o seu hash. CSP, HSTS, verificações de Origin e rate limit são aplicados no proxy.

Para reportar uma vulnerabilidade: oryon.help@outlook.com.

Exportar e importar

GET /api/strategies/[id]/export?version=... descarrega um JSON com `{ format, formatVersion, exportedAt, strategy }`. POST /api/strategies/import aceita esse JSON ou uma estratégia isolada e valida com o mesmo esquema.

A API pode mudar antes da versão 1.0. Se dependes dela em produção, escreve-nos e mantemos compatibilidade para o teu caso.