Negociação e bots
Python é uma escolha comum para automação de trading em Solana: polling de pools, construção de transações de swap, assinatura com carteiras quentes e envio com taxas prioritárias. Bots confiáveis simulam cada envio, atualizam blockhashes e lidam explicitamente com os mercados de taxas do Agave 4.1.1.
Receita
Cartão de receitas de referência rápida - pronto para copiar e colar.
import asyncio
from solana.rpc.async_api import AsyncClient
async def bot_loop(rpc: str):
async with AsyncClient(rpc) as client:
while True:
slot = (await client.get_slot()).value
# 1. read signals 2. build ix 3. simulate 4. send 5. confirm
await asyncio.sleep(0.4) # respect rate limits
Quando fazer isso:
- Criação de mercado ou arbitragem entre locais de liquidez em cadeia.
- Rebalanceamento programado e automação de estilo de pedido limite.
- Monitoramento de mempools/RPC para condições de disparo (com suporte do provedor).
- Bots de operações internas (varreduras de tesouraria, distribuição de recompensas).
Exemplo de trabalho
import asyncio
import logging
from solders.compute_budget import set_compute_unit_limit, set_compute_unit_price
from solders.keypair import Keypair
from solders.pubkey import Pubkey
from solders.hash import Hash
from solders.message import Message
from solders.transaction import VersionedTransaction
from solana.rpc.async_api import AsyncClient
from solana.rpc.types import TxOpts
log = logging.getLogger("mm-bot")
RPC = "https://api.mainnet-beta.solana.com" # use private RPC in production
class SimpleSender:
def __init__(self, client: AsyncClient, payer: Keypair):
self.client = client
self.payer = payer
async def send(self, instructions, micro_lamports: int):
bh = await self.client.get_latest_blockhash()
blockhash = Hash.from_string(str(bh.value.blockhash))
ixs = [
set_compute_unit_limit(200_000),
set_compute_unit_price(micro_lamports),
*instructions,
]
msg = Message.new_with_blockhash(ixs, self.payer.pubkey(), blockhash)
tx = VersionedTransaction(msg, [self.payer])
sim = await self.client.simulate_transaction(tx)
if sim.value.err:
log.warning("sim_fail err=%s logs=%s", sim.value.err, sim.value.logs)
return None
resp = await self.client.send_transaction(
tx, opts=TxOpts(skip_preflight=True, preflight_commitment="processed")
)
await self.client.confirm_transaction(resp.value, commitment="confirmed")
return resp.value
async def main():
payer = Keypair() # load securely
async with AsyncClient(RPC) as client:
sender = SimpleSender(client, payer)
# instructions = [swap_ix_from_jupiter_api(...)]
# await sender.send(instructions, micro_lamports=10_000)
asyncio.run(main())
O que isso demonstra:
- A classe Sender isola blockhash, orçamenta, simula, envia, confirma.
- A taxa de prioridade via
set_compute_unit_priceé explícita por tentativa. - Logging captura logs de simulação para post-mortems.
- Estrutura amigável de loop assíncrono para múltiplas estratégias.
Aprofundamento
Como funciona
- Os bots são pesados em leitura (cotações, saldos) e gravadores (enviar txs).
- Jupiter e outros agregadores retornam instruções serializadas ou transações para assinar.
- Taxas prioritárias competem por espaço no bloco; sintonizar micro-lamports por congestionamento.
- Pacotes Jito (opcional) roteado através de mecanismos de bloco para envio com reconhecimento de MEV.
Camadas de arquitetura de bot
| Camada | Responsabilidade | Ferramentas |
|---|---|---|
| Sinal | Preços, spreads, estoque | RPC, websockets, APIs de locais |
| Construir | Instruções, ALTs | solders, API Jupiter |
| Risco | Limites de tamanho, interruptor de interrupção | Lógica do aplicativo |
| Enviar | Taxas, novas tentativas, confirme | solana-py, Jito RPC |
| Observar | PnL, falhas | registro, métricas |
Notas Python
# Never block the event loop on CPU work
await asyncio.to_thread(heavy_analytics, frame)
# Jittered backoff on 429 / blockhash errors
import random
await asyncio.sleep(0.2 + random.random() * 0.3)
Pegadinhas
- RPC público para bots mainnet - limites de taxa e slots obsoletos. Correção: provedor dedicado com SLA.
- Sem interruptor de interrupção - o loop descontrolado drena a carteira. Correção: gasto diário máximo e limites de estoque.
- Ignorando falhas de pouso - os txs expiram silenciosamente. Correção: rastreie os tempos limite de confirmação e reenvie.
- Mesmo blockhash na nova tentativa - falha garantida após expirar. Correção: reconstrua cada tentativa.
- Armazenamento de chaves na memória do processo - despejos de memória vazam segredos. Correção: saldo mínimo de carteiras quentes, rotação de chaves.
Alternativas
| Alternativa | Usar quando | Não use quando |
|---|---|---|
| Núcleo do bot Rust/Go | Latência ultrabaixa | Velocidade da equipe em Python |
@solana/kit + sem servidor | Gatilhos pouco frequentes | Criação de mercado em circuito fechado |
| Operações CLI manuais | Movimentos raros do tesouro | Reações subsegundos |
| API CEX totalmente custodiante | Rampas Fiat | Composição na cadeia necessária |
Perguntas frequentes
Python é rápido o suficiente?
Frequentemente sim, para tempos de bloco em escala humana e DeFi; crie um perfil de caminhos ativos e mova apenas aqueles para Rust, se necessário.
Integração com Jupiter?
Chame a API HTTP de cotação/troca do Jupiter, desserialize as instruções retornadas e assine localmente.
Como estimar taxas de prioridade?
Use getRecentPrioritizationFees RPC ou auxiliares de provedor; consulte a seção de taxas prioritárias.
Testes Devnet?
Valide a lógica na devnet, mas o comportamento do mercado de taxas difere da mainnet.
Várias carteiras?
Um Keypair por estratégia limita o raio de explosão.
Desvio de relógio?
Use o slot/hora RPC, e não o relógio do laptop, para agendamento.
Conformidade?
Registrar negociações com assinaturas para auditoria; respeitar as regras jurisdicionais.
Websocket vs enquete?
Websockets para acionadores de contas; polling mais simples para protótipos.
Surfpool para sim?
O Surfpool 0.12.0 ajuda a reproduzir o estado da rede principal localmente antes de arriscar fundos.
AnchorPy em bots?
Use ao chamar seus próprios programas Anchor; agregadores retornam ix bytes brutos.
Relacionado
- Construindo transações em Python - montagem tx
- Troca com Jupiter - integração de troca
- Definição de taxas prioritárias - ajuste de taxas
- Python para práticas recomendadas de Solana - regras de produção
Versões Stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.