Sumário > Projeto de Gestão de Criptomoedas
💱 Integração Binance
/Documentação Técnica/04 Desenvolvimento Técnico/Integração Binance.md
1. Configuração Inicial
1.1. Requisitos de API
from binance.client import Client
client = Client(
api_key=os.getenv('BINANCE_API_KEY'),
api_secret=os.getenv('BINANCE_API_SECRET')
)
| Permissão Necessária |
Descrição |
Leitura |
Consultar candles e saldos |
Trading |
Executar ordens |
❌ Saques |
Não é necessário |
2. Fluxo de Dados
2.1. WebSocket (Tempo Real)
from binance import ThreadedWebsocketManager
def handle_candle(msg):
if msg['k']['x']: # Candle fechado
process_strategy(
symbol=msg['s'],
close=float(msg['k']['c']),
volume=float(msg['k']['v'])
)
twm = ThreadedWebsocketManager()
twm.start_kline_socket(
callback=handle_candle,
symbol="BTCUSDT",
interval=Client.KLINE_INTERVAL_4HOUR
)
2.2. Endpoints REST Críticos
| Método |
Descrição |
Limite de Requisições |
get_klines() |
Histórico de candles (H4) |
50/min |
create_order() |
Enviar ordens |
10/s |
get_account() |
Consultar saldos |
5/s |
3. Tratamento de Erros
3.1. Códigos Comuns
try:
order = client.create_order(...)
except BinanceAPIException as e:
if e.code == -1021: # Timestamp inválido
resync_server_time()
elif e.code == -1013: # Filtro LOT_SIZE
adjust_quantity(order)
| Código |
Significado |
Ação Recomendada |
-1003 |
Rate limit excedido |
Esperar 60s |
-2010 |
Saldo insuficiente |
Validar capital alocado |
-1121 |
Símbolo inválido |
Verificar lista de ativos |
4. Modelo de Dados Binance → PostgreSQL
# Exemplo: Salvar candle no banco
async def save_candle(candle):
await db.execute(
"INSERT INTO candles (symbol, open, high, low, close, volume) "
"VALUES (:symbol, :open, :high, :low, :close, :volume)",
{
"symbol": candle['symbol'],
"open": candle['open'],
"high": candle['high'],
"low": candle['low'],
"close": candle['close'],
"volume": candle['volume']
}
)
5. Boas Práticas
- Cache Local: Armazenar candles recentes para evitar chamadas repetidas
- Filtros: Respeitar
LOT_SIZE e PRICE_FILTER (consultar via get_symbol_info())
- Sincronização: Usar
get_server_time() para evitar problemas de timestamp
6. Exemplo Completo
async def execute_trade(strategy: Strategy):
symbol_info = client.get_symbol_info(strategy.symbol)
min_qty = float(next(
f['minQty'] for f in symbol_info['filters']
if f['filterType'] == 'LOT_SIZE'
))
if strategy.quantity < min_qty:
raise ValueError(f"Quantidade abaixo do mínimo: {min_qty}")
order = client.create_order(
symbol=strategy.symbol,
side=Client.SIDE_BUY,
type=Client.ORDER_TYPE_LIMIT,
timeInForce=Client.TIME_IN_FORCE_GTC,
quantity=round(strategy.quantity, 8),
price=str(strategy.target_price)
)
await save_order_to_db(order) # Persistir no PostgreSQL
7. Monitoramento
7.1. Métricas Essenciais
# HELP binance_api_requests Total de requisições à API
# TYPE binance_api_requests counter
binance_api_requests_total{endpoint="klines"} 42
binance_api_requests_failed{error="rate_limit"} 3
8. Próximos Passos
- Configurar WebSocket para múltiplos símbolos
- Implementar fallback para REST quando WebSocket falhar
✅ Checklist de Implementação
- Validar chaves API no painel da Binance
- Testar limites de requisições em sandbox
- Configurar tratamento para reconexão WebSocket
# Para testar a conexão básica:
python -c "from binance.client import Client; print(Client().get_system_status())"
link de compartilhamento