Como criar um FX Trading Bot com Hermes e FXMacroData
Autor: Equipa FXMacroData
Publicação: 21 de Maio de 2026
Os modelos Hermes são muito adequados para assistentes práticos de negociação porque são rápidos, fáceis de executar localmente e previsíveis em fluxos de trabalho de chamada de ferramentas.
A estratégia de exemplo centra-se em: USD/JPY e utilizações Inflação dos EUA- Não . Taxa de política da Reserva FederalE ... Taxa de juro de política do Banco do Japão Você pode reutilizar o mesmo quadro para qualquer par coberto por FXMacroData.
Requisitos prévios
- Um ambiente local Python 3.10+.
- Uma chave de API do FXMacroData Gestão de API- Não .
- Um ponto final de modelo Hermes (local ou hospedado), como Hermes via Ollama.
- Familiarização básica com as APIs REST e com o scripting Python.
Instalar dependências:
pip install requests python-dotenv
Passo 1: Defina o objetivo do seu bot e regras de risco
Antes de codificar, bloqueie o escopo de decisão.
- Negociar apenas um par (USD/JPY).
- Reagimos apenas a mudanças macro de alto impacto.
- Nunca faça uma ordem em tempo real automaticamente no v1.
- Saída: direção, confiança, nível de invalidação e sugestão de tamanho da posição.
Isto mantém o primeiro bot útil sem transformá-lo numa caixa preta.
Passo 2: Extrair dados macro e FX de FXMacroData
Use a API com a autenticação do parâmetro de consulta.
curl "https://fxmacrodata.com/api/v1/announcements/usd/inflation?api_key=YOUR_API_KEY"
curl "https://fxmacrodata.com/api/v1/announcements/jpy/policy_rate?api_key=YOUR_API_KEY"
curl "https://fxmacrodata.com/api/v1/forex?base=USD"e=JPY&api_key=YOUR_API_KEY"
Também pode consultar o Calendário de lançamento E ... Posicionamento COT para adicionar risco de evento e posicionamento de viés em seu contexto imediato.
Passo 3: Construir um loop de sinal compatível com o Hermes no Python
O script abaixo recupera dados recentes, cria uma carga útil de contexto compacta e pede a Hermes uma decisão estruturada.
import os
import json
import requests
from datetime import datetime, timezone
API_BASE = "https://fxmacrodata.com/api/v1"
API_KEY = os.environ["FXMD_API_KEY"]
HERMES_URL = os.environ["HERMES_URL"] # Example: http://localhost:11434/api/generate
HERMES_MODEL = os.environ.get("HERMES_MODEL", "hermes3")
def fxmd_get(path, **params):
r = requests.get(
f"{API_BASE}{path}",
params={"api_key": API_KEY, **params},
timeout=25,
)
r.raise_for_status()
return r.json()
def last_value(payload):
rows = payload.get("data", [])
return rows[-1] if rows else {}
usd_infl = last_value(fxmd_get("/announcements/usd/inflation"))
jpy_rate = last_value(fxmd_get("/announcements/jpy/policy_rate"))
usd_rate = last_value(fxmd_get("/announcements/usd/policy_rate"))
spot = fxmd_get("/forex", base="USD", quote="JPY").get("data", [])
spot_last = spot[-1] if spot else {}
spot_prev = spot[-2] if len(spot) > 1 else spot_last
context = {
"timestamp_utc": datetime.now(timezone.utc).isoformat(),
"pair": "USD/JPY",
"macro": {
"usd_inflation_latest": usd_infl.get("value"),
"usd_policy_rate_latest": usd_rate.get("value"),
"jpy_policy_rate_latest": jpy_rate.get("value"),
},
"price": {
"last": spot_last.get("value"),
"previous": spot_prev.get("value"),
},
"rules": {
"allowed_actions": ["long", "short", "flat"],
"max_risk_per_trade_pct": 0.5,
"require_invalidation_level": True,
},
}
prompt = f"""
You are an FX strategy assistant.
Use this JSON context: {json.dumps(context)}
Return JSON only with keys:
action, confidence, thesis, invalidation, size_pct, next_data_to_watch
Rules:
- No prose outside JSON.
- Confidence between 0 and 1.
- size_pct must be <= 0.5.
"""
hermes_req = {
"model": HERMES_MODEL,
"prompt": prompt,
"stream": False,
}
resp = requests.post(HERMES_URL, json=hermes_req, timeout=45)
resp.raise_for_status()
raw = resp.json().get("response", "{}")
decision = json.loads(raw)
print(json.dumps(decision, indent=2))
Por que este padrão funciona:
- FXMacroData fornece entradas estruturadas, então Hermes razona sobre campos limpos em vez de texto raspado barulhento.
- O prompt impõe um esquema delimitado, reduzindo a deriva de saída.
- As restrições de risco são inseridas no contexto, não deixadas implícitas.
Passo 4: Adicionar filtros de eventualidade
A maioria das decisões ruins dos bots acontecem em torno de janelas de alta volatilidade.
- Proximidade do calendário: Se a liberação do nível superior for prevista dentro de 30 minutos, rebaixar o tamanho ou a força
flat- Não . - Discrepancia de regime: Se o viés macro e o ímpeto dos preços discordarem drasticamente, reduzir automaticamente a confiança.
Use os links do ponto final nos seus próprios documentos para uma rápida referência: Empregados não agrícolas dos EUA- Não . PCE-centro dos EUAE ... Japão inflação- Não .
Passo 5: Transforme as decisões em alertas, não em execução automática
Em produção, as decisões são encaminhadas para o Slack/Telegram primeiro. A confirmação humana deve permanecer obrigatória até que você tenha amostras suficientes testadas. Um formato prático de alerta:
[FX BOT] USD/JPY
Action: LONG
Confidence: 0.72
Thesis: US inflation + sticky core, policy divergence still USD-supportive.
Invalidation: Daily close below 154.20
Suggested Size: 0.35%
Watch Next: US Core PCE (Friday 12:30 UTC)
Isto mantém a prestação de contas e a auditoria clara, ao mesmo tempo em que economiza tempo de investigação.
Erros comuns a serem evitados
- Deixar o modelo escolher os limites de risco dinamicamente.
- Usar muitos pares antes de validar um par profundamente.
- Ignorando as verificações de dados obsoletos no seu pipeline.
- Tratar a confiança do modelo como uma probabilidade de lucro.
O que construíste
Agora você tem uma arquitetura completa v1 para um bot FX com Hermes: macro estruturado + ingestão de FX, saída de modelo determinista e geração de sinal de risco.
Se quiser aprofundar a configuração, adicione um trabalho de resumo diário que classifique as principais surpresas macro e as mapeie para o impacto provável de FX antes da abertura de Londres.