Como o MCP funciona no hamster-bot
O bot negocia sozinho no VPS, com as chaves e configurações que uma pessoa forneceu. O MCP abre uma segunda entrada no bot: por ela, um agente de IA no mesmo servidor controla o bot. A pessoa conversa com o agente pelo celular.
87 ferramentas
Quem faz o quê#
Bot
Negocia 24 horas por dia conforme as configurações e guarda as chaves da corretora. Para funcionar, não precisa do agente nem do celular.
Agente
Pesquisa configurações no testador, inicia e edita estratégias, acompanha os bots e mantém um diário. Dá comandos de negociação pelas ferramentas do bot.
Celular
Uma janela para a sessão do agente. A própria sessão, seus arquivos e a conexão MCP ficam no VPS.
O caminho de um comando: “feche a posição de BTC”#
- 1A pessoa escreve uma mensagem no app do Claude. Ela vai para a nuvem da Anthropic por HTTPS.
- 2O Claude Code no VPS consulta a nuvem por conta própria e pega a mensagem. O modelo decide qual ferramenta chamar.
- 3O agente chama
close_positionem/mcpcom oapi_token. O bot verifica o token. - 4O servidor MCP transforma a chamada em uma requisição comum a
/api/*do mesmo bot e repassa o mesmo token. Por isso o MCP e a API têm a mesma lógica e as mesmas verificações. - 5A API passa o comando ao núcleo do bot. O núcleo pega a chave dessa conta.
- 6O conector assina a requisição e a envia à corretora. O resultado volta pela mesma cadeia e aparece no celular.
O que acontece se uma das partes cair#
| O que aconteceu | Bot | Agente |
|---|---|---|
| Celular desligado | Negocia | A sessão continua rodando no VPS |
| SSH fechado | Negocia | Continua funcionando se foi iniciado no tmux |
| VPS sem rede por mais de 10 minutos | Não consegue acessar a corretora até a rede voltar | O processo claude remote-control termina e precisa ser iniciado de novo |
| Agente parado | Negocia com as configurações atuais, mas ninguém o acompanha | Não funciona |
use_mcp desativado | Negocia | Não consegue controlar o bot: /mcp responde 404 |
O que o agente pode fazer pelo MCP#
| Grupo | Ferramentas | Exemplos |
|---|---|---|
| Testador | 42 | tester_run_mining, tester_run_batch, tester_portfolio_analysismais 39
|
| Bots | 10 | list_bots, get_balances, pause_bot, play_botmais 6
|
| Posições e ordens | 9 | list_positions, market_order, close_positionmais 6
|
| Contas | 8 | list_accounts, save_account, get_balance_historymais 5
|
| Estratégias | 7 | save_strategy, create_strategy_from_tester, delete_strategymais 4
|
| Sistema e logs | 7 | get_errors, read_log_file, update_programmais 4
|
| Configurações | 4 | get_config, update_config, get_field_hintsmais 1
|
Das 87 ferramentas, 42 apenas leem dados (readOnlyHint), e 25 são marcadas como perigosas (destructiveHint): negociam, iniciam bots ou alteram dados de forma irreversível. São ordens a mercado, fechamento de posições, cancelamento de ordens, início de bots, salvamento e exclusão de estratégias e chaves, alteração da configuração, desligamento e atualização do programa. O testador trabalha com dados históricos e não negocia na corretora.
Limites de acesso#
- O token dá direitos de proprietário. Com o
api_token, as 87 ferramentas ficam disponíveis, inclusive negociação, exclusão de contas e desligamento do programa. Não existe modo somente leitura. - A confirmação depende do cliente. As ferramentas perigosas são apenas marcadas; quem deve perguntar à pessoa é o cliente MCP. No modo autônomo as permissões são dadas com antecedência, e o agente age sem perguntar.
- O CLAUDE.md define regras, mas não protege. O agente segue os limites de risco e a proibição de sair da pasta como instruções. Se ele tiver um shell com o mesmo usuário do bot, tecnicamente pode ler os arquivos do bot.
- O token nem sempre é necessário. Com o login pelo Telegram desativado, requisições a
/mcpda mesma máquina passam sem token. Isso vale para qualquer processo local. - A interface web, a API e o MCP usam a mesma porta. Para um agente no mesmo VPS, o endereço
127.0.0.1basta. De outra máquina o token trafega em texto puro, por isso pela internet é preciso um proxy HTTPS ou um túnel SSH.
Como executar no VPS#
No
settings_program.jsondo bot, sem reiniciar:"use_mcp": true
Uma sessão que sobrevive ao fechamento do SSH:
tmux new -s agent
Conectar o agente ao bot:
claude mcp add --transport http hamster-bot http://127.0.0.1:<porta>/mcp --header "Authorization: Bearer <api_token>"
Abrir a sessão para o celular:
claude remote-control --name "hamster-bot"
No chat da sessão: trabalho autônomo por agendamento:
/loop 6h Continue o trabalho conforme o CLAUDE.md
Detalhes da conexão#
O MCP vem desativado por padrão. Em vez de editar o arquivo, é possível ativá-lo pela API: POST /api/settings/config com o corpo { "use_mcp": true }.
Endereço: http://127.0.0.1:<porta>/mcp, transporte Streamable HTTP. De outra máquina, use o endereço do servidor em vez de 127.0.0.1.
Em vez de claude mcp add, a conexão pode ser descrita no arquivo .mcp.json do projeto:
{
"mcpServers": {
"hamster-bot": {
"type": "http",
"url": "http://127.0.0.1:5000/mcp",
"headers": { "Authorization": "Bearer <api_token>" }
}
}
}Outros clientes se conectam ao mesmo endereço se suportarem Streamable HTTP e cabeçalhos de requisição personalizados.
As regras de acesso são as mesmas da API (veja Acesso). Além do token, o cookie hamster-bot-token funciona com o login ativado. Uma requisição sem nenhum deles recebe 401.
Nomes de argumentos#
Todas as ferramentas usam os mesmos nomes: strategy — nome da estratégia do bot, account — nome da conta, folder — pasta de configurações do testador. Os nomes antigos são aceitos como sinônimos: name em vez de strategy em get_strategy, copy_strategy, delete_strategy, name em vez de account em get_account, get_account_symbols, delete_account, get_account_info, get_balance_history, compact_balance_history, path em vez de folder em set_tester_settings_folder, create_tester_settings_folder, delete_tester_settings_folder. Se não houver nem o nome principal nem o sinônimo, o erro indica o campo esperado. strategy em draft_strategy, draft_tester_settings e get_settings_schema é um código de estratégia (zigzag, mrs2), não um nome. Para configurações do testador, name é o nome do conjunto de configurações.
Um erro da API é devolvido ao agente como erro da ferramenta com o código e o texto, por exemplo HTTP 404: {"success":false,"error":"Strategy not found"}. Respostas muito longas são cortadas em 200.000 caracteres. read_tester_file devolve arquivos de texto em linhas inteiras: uma resposta longa termina com a dica ... [lines A-B of N; continue with offset=B]. Para CSV longos existem os parâmetros offset e limit (uma página de linhas), tail_lines (últimas N linhas), contains (apenas linhas com o texto) e columns (apenas as colunas necessárias); o cabeçalho do CSV é sempre mantido. list_tester_files aceita contains, offset e limit. Relatórios HTML são grandes, por isso para comparar execuções é melhor tester_report_summaries, e para detalhes de uma execução, read_tester_report.
Pesquisa no testador#
O agente pode pesquisar uma estratégia por conta própria. Uma ordem típica:
get_field_hints— entender os campos das configurações da estratégia e da configuração do testador, inclusive a sintaxe deparameter_mining;get_settings_schema— quais campos a estratégia realmente lê: minerar um campo sem efeito gera linhas idênticas.create_tester_settings_folder— criar sua própria pasta para o experimento;copy_tester_settings_to_folder— copiar para ela as configurações necessárias. Depois, passarfoldera todas as ferramentas do testador.draft_tester_settingsesave_tester_settings— criar novas configurações para a corretora, o par e o timeframe desejados. Variantes de configurações existentes não precisam ser salvas:overridesas define na execução.save_tester_config— definir o período, as taxas,parameter_mininge um novoname_commentpara o experimento; ativarreport.enable_json_report. Para comparar com um bot real, coloque o início do período (StartDate) em um limite dotime_frameda estratégia e não antes do início do bot: a estratégia trabalha a partir do primeiro candle do seu timeframe que abre emStartDateou depois, então um início no meio de um candle de 4h adia as primeiras ordens para o candle seguinte.WarmupDays(padrão 30) apenas aquece os indicadores com o histórico anterior aStartDate: nesses dias a estratégia não negocia nem acumula estado, e a posição e as ordens do bot real não são restauradas do histórico. Se o par tiver menos dados queWarmupDays, a negociação começa mais tarde (com um aviso na resposta).tester_download_data— baixar os candles e aguardar o término emtester_status. O período pode ser definido comstarteend, por padrão: início da configuração com aquecimento .. agora (não é preciso alterar a configuração).download.resultmostra até que dia cada par realmente tem dados.tester_run_single— verificar uma combinação;tester_wait(ouwait_secondsao iniciar) aguarda a execução e retorna métricas, avisos e caminhos dos relatórios.tester_run_batch— comparar várias variantes e verificá-las em vários períodos com uma chamada. Outester_run_mining— percorrer todas as combinações: resultados em<name_comment>/reports_history.csv(read_tester_file);queue=truecoloca a mineração na fila após a atual.read_tester_report— analisar uma execução: a seçãosummarypara comparação, resultados por par, meses, trades. Para um conjunto de estratégias —tester_portfolio_analysis: grupos T/CT, correlação, piores dias, contribuição de cada estratégia para o drawdown.tester_report_summaries,tester_run_stressewalk_forwardna configuração — comparar as melhores variantes e verificar sua robustez.send_tester_report_to_telegram— enviar o relatório final ao usuário no Telegram, se ele pedir.
Uma estratégia por par#
Em uma conta, um par (basic.symbol) pode ter apenas uma estratégia, tanto na negociação real quanto no testador. Uma conta pode ter quantos pares quiser (até 200), e as estratégias neles podem ser diferentes ou iguais, mas o símbolo deve ser único entre as estratégias da conta. Uma estratégia em um par ocupado é salva, mas não inicia (no log aparece DUBLICATE SUMBOL ON API); verifique list_strategies por conta e par antes de save_strategy, copy_strategy (copie para outro par) e create_strategy_from_tester. Configurações do testador que rodam na mesma execução também precisam estar em pares diferentes; para comparar várias configurações em um par, execute cada uma separadamente (itens de tester_run_batch ou mineração com single_mode).
Reinvestimento e comparação de variantes#
O tamanho da posição por basic.balance_percentage_long/_short é calculado sobre o saldo atual, então o lucro é reinvestido e o PnL % anual fica inflado. Para comparar variantes e períodos de forma justa, desative o crescimento do tamanho de uma destas formas:
basic.use_fix = trueebasic.my_fix_balance = 50: cada ordem é calculada sobre 50 unidades da moeda de cotação (geralmente USDT), independentemente do saldo.basic.max_balance = 2000: enquanto o saldo for menor, o bot trabalha com o saldo real; com saldo de 2350 o tamanho é calculado sobre 2000, e acima do limite o reinvestimento para.basic.lot_long/basic.lot_short: um tamanho constante de ordem enviado à corretora.
Algumas estratégias podem mudar esse tamanho base pela própria lógica. Os parâmetros podem ser definidos pelos overrides da execução (set) ou minerados em parameter_mining.
As respostas de salvamento e execução contêm warnings: campos que as configurações não leem. check_tester_settings verifica assim a pasta inteira.
Passagem para a negociação e controle#
create_strategy_from_tester leva uma configuração verificada para o bot — a estratégia é criada pausada, e play_bot a inicia após a verificação. O agente avalia um bot real assim: depois que o dia fecha e os candles podem ser baixados, executa o testador com as mesmas configurações e no mesmo período (import_tester_settings copia a estratégia para a pasta do testador) e obtém as estatísticas completas — normalmente coincidem com a negociação real. O resultado efetivo é o histórico de saldo get_balance_history (gravado com monitoring.enabled ativado).
As instruções do servidor e as descrições das ferramentas explicam ao agente a regra principal da negociação real: a posição e as ordens não podem ficar sem controle. Uma estratégia pausada não as gerencia, por isso o desligamento segue apenas a ordem pausar → cancelar ordens → fechar a posição → excluir (delete_strategy com full=true faz isso sozinho).
Logs#
Cada bot (estratégia em um par) tem seu log: log_<data>_<Corretora> <conta> <par> <timeframe> <estratégia> <nome>.log — níveis, sinais, ordens colocadas e canceladas, preenchimentos, mudanças de posição e erros da estratégia; por ele se vê por que o bot negociou ou não. Cada conta tem log_<conta>_<data>.log: saldos e posições da corretora, respostas e erros da API da corretora, limitador de posições, close_by_margin. O log geral do programa é log_<data>.log (get_log), os logs do testador são TESTER_*.log. O formato da data nos nomes varia, por isso os arquivos são procurados pelo nome da estratégia ou da conta: list_log_files com contains, depois read_log_file.
Exemplos de uso#
Abaixo estão pedidos ao agente e as chamadas de ferramentas que ele faz. Os argumentos aparecem em JSON, como o cliente MCP os envia. A pasta lut_now, os nomes de configurações e as datas são exemplos.
Verificar uma variante do conjunto sem cópias de teste#
“O que acontece se eu dobrar as estratégias de tendência, mas sem passar de 10% por par, e desligar os shorts de C_MU? Verifique em dois períodos.”
tester_run_single {
"settings": ["*"], "folder": "lut_now", "wait_seconds": 240,
"overrides": [
{ "match": "T_*", "mul": { "basic.balance_percentage_long": 2, "basic.balance_percentage_short": 2 }, "cap_pct": 10 },
{ "match": "C_MU", "set": { "basic.use_short": false } }
],
"periods": [["2026-05-01", "2026-08-01"], ["2026-08-01", "2026-10-26"]]
}Os arquivos de configurações não mudam. A resposta de cada período traz summary (PnL, drawdowns, Ulcer, profit factor, trades, meses), caminhos dos relatórios, applied (o que foi alterado) e warnings. Em vez de uma máscara, você pode selecionar configurações por tag: { "tag": "hedge", "mul": { ... } }.
Comparar várias variantes com uma chamada#
tester_run_batch {
"folder": "lut_now", "parallel": 2, "wait_seconds": 240,
"periods": [["2026-05-01", "2026-08-01"], ["2026-08-01", "2026-10-26"]],
"runs": [
{ "name": "base", "settings": ["*"] },
{ "name": "T x2", "settings": ["*"], "overrides": [{ "match": "T_*", "mul": { "basic.balance_percentage_long": 2 } }] },
{ "name": "sem L_X", "settings": ["*"], "overrides": [{ "match": "L_X", "exclude": true }] },
{ "name": "apenas long", "settings": ["*"], "sides": "long" }
]
}Cada variante roda em cada período; a resposta é uma tabela de resultados. Sem wait_seconds, o agente aguarda o lote com tester_wait_batch.
Encontrar um parâmetro robusto em vários períodos#
“Encontre o depth de T_BTC, mas sem ajustar a um único período.”
get_settings_schema { "strategy": "zz" }—zz.depthsó tem efeito comzz.type = ZZ2; minerar um campo que a configuração não lê gera linhas idênticas.Mineração em três períodos (cada um é uma execução completa separada pela fila):
tester_run_mining { "settings": ["T_BTC"], "folder": "lut_now", "config": { "name_comment": "MCP_depth", "parameter_mining": [{ "name": "settings[*].zz.depth", "start": 4, "end": 20, "step": 2 }], "...": "o restante como em get_tester_config" }, "periods": [["2026-02-01", "2026-05-01"], ["2026-05-01", "2026-08-01"], ["2026-08-01", "2026-10-26"]] }A resposta contém
report_foldersde cada período ewarnings(parâmetros inexistentes e sem efeito).- Aguardar o término em
tester_status, depoistester_mining_robustness { "folders": [...], "base": { "settings[*].zz.depth": 12 } }— ranking pelo platô de todos os períodos, posição do melhor ponto de cada período no ranking geral e os pontos que não são piores que o inicial em nenhum período.
Avaliar o hedge das estratégias de tendência no portfólio#
“As estratégias T ajudam as estratégias CT no drawdown?”
- Execução do conjunto com
report.enable_json_report: true(a seçãodailyvem ativada por padrão). tester_portfolio_analysis { "path": "<report_json_path>", "groups": { "T": "T_*", "CT": "C_*" } }— correlação dos grupos, pior semana, PnL do grupo T nos piores dias de CT (offset_percent) eleave_one_out: quanto o drawdown do portfólio cresceria sem cada estratégia. Isso substitui uma execução separada sem cada estratégia.- Ajustar o tamanho de T em relação ao restante do conjunto — mineração de portfólio sem
single_mode: o parâmetrosettings[T_*].basic.balance_percentage_long, com as linhas comparadas peloMaxDrawdownPercenteUlcerIndexdo portfólio.
Verificar uma pasta de configurações#
check_tester_settings { "folder": "lut_now" } — configurações com campos alterados que não têm efeito (seção de outra estratégia, campo de outro zz.type, use_* desativado, basic.leverage no testador). Os mesmos avisos chegam ao salvar configurações.
Repetir uma execução com um ajuste e entregar a variante ao usuário#
Cada execução salva run_snapshot_*.json com as configurações exatas. O agente o lê (read_tester_file), ajusta e executa tester_run_snapshot com o snapshot alterado — o arquivo não muda. Para que o usuário execute a variante por conta própria, o agente a salva em runs com save_tester_file: na interface web (Testador, aba “Resultados (arquivos)”) o arquivo tem os botões “Executar” e “Editar”.
Levar a configuração para a negociação e acompanhar o bot#
“Inicie T_BTC na conta demo e acompanhe.”
list_accounts— encontrar a conta.create_strategy_from_tester { "name": "T_BTC", "folder": "lut_now", "account": "demo_bybit" }— a estratégia é criada pausada; o agente a verifica (get_strategy,warnings) e a inicia complay_bot.- Controle durante o dia:
list_bots,list_positions,list_orders; log da estratégia —list_log_files { "contains": "T_BTC" }eread_log_file; erros —get_errors. - Após o fechamento do dia:
import_tester_settings(a estratégia deget_strategypara a pasta do testador),tester_download_data, execução do testador no período passado — estatísticas completas que normalmente coincidem com a negociação real. O resultado efetivo éget_balance_history(commonitoring.enabled). Uma divergência é motivo para examinar o log da estratégia. - Ajuste: verificar a alteração no testador, depois
save_strategy— as alterações se aplicam imediatamente ao bot em execução.
Desligar uma estratégia#
delete_strategy { "name": "T_BTC", "full": true } — pausar, cancelar ordens, fechar a posição, excluir. Se as ordens ou a posição não forem removidas, a estratégia fica pausada e não é excluída: o agente verifica list_orders e list_positions e termina manualmente na mesma ordem, sem pular a pausa.
Enviar um relatório#
“Envie o relatório final para o Telegram” — send_tester_report_to_telegram { "path": "<report_path>", "caption": "melhor variante por drawdown" }. Só são enviados arquivos de relatório do testador, ao chat de notificações do testador.
Exemplos de pedidos ao agente:
- “Encontre o comprimento do zigzag para BTCUSDT 1h na Bybit nos últimos três meses, verifique o melhor ponto em dois outros períodos e com um teste de estresse.”
- “Sincronize a pasta lut_now com mrs-bybit e compare o conjunto com as estratégias T dobradas e sem elas por drawdown e Ulcer.”
- “Quais estratégias de lut_now aumentam o drawdown do portfólio e quais o reduzem?”
- “Leve a melhor variante para a conta demo, inicie-a e compare todo dia a negociação real com o testador.”
Exemplos: o que pedir ao agente
Fale com o agente em linguagem comum: ele escolhe as ferramentas, chama-as uma após a outra e explica o resultado.
Pesquisa no testador
«Ajuste os parâmetros da MRS2 para BTC no último ano e verifique os melhores com um teste de estresse»
Configura a otimização, executa, procura um platô e não um pico isolado, roda tester_run_stress e conta o que sobreviveu.
«Rode a e2e_zz em setembro e explique por que a estratégia ficou no prejuízo. Analise os trades: longs contra shorts, duração, MAE/MFE. Sugira uma mudança e teste-a»
Pega os trades de read_tester_report e encontra padrões sozinho: por exemplo, que os shorts dão prejuízo ou que os trades fecham antes do pico de MFE. Depois muda um parâmetro, roda de novo e mostra os números antes e depois.
«Encontre o melhor comprimento do zigzag por otimização e depois prove que não é sobreajuste: walk-forward e teste de estresse»
A otimização encontra a variante «perfeita», walk_forward verifica-a num período que o otimizador não viu e tester_run_stress, em condições de execução piores. Normalmente a melhor variante cai bastante em dados novos, e o agente mostra isso.
«Ajuste o zigzag para BTCUSDT 1h na Bybit nos últimos 3 meses e dê uma recomendação final»
O ciclo inteiro numa frase: dicas dos campos, configurações, download de dados, execuções, leitura dos resultados e conclusão.
«Teste a estratégia nos 10 principais pares da Bybit e mantenha os pares onde ela funciona de forma estável»
tester_exchange_symbols, configurações para vários pares, a seção by_symbol e o retorno mensal do relatório JSON.
«Mostre como o resultado depende da taxa e do slippage»
Otimização por TakerFee e SlippagePercent na configuração do testador. Mostra claramente por que uma estratégia com ótimo backtest perde dinheiro na negociação real.
«Compare as duas últimas execuções: onde a nova versão é melhor e onde é pior?»
Lê os relatórios JSON e decompõe a diferença por par, mês e drawdown.
«Copie a estratégia de BTC para SOL e rode-a no testador em seis meses»
Copia as configurações para outro par, baixa o histórico, roda o backtest e diz se vale a pena levá-la para a conta real.
«Sincronize a pasta lut_now com mrs-bybit e compare o conjunto com as estratégias T dobradas e sem elas por drawdown e Ulcer»
copy_tester_settings_to_folder e depois tester_run_batch com overrides — sem cópias de teste das configurações, todas as variantes numa só chamada.
«Quais estratégias da lut_now aumentam o drawdown do portfólio e quais o reduzem?»
tester_portfolio_analysis: correlação dos grupos, piores dias e leave_one_out — drawdown do portfólio sem cada estratégia, sem execuções extras.
«Ajuste o comprimento do zigzag, verifique o melhor ponto em outros dois períodos e com teste de estresse»
Otimização com periods e depois tester_mining_robustness mostra se o ponto se mantém em todos os períodos ou foi ajustado a um só.
Bot em operação: leitura e análise
«Resumo da manhã: saldo, posições abertas, erros da noite»
Saldos, posições, ordens, histórico de saldo e erros dos logs — uma frase em vez de cinco abas. No Claude Code dá para agendar o resumo com /loop.
«Por que o bot de ETH não abriu trade esta noite?»
Verifica o log e os erros da noite, o estado do bot e os filtros da estratégia e explica o motivo.
«Investigue os erros das últimas 24 horas»
Com get_errors e get_account_info encontra a causa — por exemplo, uma chave expirada ou falta de permissão para futuros — e explica em palavras simples.
«Verifique minhas estratégias em busca de configurações arriscadas»
Compara todas as estratégias com as dicas dos campos e aponta os riscos.
«Envie ao Telegram o gráfico e a posição de cada bot em drawdown»
Encontra esses bots e envia o gráfico e a posição deles ao Telegram.
Controle: com confirmação
Antes de ações reais o agente mostra o que vai fazer, e o cliente pede confirmação para cada ferramenta destrutiva, a menos que as permissões tenham sido dadas com antecedência (veja Limites de acesso).
«Crie uma estratégia real com os parâmetros encontrados, mas pausada»
Depois da pesquisa: create_strategy_from_tester leva a configuração verificada do testador para um bot pausado. Você revisa as configurações e inicia o bot por conta própria.
«Leve a melhor variante para a conta demo, inicie-a e compare todo dia a operação real com o testador»
Depois do fechamento do dia roda o testador com as mesmas configurações no mesmo período e compara com o histórico de saldo; uma divergência é analisada pelo log da estratégia.
«Desligue a estratégia T_BTC»
delete_strategy com full=true: pausa, cancelamento das ordens, fechamento da posição, exclusão — a posição nunca fica sem gerenciamento.
«Explique o que faz o parâmetro block_adds e ligue-o onde houver filtro de tendência»
Lê as dicas dos campos, encontra as estratégias certas e as ajusta.
«Pause todos os bots de altcoins e cancele as ordens deles»
Pausa e cancelamento de ordens — tudo com palavras.
«Reduza todas as posições da conta pela metade e pause os bots»
reduce_positions e pause_all_bots.