OKXStrategy - Algorithmic crypto trading application for OKX only. Use this skill when asked about: OKXStrategy, OKX trading bots, strategies, Telegram operational alerts, OKX credentials via database, Docker/Traefik deployment, Hostinger VPS, or okx.tradixio.com.
Resources
6Install
npx skillscat add romualdoalves/okxstrategy Install via the SkillsCat registry.
OKXStrategy - Project Status
Date of this snapshot: 2026-06-05
Exchange: OKX only
Active API Key: armazenada fora do repositório
User location: Brazil
Deploy target: Hostinger VPS KVM4 via Docker + Traefik
Domain: https://okx.tradixio.com
DNS/Subdomínio: okx.tradixio.com já foi criado no VPS.
Repository: https://github.com/romualdoalves/okxstrategy
Deploy path: /opt/okx-strategy
GitHub Token: nunca documentar tokens reais no repositório
Key ID in use: armazenado fora do repositório
REGRA ABSOLUTA — OKXStrategy Operacional
Esta aplicação deve ser tratada como OKXStrategy. Trabalhe somente no
repositório E:\Dell Inspiron\W\Dev\Trading\OKXTrader\OKXStrategy.
Ritual obrigatório de entrega
- Sempre atualizar este
SKILL.mdquando houver mudança operacional, deploy,
regra de segurança, banco de dados ou fluxo de trabalho. - Sempre commitar e enviar as alterações para o GitHub antes de responder com
comandos de deploy. - Ao final de pedidos de deploy, responder somente com os comandos para executar
no VPS. - Não incluir
mkdir -p /opt/okx-strategynos comandos de deploy futuros: a
pasta já foi criada no VPS. - Nunca usar ou tocar no diretório raiz
E:\Dell Inspiron\W\Dev\Trading\OKXTrader\OKXStrategy.
Conexão OKX via banco
- As credenciais operacionais OKX devem ser cadastradas pela aplicação, via:
GET /api/account/connectionPOST /api/account/connectPOST /api/account/disconnect
OKX_API_KEYeOKX_API_SECRETnão podem ser usados como dependência
operacional no.env.OKXExchangeeOKXPrivateStreamdevem ler chaves exclusivamente da tabelasettings, com valores criptografados.- Ao conectar uma nova conta OKX, o usuário deve confirmar a limpeza operacional
local. A aplicação apaga bots, trades, signal logs, snapshots, relatórios e
rejeições locais antes de salvar as novas chaves. - Desconectar OKX remove as chaves do banco e para bots ativos.
Regra OKX-only para estratégias
- Todas as estratégias devem operar somente na OKX.
EXCHANGE_PROVIDERdiferente deokxdeve ser rejeitado pela aplicação.- Não adicionar novas dependências operacionais, adapters, streams, rotas ou
parâmetros que executem ordens em outra corretora. - A fonte CEX local da estratégia A006 é OKX (
okx_price,use_okx_only). - O adapter legado de outra corretora foi removido do repositório OKXStrategy.
S013 - Viana Mini-Índice
- Categoria:
S/ Estratégias de Estrutura, Price Action e Liquidez. - ID:
S013. - Nome:
S013 - Viana Mini-Índice. - Descrição operacional: Price Action limpo com VWAP intradiária, candle de
abertura, leitura de players OKX e confirmação por fechamento de força,
Fair Value Gap ou barra ignorada. - Critérios:
- C1: VWAP acima da máxima do primeiro candle da sessão permite compra; VWAP
abaixo da mínima permite venda; VWAP dentro do range mantém HOLD. - C2: rejeição/teste da VWAP no lado do viés.
- C3: fechamento de força. Compra fecha acima da máxima do candle anterior;
venda fecha abaixo da mínima do candle anterior. - C4: confirmação por FVG de 3 candles ou barra ignorada/inside candle.
- C5: players de mercado via OKX Rubik Trading Statistics:
long-short-account-ratioetop-traders-position-ratio. - C6: volume relativo mínimo.
- C7: execução com SL/TP1 por ATR.
- C1: VWAP acima da máxima do primeiro candle da sessão permite compra; VWAP
- Feed de players:
backend/feeds/okx_market_players.py.- Usa endpoints públicos da OKX, sem credenciais.
- Divergência vendedora: varejo comprado (
ratio > 1.4) e top traders
vendidos (shortRatio > 0.55). - Divergência compradora: varejo vendido (
ratio < 0.8) e top traders
comprados (longRatio > 0.55).
- O parâmetro
require_market_playerspermite tornar a confirmação de players
obrigatória. Por padrão, a estratégia não bloqueia se a fonte pública estiver
indisponível.
Regra de um ativo por bot
- Cada símbolo OKX pode existir em apenas um bot.
- Validar duplicidade ao criar, editar, iniciar e trocar símbolo.
- O
BotManagertambém deve manter trava runtime para impedir dois bots ativos
no mesmo símbolo, mesmo que alguma rota futura ignore a validação. - O banco deve manter índice/constraint único para
bots.symbol.
Auditoria de rejeições OKX
- Toda rejeição/falha crítica de ordem deve ser persistida em
order_rejections. - APIs obrigatórias:
GET /api/order-rejectionsPATCH /api/order-rejections/{id}
- Rejeições de entrada, Stop Loss, trailing stop e fallback de proteção devem
conter bot, símbolo, lado, tipo de ordem,ordId/algoIdquando houver,
motivo e payload bruto.
Stop Loss e lucro garantido
- Para OKX API v5, o trailing stop nativo usa
/api/v5/trade/order-algocomordType="move_order_stop"ecallbackRatio/callbackSpread, conforme a
documentação oficial OKX. Não substituir por nomenclatura de outra corretora. - Fills de Stop Loss/trailing devem ser reconhecidos por
ordIdquando a OKX
gerar a ordem executável, e poralgoIdquando disponível. - Se o trailing stop falhar, criar fallback de Stop Loss fixo e registrar a
rejeição do trailing. Se o fallback também falhar, registrar rejeição crítica.
Telegram operacional
- O botão de teste Telegram envia saldos oficiais da exchange:
- PT-BR:
Enviar Saldos (Telegram) - EN-US:
Send Balances (Telegram)
- PT-BR:
- A rota legada
POST /api/system/telegram-testpermanece, mas envia snapshot
oficial de saldo/posição, não mensagem genérica. - Mensagens Telegram devem incluir timestamp, bot/símbolo quando aplicável,
detalhes de ordem, saldo/posição oficial e eventos críticos.
Deploy e banco
- O banco operacional deve ser
okx_strategy. - Nunca apagar, renomear ou recriar volumes Docker sem autorização explícita do
usuário. Deploys devem preservar o banco OKX por padrão.
Troubleshooting HTTPS/TLS
- O domínio oficial é
okx.tradixio.come aponta para187.127.251.139. - Se o navegador mostrar "Não foi possível estabelecer uma conexão segura" ou
"resposta inválida", as causas mais prováveis são:- Traefik não está rodando ou não está escutando na porta 443.
- Firewall/VPS não liberou 80 e 443.
- O container
okx_strategynão está conectado à redetraefik-public. - O certificado Let's Encrypt ainda não foi emitido ou falhou nos logs.
- Outro serviço está respondendo na porta 443.
- Verificar sempre com
docker logs traefike com umcurl -vk https://okx.tradixio.comno VPS. - Em 2026-06-04, os logs do Traefik mostraram duas falhas ACME relevantes:
NXDOMAIN looking up A/AAAA for okx.tradixio.com: DNS ainda não existia ou
não havia propagado.tls: no application protocolem2.57.91.91: Let's Encrypt resolveu o
domínio para IP errado/antigo, não para187.127.251.139, ou a porta 443
estava chegando em serviço que não era o Traefik com TLS-ALPN.
- Antes de tentar novo deploy, confirmar de dentro do VPS que resolvers públicos
(1.1.1.1,8.8.8.8) retornam187.127.251.139para o A record e que não
existe AAAA incorreto. Se houver AAAA, ele deve apontar corretamente ou ser
removido. - Estado confirmado em 2026-06-04:
okx.tradixio.comresolve para187.127.251.139.- HTTP retorna
308 Permanent Redirectpara HTTPS. - HTTPS responde
200com certificado Let's Encrypt paraCN=okx.tradixio.com. - O container
okx_strategyestá servindo o frontend OKXStrategy via Uvicorn.
curl -I https://okx.tradixio.com/api/healthretornava405porque-I
envia métodoHEADe a rota só aceitavaGET; a API agora aceitaHEADem/api/health.- Se o VPS responde
curl -vk https://okx.tradixio.comcom TLS válido e200,
mas o Chrome local mostraERR_SSL_PROTOCOL_ERROR, verificar cache/DNS do
cliente local ou proxy/ISP ainda resolvendo para IP antigo. O problema não é
do certificado no VPS quando ocurlno VPS mostra certificado Let's Encrypt
válido e resposta200. - Hard refresh (
Ctrl+Shift+R) não corrige erro SSL quando a causa é cache DNS,
cache de socket/SSL do navegador, proxy/ISP ou resolução pública divergente.
REGRA ABSOLUTA — Conformidade App ↔ OKX Oficial
Esta regra tem prioridade sobre qualquer outra decisão técnica.
A aplicação deve manter 100% de conformidade com a OKX em todos os indicadores:
| Dimensão | O que deve ser idêntico |
|---|---|
| Balance | Equity, disponível, margem |
| Positions | Símbolo, quantidade, preço médio, P&L não realizado |
| Orders | Ordens abertas, status, tipo |
| Activities | Fills, fees — todos os registros |
| Histórico | Trades fechados, P&L realizado, corretagens |
Qualquer discrepância, por menor que seja, exige:
- Identificar a causa raiz (WebSocket, REST polling, DB órfão, bug de cálculo)
- Corrigir o código antes de retomar operações
- Executar Reset Geral (parar bots + limpar DB + sincronizar OKX)
- Reiniciar tudo do zero com conta limpa confirmada
Mecanismos de conformidade já implementados:
- WebSocket
orders→ fill confirmado em tempo real - REST polling fallback →
_confirm_fill_price(~2 min, 7 tentativas) _reconcile_loop→ a cada 5 min, detecta posições no DB que a OKX não tem- Ordem rejeitada/cancelada → deleta trade do banco e reseta o bot
- Reset Geral →
POST /api/account/reset— liquida, limpa DB, sincroniza OKX
1. Two parallel implementations
| Aspect | OKXStrategy (ATIVO) |
|---|---|
| Entry point | OKXStrategy/backend/main.py → FastAPI + Uvicorn |
| Language | Python + aiohttp/websockets (OKX REST/WS nativo) |
| Persistence | PostgreSQL okx_strategy |
| Dashboards | React SPA (frontend integrado) |
| Execution | Contínuo via asyncio tasks |
⚠️ Deploy atual: O deploy de produção é feito SEMPRE via Docker + Traefik
no Hostinger VPS KVM4. A pasta de deploy é/opt/okx-strategye o código
é sincronizado a partir do repositório GitHub. O domínio de acesso éhttps://okx.tradixio.com.
2. Estratégias OKXStrategy
As estratégias estão em OKXStrategy/backend/strategies/.
Phase 1 - Macro Filter
- Funding rate (Binance Futures public API, no auth): blocks longs if
funding >+0.01%per 8h (too long-heavy). - Open Interest trend (5-min bars, last 6): blocks longs if price rising +
OI falling (short-covering rally, not real demand).
Phase 2 - Volume Profile (VAH / POC / VAL)
- Builds a 50-bin volume histogram over the last 60 bars (5h of 5-min).
- POC = Point of Control (highest-volume level).
- VAH / VAL = Value Area High / Low - price boundaries containing 70% of
the day's volume (expanded outward from POC). - Regime:
BALANCEDifVAL <= price <= VAH, elseIMBALANCED.
Phase 3 - Entry Signals (two engines, regime-gated)
Engine A - IMBALANCED (breakout/momentum)
- Long breakout:
price > VAHANDprev_close <= VAHANDdelta_z >= 2.0
ANDprice > VWAPANDprice > EMA50AND macro OK - Short breakdown:
price < VALANDprev_close >= VALANDdelta_z <= -2.0
ANDprice < VWAPANDprice < EMA50AND macro OK
Engine B - BALANCED (mean reversion)
- Buy at VAL:
price <= VAL + 0.3xATRAND (MFI < 30OR bullish divergence) - Sell at VAH:
price >= VAH - 0.3xATRAND (MFI > 70OR bearish divergence)
Indicators computed: EMA50, VWAP (cumulative), ATR(14), MFI(14), Volume Delta,
Volume Delta Z-Score (20-bar rolling), vol_index (ATR/price).
Phase 4 - Risk & Sizing
- Dynamic qty:
BUY_AMOUNT_USD x (1/vol_index) / price, bounded [0.1, 2.0]x base. - Structural stop (long):
POC - (2 ticks x $1). If price falls through POC,
the thesis is dead. - Liquidity target: next high-volume shelf above entry (from VP levels).
Phase 5 - Safety Suite
- Mercado crypto 24/7: opera continuamente, sem restrição de horário.
- Daily loss circuit breaker: $3,000 USD (~3% of $100k account).
- News blackout (optional): CryptoPanic API - skipped if no key.
- SPY correlation filter: if BTC and SPY move opposite directions by >1%
within 5 min, flag decorrelation. - Slippage buffer: limit orders placed at
proposed_rate x 1.001(+0.1%).
Position rules (hard-coded)
BUY_AMOUNT_USD = 1000.0 # base, scaled by volatility
MAX_OPEN_POSITIONS = 1 # one trade at a time
DAILY_LOSS_LIMIT_PCT = 0.033. File structure
OKXTrader/
|- OKXStrategy/ # 🟢 APLICAÇÃO PRINCIPAL (FastAPI + React + PG)
| |- backend/
| | |- main.py # FastAPI app
| | |- bot_manager.py # Gerenciamento de bots
| | |- database.py # PostgreSQL models
| | |- strategies/ # 30+ estratégias registradas
| | | |- registry.py
| | | `- ...
| | |- exchanges/ # Adapters (OKX)
| | |- feeds/ # Dados externos
| | |- notifications/ # Telegram
| | `- tests/ # Testes pytest
| |- frontend/
| | |- src/
| | | |- App.jsx
| | | |- pages/
| | | |- components/
| | | `- i18n/
| | `- package.json
| |- docker-compose.yml # Dev
| |- docker-compose.prod.yml # Production
| |- deploy.sh # Deploy automatizado
| |- Dockerfile
| |- requirements.txt
| `- SKILL.md # THIS FILE
|- OKXStrategy.bootstrap/ # Stack de desenvolvimento local
|- prompts/ # Prompts para meta-optimizer
|- config/ # Configs
|- fix_postgres.bat # Utilitário PostgreSQL
|- _backend.bat # Inicia backend local
|- _frontend.bat # Inicia frontend local
|- run.bat # Inicia stack completa
|- start.bat # Inicia stack com Docker
|- create_db.bat # Cria banco okx_strategy
`- .env # OKX_DEMO, TELEGRAM, etc.4. OKXStrategy Production Deploy (ATIVO)
Infraestrutura: Hostinger VPS KVM4 — Ubuntu 22.04
Método: Docker Compose + Traefik (reverse proxy)
Path no servidor: /opt/okx-strategy
Domínio: https://okx.tradixio.com
Subdomínio: okx.tradixio.com já criado no VPS
Repo: https://github.com/romualdoalves/okxstrategy
GitHub Token: nunca documentar tokens reais no repositório
Key ID: armazenado fora do repositório
Estrutura de deploy
/opt/okx-strategy/
├── docker-compose.prod.yml # App + PostgreSQL (Traefik via labels)
├── deploy.sh # Script de deploy automatizado
├── .env # secrets (não versionado)
├── OKXStrategy/ # Código-fonte (FastAPI + React)
│ ├── backend/
│ ├── frontend/
│ ├── Dockerfile
│ └── compose.prod.yml # compose interno (não usado no VPS)
└── traefik/ # Traefik rodando separadamenteArquitetura do container
O app é um container único que serve tanto a API FastAPI quanto o frontend React SPA:
- Porta 8000 — FastAPI com catch-all
/{path}que serveindex.htmlpara rotas do SPA - Assets — montados em
/assetsviaStaticFiles - API — prefixo
/api/*e/wspara WebSocket - PostgreSQL — container separado na mesma rede
traefik-public
Primeiro deploy (setup inicial no VPS)
Copie e cole o bloco inteiro no terminal do VPS:
# 1. Criar diretório de deploy e clonar
mkdir -p /opt/okx-strategy
git clone https://github.com/romualdoalves/OKXStrategy.git /opt/okx-strategy
# 2. Criar rede Traefik (se não existir)
docker network create traefik-public 2>/dev/null || true
# 3. Criar volumes Docker (se não existir)
docker volume create okx_strategy_pgdata 2>/dev/null || true
docker volume create okx_strategy_factory 2>/dev/null || true
# 4. Subir Traefik (se ainda não estiver rodando)
if ! docker ps | grep -q traefik; then
mkdir -p /opt/traefik/letsencrypt
touch /opt/traefik/letsencrypt/acme.json
chmod 600 /opt/traefik/letsencrypt/acme.json
cat > /opt/traefik/docker-compose.yml <<'EOF'
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
command:
- --api.insecure=false
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.myresolver.acme.tlschallenge=true
- --certificatesresolvers.myresolver.acme.email=admin@tradixio.com
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
- --log.level=INFO
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /opt/traefik/letsencrypt:/letsencrypt
networks:
- traefik-public
networks:
traefik-public:
external: true
EOF
docker compose -f /opt/traefik/docker-compose.yml up -d
fi
# 5. Criar .env a partir do template
cp /opt/okx-strategy/.env.production.example /opt/okx-strategy/.env
# EDITE .env com seus secrets reais:
# nano /opt/okx-strategy/.env
# 6. Build e deploy
docker compose -f /opt/okx-strategy/docker-compose.prod.yml build --no-cache
docker compose -f /opt/okx-strategy/docker-compose.prod.yml up -d
# 7. Verificar status
docker ps
docker logs -f okx_strategyDeploys subsequentes (update rápido)
Use o script automatizado ou os comandos manuais:
Via script:
bash /opt/okx-strategy/deploy.shManual:
# Pull do código
git -C /opt/okx-strategy pull origin main
# Rebuild e restart
docker compose -f /opt/okx-strategy/docker-compose.prod.yml down
docker compose -f /opt/okx-strategy/docker-compose.prod.yml build --no-cache
docker compose -f /opt/okx-strategy/docker-compose.prod.yml up -d
# Status
docker compose -f /opt/okx-strategy/docker-compose.prod.yml ps
docker logs -f okx_strategyServiços expostos via Traefik
| Serviço | Rota | Container:Port |
|---|---|---|
| API | okx.tradixio.com/api/* |
okx_strategy:8000 |
| Frontend SPA | okx.tradixio.com/ |
okx_strategy:8000 |
| WebSocket | okx.tradixio.com/ws |
okx_strategy:8000 |
| Health | okx.tradixio.com/api/health |
okx_strategy:8000 |
Banco de dados
- PostgreSQL rodando em container Docker (
okx_strategy_db) - Dados persistentes em volume Docker
okx_strategy_pgdata - REGRA GLOBAL DO USUÁRIO: Nunca exclua, altere o nome do volume ou resete o banco de dados sem perguntar explicitamente antes. Históricos e indicadores devem ser preservados por padrão em todos os deploys.
- Backup:
docker exec okx_strategy_db pg_dump -U crypto okx_strategy > backup.sql - Restore:
docker exec -i okx_strategy_db psql -U crypto -d okx_strategy < backup.sql
Taxonomia Semântica de Estratégias
Todas as estratégias (nativas + Fábrica IA) usam categorias semânticas:
| Prefixo | Categoria | Significado | Exemplos |
|---|---|---|---|
| TF | Trend Following | Seguir a tendência | TF001 EMA+VWAP, TF003 MACD |
| MR | Mean Reversion | Reversão à média | MR001 ByeBot, MR002 Bollinger |
| PA | Price Action | Ação do preço | PA001 Pivot Sniper, PA002 ABCD |
| SC | Scalping | Execução rápida | SC001 Pattern Scalp, SC002 Viana |
| RG | Regime | Estado de mercado | RG001 Markov, RG002 Graph |
| IF | Information | Dados externos | IF001 On-chain, IF002 DEX Spread |
| NW | Network | Relações entre ativos | NW001 Influencers |
| T | Test | Teste da plataforma | T000 |
- NÃO EXISTE mais prefixo F, FX, B, A, S, I ou M.
- Arquivos:
backend/strategies/factory/[a-z]{2}[0-9]{3}.py(ex:tf001.py,pa007.py) - Persistência: Volume Docker
okx_strategy_factorymontado em/app/backend/strategies/factory - Fábrica IA: analisa a descrição e classifica automaticamente na categoria correta (TF/MR/PA/SC/RG/IF/NW)
Variáveis de ambiente críticas (.env)
EXCHANGE_PROVIDER=okx
OKX_DEMO=true
DEEPSEEK_API_KEY=
ETHERSCAN_API_KEY=
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=6753071411
POSTGRES_PASSWORD=crypto
DATABASE_URL=postgresql://crypto:crypto@postgres:5432/okx_strategyTroubleshooting 404
Se https://okx.tradixio.com retornar 404:
Container saudável?
docker ps # deve mostrar okx_strategy (healthy) docker logs okx_strategy # verifique se uvicorn subiu na porta 8000Traefik está roteando?
docker inspect okx_strategy | grep -A5 traefik # Deve mostrar os labels traefik.http.routers.*Rede compartilhada?
docker network inspect traefik-public # Deve conter os containers traefik e okx_strategyFrontend build existe?
docker exec okx_strategy ls -la /app/backend/static_frontend/ # Deve conter index.html e pasta assets/
5. OKXStrategy Application Stack (PRIMARY)
The OKXStrategy/ directory contains the main production application — a
full-stack trading platform for OKX exchange.
Architecture
| Layer | Tech | Purpose |
|---|---|---|
| Backend | FastAPI + SQLAlchemy + PostgreSQL | REST API, WebSocket, bot orchestration |
| Frontend | React + Vite + Tailwind + TanStack Query | Dashboard, bot management, charts |
| Data | PostgreSQL (Docker) + JSONL logs | Persistent state + signal history |
| External | OKX API, CoinGecko, DexScreener | Market data + execution |
Key strategies in OKXStrategy
| ID | Name | Location |
|---|---|---|
| A006 | DEX Spread Momentum | strategies/dex_arbitrage_sentinel.py |
| S008 | Liquidity Sweep | strategies/price_action_liquidity_sweep.py |
| B001-B005 | Basic strategies (EMA/VWAP, RSI/MA, etc.) | strategies/*.py |
| A001-A005 | Advanced strategies (CFM, ABCD, Multi-TF, etc.) | strategies/*.py |
| S001-S011 | Specialized strategies (Pivot, Scalp, etc.) | strategies/*.py |
| S012 | CTE – Captura e Transição de Estrutura | strategies/cte_structure_capture.py |
| I001-I006 | Intelligence strategies (Graph Regime, Influencers, Whale Flow, GEX, etc.) | strategies/*.py |
| M001 | Markov Regime | strategies/markov_regime.py |
Running tests
python -m pytest /opt/okx-strategy/OKXStrategy/tests/ -v8. Platform Review & Corrections (2026-05-25)
A complete system review was conducted, resolving critical bugs across the strategies, database, and startup scripts:
- Liquidity Sweep Strategy Bug Fix: Corrected support zone calculation in
price_action_liquidity_sweep.pyto retrieve the last established support (support_price.dropna().iloc[-1]) instead of checking only the last candle. Prepend candles intest_liquidity_sweep.pyto satisfy lookback limits. All tests are now successfully passing (2 passed). - PostgreSQL Database & Migration Fixes: Migrated from SQLite to PostgreSQL
okx_strategy. Resolvedmigrate_sqlite_to_pg.pyboolean conversion issues (mapping0/1SQLite integers to PG nativebooleanfor columnsdemo,active,tp1_done) and missing tables handling. - UX Performance Page Correction: Modified historical performance ranking inside
backend/main.pyto filter bytrades > 0instead ofwin_rate > 0, allowing losing bots to be successfully tracked on the dashboard. - Batch Path Corrections: Fixed hardcoded outdated paths in
start_bot.bat,run_15min_bot.bat, andstart_strategy3.batto use dynamic Windows directory resolution%~dp0. - DEX Spread Momentum Strategy (A006): New strategy added to OKXStrategy. Uses cross-exchange price spreads (CoinGecko, DexScreener vs OKX) as a momentum indicator. Emits directional BUY/SELL signals — does NOT execute real arbitrage. Includes
DexPriceFeedaggregator and 11 unit tests. - Influencers and Followers Strategy (I005): New Intelligence strategy using Graph Data Science to model the market as a Liquidity Transmission Network. Calculates causality (Lead-Lag) to identify the Influencer via PageRank, and automatically triggers buys on the most dependent Follower when the leader exhibits an impulsive breakout.
9. Bug Fixes & Features (2026-05-26)
Critical Fixes
- I005 crash fix:
nx.pagerankraisedPowerIterationFailedConvergence(unhandled) → bot stopped withstatus=error. Wrapped in try/except inupdate_graph. Also rewrotecompute_with_context— it was waiting forcontext["price_matrix"]which BotManager never provides; now stores price matrix inself._last_price_matrixduringupdate_graphand uses it incompute_with_context. Added real ATR calculation from bot candles (was always 0). - OKX time_in_force fix:
market_orderusa"gtc"(good till cancel) conforme OKX API v5. - OKX API key lazy loading: Module-level headers frozen at import time com strings vazias no Docker → 401. Replaced com funções lazy
_headers(),_base_url().
Strategy Audit Fixes
- A005 (CycleShift): Returned
Nonewhen 1W data not yet loaded → silent UI. Now returnsStrategyResult(HOLD, "Aguardando dados semanais N/26 barras 1W"). - A003 (MultiTF): Same fix — returns
StrategyResult(HOLD, "Aquecendo...")during warmup instead ofNone.
Multi-Bot Same-Asset Protection
- Backend:
/api/botsPOST and PATCH now reject duplicate symbols with HTTP 400. - Frontend NewBot + EditBot: used assets shown in gray with "EM USO" badge, preserving ranking order.
Trade History Page Improvements
/api/tradesnow returnsbot_nameandclosed_at(was onlybot_id). Default limit raised 100 → 200.TradeTablecomponent: added Bot name column, Event column with human-readable labels (Stop Loss, Trailing Stop, Shadow TP, etc.), locale-aware number formatting, cleaner type badges.
Telegram Notifications
- Added
build_exit_msg()tonotifications/message_builder.pyfor position close events. _on_position_closedinbot_manager.pynow fires exit notification (covers SW trailing stop, manual liquidate, exchange WS execution paths).- Added
build_order_confirmed_msgandbuild_order_failed_msgtonotifications/__init__.pyexports. - Added
/api/system/telegram-status(token/chat_id presence check) and/api/system/telegram-test(sends real test message) tomain.py. - Added
getTelegramStatusandtestTelegramtofrontend/src/api.js. - Dashboard now shows a Telegram card at the bottom: active/inactive status, token preview, "Testar agora" button, setup instructions.
- Telegram bot:
t.me/OKX_StrategyBot. ConfigureTELEGRAM_BOT_TOKENandTELEGRAM_CHAT_IDin/opt/okx-strategy/.env. - Do not commit the Telegram bot token. Keep the real token only in local/VPS
.env. - Known issue:
sedcommands can truncate bot tokens at the:character if written incorrectly. Prefer editing.envvianano /opt/okx-strategy/.envor use a quoted command that preserves the full token.
I005 Stability Fix (2026-05-27)
update_graphcalledself.engine.select_strategy_targets()without try/except — any convergence error crashed the bot task.- Fixed: wrapped in
try/except Exceptionwithlog.warning(...). Bot now continues gracefully ifselect_strategy_targetsfails. - Em 2026-06-04, a I005 passou a expor seus critérios reais no contrato oficial (
criteria_met/criteria_total): alvos do grafo, candles dos alvos, impulso do líder, atraso/RSI do seguidor e alinhamento entre o seguidor escolhido e o símbolo configurado no bot. A estratégia agora usaatr_multiplier,rsi_thresholdetp_multiplierno gatilho, pode emitirBUYouSELL, e bloqueia se o grafo quer operar um seguidor diferente do símbolo do bot.
Activities Page — Dados Oficiais OKX (2026-05-27)
- Nova rota:
/activitiesno menu lateral. - Backend:
GET /api/activities?date=YYYY-MM-DD— busca fills da OKX, equity do dia e histórico de portfólio. Correlaciona fills com bots por símbolo e com trades do banco por timing (±5 min). Computa P&L por round-trip a partir dos fills reais. - Frontend
Activities.jsx: 4 stat cards (Equity OKX, P&L dia OKX, P&L app banco, P&L fills), banner de reconciliação que destaca discrepâncias, sparkline de equity intraday, tabela de fills com expand inline mostrando Order ID / status / match no banco, tabela de trades do banco do dia. - Novos métodos em
OKXExchange:get_activities(),get_account_summary(),get_portfolio_history().
P&L Calculation Bug Fix (2026-05-27)
- Root cause:
_on_position_closedinbot_manager.pyusedabs(price - entry_price)to computeprice_diff, removing the sign from the difference. This caused LONG losing trades to be reported as profit (and SHORT winning trades as loss) in the app. - Fixed: Replaced the two-line formula with
pnl = size * ct_size * (price - self._entry_price) * self._direction. The signed difference times direction gives the correct sign for all combinations of LONG/SHORT × profit/loss. - Affected file:
backend/bot_manager.py, function_on_position_closed. - Note: Historical trade records already persisted in the database with incorrect P&L values are NOT retroactively corrected. Use
/api/account/reset?clear_history=trueto wipe and restart clean if desired.
OKX API Optimization — Phase 1 + F2.3 (2026-05-28)
F1.1 — Real WebSocket orders (OKXPrivateStream)
- Problem:
OKXPrivateStreaminicialmente usava polling REST, com delays de 3–60 segundos para confirmação de fills. Exit P&L calculations usavam preços estimados (candle close) em vez de preços reais de fill. - Fix: Implementada conexão WebSocket real para
wss://wspap.okx.com:8443/ws/v5/private(demo) ouwss://ws.okx.com:8443/ws/v5/private(live).- Autentica com API key/secret/passphrase via
loginmessage - Subscreve ao canal
orders - Em eventos
fill, traduz formato OKX para evento interno (ordId,fillPx,fillSz,state="filled") e passa para_handle_order_event _monitor_ordersembot_manager.pylida com reconexão automaticamente (15s backoff)
- Autentica com API key/secret/passphrase via
- Affected file:
backend/exchanges/okx.py, classOKXPrivateStream
F1.3 — filled_avg_price in exit polling
- Problem:
_sw_exitandmanual_liquidateonly polled 5 times × 2s = 10s. If fill confirmation was slow, P&L was calculated with estimated price. - Fix: Increased polling from 5 to 12 attempts (24s total). Added early-exit guard (
if self._direction == 0: return) to skip REST polling when WebSocket already handled the close. Added order-first check: from attempt 2 onwards, checks orderstatus == "filled"directly (not just position gone) to capturefilled_avg_pricefaster. - Affected file:
backend/bot_manager.py, functions_sw_exitandmanual_liquidate
F2.3 — Cross-day Activities P&L (FIFO)
- Problem:
/api/activitiesonly fetched fills fortarget_date. If a BUY was placed on a previous day, the SELL fill today had no matching BUY →fill_pnl = None(showing $0 round-trip P&L in Activities page). - Fix:
get_activities()inOKXExchangenow acceptsafteranduntilparameters for date-range queries (mutually exclusive withdate)./api/activitiesendpoint: queries DB for earliest open trade. If it was opened on a prior day, fetches ALL fills since that date (after=earliest_date T00:00:00Z). Runs FIFO across all fills. Only today's fills are returned in the response, but their P&L is correctly calculated against prior-day BUYs.- Reconciliation banner shows
cross_day_fifo: true+fifo_sincedate when cross-day mode is active. - Frontend banner displays "FIFO cross-day ativo: fills carregados desde YYYY-MM-DD" when applicable.
- Affected files:
backend/exchanges/okx.py,backend/main.py,frontend/src/pages/Activities.jsx
F1.4 — _confirm_fill_price otimizado (2026-05-28)
- Problem:
_confirm_fill_priceusava[3,5,10,15,30] + [60]*420= ~7 horas de polling REST para confirmar o fill de entrada. Consumia 420 chamadas de API desnecessariamente enquanto o WebSocket já entregava o fill em segundos. - Fix (parte 1):
_handle_order_eventagora também captura fills de entrada (quandoord_id == _entry_ord_ide a direção do fill é a mesma da posição). Atualiza_entry_price, persiste no banco, envia broadcastorder_confirmede notificação Telegram — tudo em tempo real via WebSocket. - Fix (parte 2):
_confirm_fill_pricereduzido para um fallback de[3,5,10,15,30,60,120](~4 min total). Só aciona broadcast/Telegram se o_entry_priceainda diferir (indica que o WebSocket não chegou antes). Verificaord_id == _entry_ord_idpara não corrigir com dados de ordem obsoleta. - Affected file:
backend/bot_manager.py, funções_handle_order_evente_confirm_fill_price
10. New Strategy — GEX Gamma Exposure Regime (2026-05-30)
Nova estratégia de inteligência implementada e totalmente integrada ao framework:
- GEX Gamma Exposure Regime (I006): Estratégia Intelligence baseada no indicador GEX (Gamma Exposure) do mercado de opções de BTC. Trabalha por causalidade — mede o posicionamento dos market makers em opções (API pública Deribit, sem autenticação) e classifica o mercado em dois regimes de gama:
- Gama Positivo (calls OI > puts OI ATM): market makers atuam contra-tendência (amortecimento) → lateralidade → estratégia de range (compra no suporte de OI, vende na resistência).
- Gama Negativo (puts OI > calls OI ATM): market makers atuam a favor da tendência (amplificação) → explosividade → estratégia de breakout (compra acima de resistência, vende abaixo de suporte).
- Fallback automático: quando dados Deribit indisponíveis, estima regime via BBW + ratio ATR.
Arquivos novos/modificados
| Arquivo | Tipo | Descrição |
|---|---|---|
backend/feeds/gex_feed.py |
Novo | Feed Deribit: book summary de opções BTC, computa GEX proxy, max pain, níveis de suporte/resistência por OI, PCR, pressão negativa de pico. Cache 5 min. |
backend/strategies/gex_gamma_exposure.py |
Novo | Estratégia I006 — needs_gex_context = True, timeframe recomendado 1h, 8 parâmetros configuráveis, 4 critérios de explainability, SL/TP adaptados ao regime. |
backend/bot_manager.py |
Modificado | Import GexFeed, campos _gex_feed/_gex_snapshot, método _update_gex_context(), injeção de gex_data em _strategy_context(), chamadas nos dois pontos de execução (warmup + loop por candle). |
backend/strategies/registry.py |
Modificado | "I006": GexGammaExposureStrategy registrado. |
Parâmetros da estratégia I006
| Parâmetro | Default | Descrição |
|---|---|---|
level_proximity_pct |
0.8 | % de ATR de proximidade ao nível de OI para acionar gatilho |
vol_spike_mult |
1.4 | Multiplicador de volume médio para confirmar agressão |
atr_period |
14 | Período do ATR para gestão de risco |
sl_mult_pos |
1.2 | Multiplicador ATR para SL em Gama Positivo (mercado amortecido) |
sl_mult_neg |
2.0 | Multiplicador ATR para SL em Gama Negativo (mercado explosivo) |
tp_rr_ratio |
2.0 | Relação R:R para TP1 |
bbw_period |
20 | Período das Bollinger Bands para estimativa fallback |
bbw_neg_mult |
1.5 | BBW acima de (mult × média) → Gama Negativo estimado |
11. Reset Geral (2026-06-01)
Em 2026-06-01 foi feito um Reset Geral da plataforma:
- Exchange: OKX
- Modo: Demo (paper trading OKX)
- Credenciais: armazenadas no banco (tabela
settings), criptografadas - Endpoint demo:
https://www.okx.comcom headerx-simulated-trading: 1 - Endpoint live:
https://www.okx.com - Estado do banco: banco PostgreSQL
okx_strategypreservado - Estado do código: nenhuma mudança de código nesta release
12. Nova Estratégia — S012 CTE (2026-06-01)
- S012 - CTE – Captura e Transição de Estrutura: Estratégia de reversão institucional multi-timeframe baseada em price action.
- HTF (1H): detecta varredura de liquidez (SSL/BSL) com pavio de rejeição
- LTF (5M): confirma CHoCH (quebra da estrutura descendente/ascendente)
- Aguarda recuo para zona Fibonacci 61.8%–78.6% antes de entrar
- 5 critérios progressivos na barra de status da UI
- Stop: extremo de rejeição HTF ± buffer ATR; TP1: R:R configurável; TP2: liquidez oposta HTF
- Arquivo:
backend/strategies/cte_structure_capture.py - Registrada como
"S012"emregistry.py - Timeframe recomendado: 5m (com contexto 1H via
extra_timeframes)
13. Correção Telegram e OKX Private WS (2026-06-04)
TELEGRAM_CHAT_IDoperacional oficial:6753071411.- Bot Telegram oficial validado via
getMe:@OKX_StrategyBot. - O token real do Telegram não deve ser versionado no GitHub; mantenha-o somente no
.envlocal/VPS. - A tela de Dashboard agora mostra
TELEGRAM_CHAT_ID=6753071411nas instruções do servidor. /api/system/telegram-testcontinua enviando snapshot oficial de saldos, mas agora retorna a causa real quando o envio falha.- Quando o Telegram retorna
Bad Request: chat not found, a causa operacional esperada é: o usuário6753071411ainda não abriu o bot configurado emTELEGRAM_BOT_TOKEN, não enviou/start, ou o token no VPS pertence a outro bot. - Logs Telegram agora incluem
chat_ide prévia segura do token para facilitar auditoria sem expor segredo completo. OKXPrivateStreamdemo usa o endpoint oficialwss://wspap.okx.com:8443/ws/v5/private, sembrokerId=9999, para evitar rejeição HTTP 403 no handshake.OKXPrivateStreamenvia headers explícitos de handshake (User-Agent/Origin) e, quando o WS privado é recusado com HTTP 403, o bot continua operando com confirmação REST e aplica backoff progressivo para não inundar os logs.- Deploy no VPS deve atualizar somente
.env, código e containers. Não resetar banco, não apagar volumes e não parar bots manualmente fora do ciclo normal de recriação do container.
14. Critérios de Ordem (2026-06-04)
- Além dos critérios da estratégia, cada bot agora expõe
runtime.order_criteria. - A ordem só é enviada quando os critérios da estratégia geram
BUY/SELLe todos os critérios de ordem bloqueantes estão verdes. - Critérios de ordem implementados no backend: sinal executável, runtime ativo, circuit breaker livre, posição local flat, nenhuma entrada pendente, direção permitida para o mercado, calendário livre, conexão OKX disponível, tamanho de ordem válido, SL/TP coerentes e posição OKX flat.
- Se algum critério de ordem falhar, o backend atualiza
hold_reason, transmiteorder_criteriapor WebSocket e não envia a ordem. - Quando todos os critérios de ordem estão atendidos,
_enter()é chamado de forma síncrona no candle fechado e revalida imediatamente antes do envio da ordem. - A UI mostra uma checklist separada Critérios de Ordem / Order Criteria nos cards e no detalhe do bot, evitando que “Critérios de Entrada” verdes sejam confundidos com ordem executável.
- A checklist de entrada do frontend deve priorizar o placar oficial emitido pelo backend (
_criteria_met,_criteria_total,_signal,_hold_reason) quando disponível. O frontend não deve declarar “todos os critérios OK” apenas por heurísticas locais se o backend ainda retornouHOLD. - Sem sinal
BUY/SELL, os critérios operacionais O2-O11 ficam dormentes (status=”none”) e não entram no placar. A UI deve mostrar o gate de ordem como “Aguardando sinal”; o checklist operacional só passa a variar/contar quando existe uma ordem candidata.
15. Fix: I005 Checklist Estático (2026-06-04)
- Problema: O checklist estático do I005 em
StrategyChecklist.jsxexibia apenas 2 critérios (regime === 'trending'eregime_conf >= 0.7), ambos verdes assim que o grafo encontrava um Influenciador, mesmo sem Seguidor identificado ou sem impulso. Isso causava “Todos os critérios OK ✓” enquanto oCritérios de Ordemmostrava “Aguardando sinal” — inconsistência confusa para o usuário. - Causa raiz: Quando
compute_with_contextretorna cedo (sem Seguidor encontrado), oStrategyResulttemcriteria_total=0, então o frontend cai no checklist estático em vez doofficialEntryCriteria. O checklist estático anterior não refletia as condições reais de execução. - Fix: O checklist estático do I005 em
frontend/src/components/StrategyChecklist.jsxagora exibe 4 critérios reais:- C1 Líder: verde se grafo identificou Influenciador (
regime === 'trending') - C2 Seguidor: verde se símbolo do bot é o Seguidor; vermelho se o grafo quer operar outro par; amarelo se aguardando
- C3 Impulso: verde se
leader_impulse_ratio ≥ 2.0; amarelo se ratio calculado mas insuficiente; cinza se sem dados - C4 RSI Seguidor: verde se
follower_rsi < 62; amarelo se calculado mas fora da zona; cinza se sem dados
- C1 Líder: verde se grafo identificou Influenciador (
- O “Todos OK ✓” agora só aparece quando as 4 condições estão verdes simultaneamente.
- Estratégias não foram alteradas; a correção é exclusivamente no frontend.
16. Estratégia A007 — Linda Raschke Swing Trade (2026-06-04)
- ID:
A007 - Categoria: Autorais (A)
- Arquivo:
backend/strategies/linda_raschke.py - Timeframe principal:
1D(diário — gatilho) - Timeframe extra:
1W(semanal — filtros ADX + Donchian) - Direções: BUY e SELL (espelhado)
- Critérios (4):
- C1 ADX(14) semanal ≥ 25 e subindo — ativo tendencial
- C2 Donchian 52 semanas — preço renovando máxima (BUY) ou mínima (SELL) histórica de 52 semanas
- C3 Recuo à EMA 21 diária — preço tocou a média nas últimas
ema_touch_bars(default: 5) velas - C4 Gatilho: fechamento acima da máxima semanal anterior OU EMA 8 virando na direção
- SL: mínima do candle de sinal (BUY) / máxima (SELL)
- TP: entry ±
tp_multiplier× amplitude do candle de sinal (default: 2×) - Parâmetros configuráveis:
adx_period,adx_threshold,donchian_period,ema_fast,ema_slow,ema_touch_bars,tp_multiplier - Indicadores expostos:
adx_w,adx_rising,donchian_upper,donchian_lower,donchian_break,ema21,ema8,ema8_slope,touched_ema21,dist_ema21_pct,prev_week_high,prev_week_low,trigger_type
17. Fix: Checklist "Todos OK" Falso — A001, A003, A004 (2026-06-04)
18. Fábrica de Estratégias (2026-06-05)
19. Fix: Trailing Stop em Recuperação e Orphan Recovery (2026-06-05)
- Problema: O bot TF005 (ETH-USDT, Joe Di Napoli) fechou uma posição via
WS_EXECUTIONcom apenas Stop Loss fixo ($1526.36), sem usar trailing stop. O PnL foi +$6.24 bruto / +$4.95 líquido, mas poderia ter sido maior com trailing stop ativo. - Causa raiz (1):
tp1_price = 0no banco de dados. O trailing stop (SW-TS) só era ativado após TP1 ser atingido (tp1_done=True). Com TP1 zerado, o trailing stop nunca foi criado. - Causa raiz (2): Orphan recovery (quando o bot reinicia e encontra posição na OKX mas não no banco) criava trade com
"tp1_price": 0.0, sem calcular um TP1 razoável. - Causa raiz (3):
_recover_state()só restaurava trailing stop quandotp1_done=True. Se TP1 nunca foi atingido, a posição ficava sem proteção dinâmica após restart. - Fix em
backend/bot_manager.py:_recover_state(): Remove condiçãoif last_trade.tp1_done. Agora sempre recria o trailing stop (SW-TS) quando há posição aberta, independente de TP1. Otp1_doneainda é restaurado do banco para controle de lógica de TP1, mas o trailing stop é ativado sempre.- Orphan recovery (2 lugares): Calcula
orphan_tp1 = adopted_px * (1.02 if LONG else 0.98)e salva no banco. Isso garante que TP1 exista e o gatilho de +1% possa ativar o trailing stop nativo da OKX. get_status(): Proteção contra lista de candles vazia — retorna status básico quando_candlesestá vazio, evitando erro no/api/monitor.
- Fix em
backend/main.py:- Adicionado
from datetime import datetime, timezoneno topo do arquivo. O endpoint/api/monitorusavadatetime.now(timezone.utc)sem import, causandoNameError.
- Adicionado
- Arquivos alterados:
backend/bot_manager.py,backend/main.py - Comportamento após fix:
- Posições abertas sempre terão trailing stop ativo, mesmo após restart
- Orphan recovery calcula TP1 automaticamente (2% do preço de entrada)
- Monitoramento
/api/monitorfunciona mesmo quando bots ainda não receberam candles
- Deploy: rebuild do container
okx_strategycomdocker compose -f docker-compose.prod.yml up -d --build okx_strategy
20. Fix: Timestamp do Telegram (2026-06-05)
- Problema: Mensagens do Telegram mostravam apenas hora (
19:52 UTC), sem data. Dificultava rastrear eventos em dias anteriores. - Causa:
_now_utc()embackend/notifications/message_builder.pyusava formato%H:%M UTC. - Fix: Alterado para
%Y-%m-%d %H:%M:%S UTC— agora mostra data completa + hora + segundos. - Arquivo alterado:
backend/notifications/message_builder.py
21. Fix: Fábria IA — StrategyInfo extra_timeframes (2026-06-05)
- Problema: Erro
StrategyInfo.__init__() got an unexpected keyword argument 'extra_timeframes'ao gerar estratégias pela Fábrica IA. O planner incluíaextra_timeframesno JSON, e o generator às vezes passava isso paraStrategyInfo(), mas o dataclass não tinha esse campo. - Fix: Adicionado
extra_timeframes: list[str] = field(default_factory=list)aoStrategyInfoembackend/strategies/base.py. - Arquivo alterado:
backend/strategies/base.py
22. Fix: Fábrica IA — Validação de ID de estratégia (2026-06-05)
- Problema: Erro
ID de estratégia inválido — deve começar com Fao implantar estratégias pela Fábrica IA. A validação emmain.pyainda exigia prefixoF(sistema antigo), mas o sistema foi migrado para prefixos semânticos (TF/MR/PA/SC/RG/IF/NW/T). - Fix: Atualizada validação em
/api/strategy-factory/deploypara aceitar prefixos semânticos válidos. - Arquivo alterado:
backend/main.py
26. Fix: Fábrica IA — _CandleBar mock com .time (2026-06-06)
- Problema: Código gerado pela IA usava
candle.time(atributo inexistente no mock), causando erro na validação. O botão "Corrigir" funcionava, mas exigia uma rodada extra de correção. - Fix: Adicionada property
timeao_CandleBarmock que retornaself.epoch, igual às propertiestimestamp. Agora o mock suporta os 3 nomes:.epoch,.timestamp,.time. - Arquivo alterado:
backend/strategy_factory/validator.py
28. Fix: Fábrica IA — Reutilização de IDs deletados (2026-06-06)
- Problema: Ao excluir PA008 e recriar uma estratégia da mesma categoria, foi atribuído PA009 em vez de reutilizar PA008.
- Causa: O
assign_next_idnão estava considerando arquivos órfãos no disco (estratégias que existem como arquivo.pymas não estão no banco). - Fix: Adicionada verificação de arquivos órfãos no disco. Agora o algoritmo considera: IDs ativos no registry + IDs do banco com arquivo + IDs órfãos no disco. Também adicionados logs para debug.
- Arquivo alterado:
backend/strategy_factory/deployer.py
29. Fix: Botão excluir estratégia não aparecia para estratégias da Fábrica IA (2026-06-06)
- Problema: O botão de excluir estratégia (lixeira) só aparecia para IDs começando com
F(sistema antigo). Estratégias da Fábrica IA com prefixos semânticos (TF, MR, PA, SC, RG, IF, NW) não mostravam o botão. - Fix: Alterada a condição para usar regex que aceita todos os prefixos válidos:
^(TF|MR|PA|SC|RG|IF|NW|F|FX)\d. - Arquivo alterado:
frontend/src/pages/Strategies.jsx
30. Fix: Fábrica IA — criteria_total ainda =1 após correção (2026-06-06)
- Problema: Mesmo após clicar "Corrigir", a IA às vezes mantém
criteria_total=1quando o plano tem múltiplos critérios. - Fix: Adicionado lembrete mais explícito no prompt de correção (
fix_code) sobrecriteria_totaldeve ser igual ao número exato de critérios. - Arquivo alterado:
backend/strategy_factory/generator.py
32. Fix: Critérios da estratégia não apareciam no frontend (2026-06-06)
- Problema: O checklist de entrada mostrava apenas 1 critério genérico ("DIREÇÃO SPOT") em vez dos critérios reais da estratégia (3 critérios para PA008). O frontend não tinha acesso aos critérios do plano.
- Causa:
list_strategies()não retornava os critérios, eStrategyInfonão tinha campocriteria. - Fix:
- Adicionado
criteria: list[dict]aoStrategyInfodataclass list_strategies()agora retornacriteriapara cada estratégia- O frontend pode usar os critérios do plano para montar o checklist correto
- Adicionado
- Arquivos alterados:
backend/strategies/base.py,backend/strategies/registry.py
33. Fix: Critérios da estratégia no checklist do frontend (2026-06-06)
- Problema: O checklist mostrava "C1 Backend", "C2 Backend" em vez dos nomes reais dos critérios (ex: "ORB Definido", "Rompimento Confirmado", "Reteste").
- Fix em backend:
_runtime_indicators()agora inclui_criteria_namescom os nomes dos critérios da estratégiaStrategyInfotem campocriteriapara armazenar os critérios do planolist_strategies()retornacriteriapara cada estratégia- Generator injeta
criteriaautomaticamente no StrategyInfo se a IA omitir
- Fix em frontend:
officialEntryCriteria()usa_criteria_namespara mostrar nomes reais dos critérios
- Arquivos alterados:
backend/bot_manager.py,backend/strategies/base.py,backend/strategies/registry.py,backend/strategy_factory/generator.py,frontend/src/components/StrategyChecklist.jsx
34. Fix: Cores no Histórico de Trades — Melhor/Pior Trade (2026-06-06)
- Problema: Melhor trade sempre aparecia verde e pior trade sempre vermelho, mesmo quando os valores eram negativos/positivos.
- Fix: A cor agora depende do valor: verde para positivo, vermelho para negativo, em ambos os cards.
- Arquivo alterado:
frontend/src/pages/Trades.jsx
35. Migração: criteria para estratégias nativas (2026-06-06)
- Objetivo: Unificar tratamento de critérios entre estratégias nativas e Fábrica IA.
- Script:
migrate_criteria.py— adicionacriteriaaoStrategyInfode estratégias que já usamcriteria_total. - Resultado: 14 estratégias migradas automaticamente (if003, mr003, mr004, pa003, pa006, rg001, rg003, sc002, tf006, tf012, etc.).
- Estratégias pendentes: 21 estratégias simples que não usam
criteria_totalprecisam de revisão manual para adicionar critérios. - Arquivos alterados: Vários em
backend/strategies/factory/
31. Fix: criteria_total corrigido automaticamente pós-geração (2026-06-06)
- Problema: Mesmo com instruções explícitas no prompt, a IA continuava gerando
criteria_total=1quando o plano tinha múltiplos critérios. - Fix: Adicionada correção automática via regex após a geração e após a correção. Substitui qualquer
criteria_total=NUMEROpelo número correto de critérios do plano. A IA pode errar, mas o backend corrige antes de entregar o código. - Arquivo alterado:
backend/strategy_factory/generator.py
27. Fix: Fábrica IA — criteria_total=1 quando plano tem múltiplos critérios (2026-06-06)
- Problema: Estratégias geradas pela Fábrica IA (ex: PA008) tinham
criteria_total=1mesmo quando o plano definia múltiplos critérios (ex: 3 ou 4). Isso fazia o checklist do frontend mostrar "1/1 critérios OK" em vez do número correto. - Causa: A IA ignorava a regra 6 do prompt que exige
criteria_totaligual ao número exato de critérios. - Fix: Adicionada verificação no validator que rejeita
criteria_total=1quando o plano tem mais de 1 critério. A mensagem de erro instrui a IA a corrigir. - Arquivo alterado:
backend/strategy_factory/validator.py
23. Fix: Fábrica IA — _CandleBar mock sem atributo epoch (2026-06-05)
- Problema: Erro
'_CandleBar' object has no attribute 'time'(ou'epoch') ao validar estratégias geradas pela Fábrica IA. O_CandleBarmock usado no validator tinhatimestampem vez deepoch, diferente doCandleBarreal. - Fix: Alterado
_CandleBarpara usarepoch(int em ms) igual aoCandleBarreal. Também adicionado timestamp sequencial em ms na geração de candles sintéticos. - Arquivos alterados:
backend/strategy_factory/validator.py
24. Fix: Fábrica IA — _CandleBar mock com .timestamp (2026-06-05)
- Problema: Após corrigir para
.epoch, código gerado pela IA que usa.timestampno candle falhou com'_CandleBar' object has no attribute 'timestamp'. - Fix: Adicionada property
timestampao_CandleBarmock que retornaself.epoch, mantendo compatibilidade com ambos os nomes. - Arquivo alterado:
backend/strategy_factory/validator.py
25. Fix: Fábrica IA — Logs de debug no endpoint /fix (2026-06-05)
Problema: Botão "Corrigir erros" na Fábrica IA não funcionava, mas não havia logs suficientes para diagnosticar.
Fix: Adicionados logs detalhados no endpoint
/api/strategy-factory/fixpara rastrear o fluxo de correção.Arquivo alterado:
backend/main.pyMenu lateral: "Fábrica IA" / "AI Factory" →
/strategy-factoryPágina:
frontend/src/pages/StrategyFactory.jsx— wizard de 5 etapasIA: KIMI (Moonshot AI) — API OpenAI-compatible em
https://api.moonshot.cn/v1KIMI_API_KEY— chave secreta (somente no.envdo VPS, nunca commitada)KIMI_BASE_URL— defaulthttps://api.moonshot.cn/v1KIMI_MODEL— defaultmoonshot-v1-32k
Módulo backend:
backend/strategy_factory/— kimi_client, planner, generator, validator, deployerBanco: tabela
strategies— registra todas as estratégias (nativas + Fábrica IA)IDs: namespace semântico (TF/MR/PA/SC/RG/IF/NW + número sequencial)
Hot-load: estratégias são registradas no
REGISTRYem memória sem restart viaimportlibAuto-descoberta:
registry.pycarrega automaticamentestrategies/factory/*.pyno startupClassificação semântica: a Fábrica IA analisa a descrição e escolhe a categoria correta automaticamente
Validação: executa estratégia em sandbox com 250 candles sintéticos, 12 verificações
Rotas:
POST /api/strategy-factory/plan|generate|validate|deploy,GET|DELETE /api/strategy-factory/strategiesFrontend: sem modificações no
StrategyChecklist.jsx— usa o pathofficialEntryCriteria(criteria_met/criteria_total) automaticamenteSegurança: denylist de imports perigosos + verificação AST antes de exec()
REGRA: nunca commitar a
KIMI_API_KEYreal; mantê-la somente no.envlocal/VPSProblema: Três estratégias mostravam "Todos os critérios OK ✓" nos Critérios de Entrada enquanto o bot permanecia em HOLD nos Critérios de Ordem. O checklist do frontend verificava presença de indicadores (≠ 0) mas não alinhamento direcional entre eles.
Estratégias afetadas e causa raiz:
- A003 (Multi-Timeframe Trend): C2 mostrava verde para qualquer
trend_1h ≠ 0(Bull ou Bear), independente dobias_4h. C3 mostrava verde para qualquer cruzamento MACD. Cenário falso-OK:bias=Bull + trend=Bear + trigger_bear→ tudo verde, HOLD por conflito de direção. - A001 (CFM): C4 mostrava verde para
|rsi_slope| > 1sem verificar se a direção do slope combina com a tendência EMA. Cenário falso-OK:trend_up=1 + rsi_slope=-3→ tudo verde, HOLD pois RSI não confirma momentum. - A004 (Mean Reversion): C2 mostrava verde para
cross_up OR cross_downsem verificar se o cruzamento combina com a zona ativa. Cenário falso-OK:in_buy_zone=true + cross_down=true→ tudo verde, HOLD por cruzamento na direção errada.
- A003 (Multi-Timeframe Trend): C2 mostrava verde para qualquer
Fix em
frontend/src/components/StrategyChecklist.jsx:- A003: C2 fica vermelho com detalhe "Conflito: alta ≠ baixa" quando
bias ≠ trend; C3 só verde quando o trigger aponta na mesma direção do bias. - A001: C4 fica verde apenas quando slope confirma a direção EMA (
tUp && slope>0 && rsi>50outDown && slope<0 && rsi<50); vermelho com detalhe "Momentum contrário à tendência EMA" quando oposto. - A004: C2 fica verde apenas quando cruzamento alinhado com a zona (
buyZone && cross_upousellZone && cross_down); amarelo com detalhe "Cruzamento na direção errada — aguardando reversão" no conflito.
- A003: C2 fica vermelho com detalhe "Conflito: alta ≠ baixa" quando
Estratégias verificadas sem este bug: A002, A005, A006, A007, B002.
Arquivo alterado:
frontend/src/components/StrategyChecklist.jsx(somente frontend).