Build a Two-Agent FX Stack: Research Agent + Execution Gatekeeper banner image

Implementation

How-To Guides

Build a Two-Agent FX Stack: Research Agent + Execution Gatekeeper

Design a safer AI FX workflow by splitting analysis from execution approval: one agent researches macro setups, a second gatekeeper enforces risk rules and blocks unsafe trades before they reach your broker.

Também disponível em English

Construir uma pilha de dois agentes FX: Agente de Pesquisa + Guardião de Execução

Autor: Equipa FXMacroData
Publicação: 21 de Maio de 2026

Os bots de FX de agente único falham por uma razão simples: o mesmo modelo que gera ideias também pode aprová-las. Empregados não agrícolas dos EUA, um erro de raciocínio pode saltar direto para o risco de posição.

Este guia mostra uma arquitetura mais segura: responsabilidades divididas entre dois agentes. O primeiro agente faz pesquisa de mercado e propõe configurações. O segundo agente é um guardião de porta estritamente que só pode aprovar, redimensionar ou rejeitar propostas baseadas em regras de risco difícil.

No final, você terá um fluxo de trabalho prático para dois agentes. EUR/USD E ... GBP/USD que suporta a integração direta de REST API e a integrações de ferramentas baseadas em MCP.

Objectivo: Mudar de "ideias de comércio de IA" para "candidatas de comércios de IA validadas por risco" através da aplicação de uma camada de aprovação obrigatória antes de qualquer ação de corretor.

Requisitos prévios

  • Python 3.10+.
  • Uma chave de API do FXMacroData Gestão de API- Não .
  • Um ponto final de LLM para os agentes de pesquisa e guardiões.
  • Familiarização básica com as APIs JSON e HTTP.

Instalar dependências:

pip install requests python-dotenv pydantic

Crie um .env Ficheiro:

FXMD_API_KEY=your_fxmacrodata_key
RESEARCH_MODEL=claude-or-hermes
GATEKEEPER_MODEL=claude-or-hermes
MAX_RISK_PCT=0.50

Passo 1: Defina papéis rigorosos para ambos os agentes

O que fazer: bloquear responsabilidades antes de escrever código.

  • Agente de investigação: lê o contexto macro + mercado e propõe configurações candidatas.
  • Agente gatekeeper: valida apenas restrições. Não pode inventar novos negócios, apenas aprovar/rejeitar/redimensionar.

Por que é importante: Esta separação impede que um único modelo evite os controlos de risco quando a confiança é elevada mas a evidência é fraca.


Passo 2: extrair contexto estruturado com chamadas REST diretas

O que fazer: obter lançamentos e dados spot de FXMacroData para que o agente de pesquisa obtenha entradas limpas em vez de manchetes não estruturadas.

curl "https://fxmacrodata.com/api/v1/calendar/usd?api_key=YOUR_API_KEY"
curl "https://fxmacrodata.com/api/v1/announcements/eur/inflation?api_key=YOUR_API_KEY"
curl "https://fxmacrodata.com/api/v1/announcements/gbp/unemployment?api_key=YOUR_API_KEY"
curl "https://fxmacrodata.com/api/v1/forex?base=EUR&quote=USD&api_key=YOUR_API_KEY"

Por que é importante: campos consistentes e estruturados dão aos dois agentes a mesma fonte de verdade e tornam a validação determinista.

Colector Python mínimo:

import os
import requests
from datetime import datetime, timezone

API = "https://fxmacrodata.com/api/v1"
KEY = os.environ["FXMD_API_KEY"]


def fxmd_get(path, **params):
    r = requests.get(
        f"{API}{path}",
        params={"api_key": KEY, **params},
        timeout=25,
    )
    r.raise_for_status()
    return r.json()


def build_market_context():
    return {
        "asof_utc": datetime.now(timezone.utc).isoformat(),
        "calendar_usd": fxmd_get("/calendar/usd").get("data", [])[:8],
        "calendar_eur": fxmd_get("/calendar/eur").get("data", [])[:8],
        "eur_inflation": fxmd_get("/announcements/eur/inflation").get("data", [])[-1:],
        "gbp_unemployment": fxmd_get("/announcements/gbp/unemployment").get("data", [])[-1:],
        "eurusd": fxmd_get("/forex", base="EUR", quote="USD").get("data", [])[-48:],
        "gbpusd": fxmd_get("/forex", base="GBP", quote="USD").get("data", [])[-48:],
    }

Etapa 3: Gerar candidatos ao comércio com o agente de investigação

O que fazer: O agente de investigação deve ser informado apenas dos candidatos a profissionais estruturados, não deixando que ele lhe envie instruções prontas para execução.

{
  "pair": "EUR/USD",
  "bias": "long|short|flat",
  "thesis": "string",
  "confidence": 0.0,
  "entry_zone": "string",
  "invalidation": "string",
  "event_risks": ["string"]
}

Por que é importante: Um esquema fixo permite que o guardião de porta aplique regras em campos previsíveis em vez de tentar analisar texto de forma livre.

Dica: incluem o contexto do banco central a partir de Reserva Federal E ... Banco Central Europeu A comunicação no prompt de pesquisa, mas manter a saída final compacta.

Passo 4: Aplicar regras de risco difícil no agente de porteiro

O que fazer: Avaliar cada candidato através de um segundo modelo ou validador de regras com limites rigorosos.

Exemplo de política:

  • Risco máximo por transacção: 0,50% do capital próprio.
  • Nenhuma nova transacção dentro de 15 minutos de lançamentos de alto impacto do Calendário de lançamento- Não .
  • Nível de invalidação obrigatório.
  • Rejeitar se a confiança for < 0,60.

Portão pedântico e saída de decisão:

from pydantic import BaseModel, Field


class Candidate(BaseModel):
    pair: str
    bias: str
    thesis: str
    confidence: float = Field(ge=0.0, le=1.0)
    entry_zone: str
    invalidation: str
    event_risks: list[str]


class GateDecision(BaseModel):
    status: str  # approve, resize, reject
    approved_size_pct: float
    reason: str


def gate(candidate: Candidate, max_risk_pct: float = 0.50) -> GateDecision:
    if candidate.confidence < 0.60:
        return GateDecision(status="reject", approved_size_pct=0.0, reason="Low confidence")
    if not candidate.invalidation.strip():
        return GateDecision(status="reject", approved_size_pct=0.0, reason="Missing invalidation")
    proposed = 0.50 if candidate.confidence >= 0.75 else 0.30
    size = min(proposed, max_risk_pct)
    return GateDecision(status="approve", approved_size_pct=size, reason="Within policy")

Por que é importante: Mesmo que o agente de pesquisa tenha uma leitura errada, o guardião ainda pode bloquear configurações grandes ou fracas.


Passo 5: Adicionar caminho de integração MCP (fluxo de trabalho de agente nativo da ferramenta)

O que fazer: expõe FXMacroData através do MCP para que os frameworks de agentes possam chamar ferramentas de forma nativa em vez de criar cola REST personalizada para cada bot.

Inicie um servidor MCP baseado em Python através do uvx- Não .

uvx fxmacrodata-mcp --transport http --server-url https://fxmacrodata.com/mcp

Exemplo de configuração do cliente:

{
  "mcpServers": {
    "fxmacrodata": {
      "command": "uvx",
      "args": [
        "fxmacrodata-mcp",
        "--transport",
        "http",
        "--server-url",
        "https://fxmacrodata.com/mcp"
      ]
    }
  }
}

Exemplo de esquema de chamada de ferramenta MCP para o seu agente de pesquisa:

{
  "name": "get_fx_calendar_and_spot",
  "description": "Get upcoming macro events and current spot context for selected pairs",
  "input_schema": {
    "type": "object",
    "properties": {
      "currencies": {
        "type": "array",
        "items": { "type": "string" }
      },
      "pairs": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "base": { "type": "string" },
            "quote": { "type": "string" }
          },
          "required": ["base", "quote"]
        }
      }
    },
    "required": ["currencies", "pairs"]
  }
}

Exemplo de invocação de agente (caminho MCP):

Research Agent:
"Using the fxmacrodata MCP tools, pull today's USD/EUR/GBP calendar and spot for EUR/USD and GBP/USD.
Return up to 3 candidate setups in strict JSON schema."

Gatekeeper Agent:
"Validate each candidate against risk policy v1. Reject anything violating confidence,
size, invalidation, or event-window constraints. Return approve/resize/reject with reason."

Por que é importante: O MCP reduz a deriva de integração à medida que a pilha cresce, especialmente quando você executa vários agentes ou fornecedores de modelos de swap.


Passo 6: Roteamento de saídas para revisão humana, em seguida, intermediário API

O que fazer: Envie a decisão do guardião de porta para o Slack/Telegram primeiro. Envie transações aprovadas para sistemas de execução somente após confirmação humana nas versões iniciais.

Por que é importante: Isto cria um loop auditável e protege-o durante as alterações de prompt ou modelo.

[FX Two-Agent Candidate]
Pair: EUR/USD
Research Bias: Long
Gatekeeper: Approve
Approved Size: 0.30%
Reason: Confidence 0.71, invalidation present, no high-impact event in 15m window.

O que construíste

Agora você tem uma arquitetura FX de dois agentes que separa a geração de ideias da aprovação de riscos, suporta integração direta REST e também suporta a orquestração de ferramentas baseadas em MCP através de uvxEsta é uma base mais forte do que os bots de agente único porque os candidatos ao comércio devem sobreviver a um portal de política independente antes da execução.

Próximo passo: adicionar uma camada de interruptor de morte que força automaticamente . reject Você também pode adicionar restrições de sessão conscientes de Sessões de câmbio e posicionamento do contexto de COT- Não .

Blogroll