Teste de estratégias de trading em dados históricos
Backtest de portfólio confiável. Nível de pesquisa quant
hamster-bot/tester - uma ferramenta avançada para testar seus sistemas de trading em dados históricos.
Recursos do backtester:
- Teste de portfólio. Várias estratégias de tipos diferentes, em pares e timeframes diferentes, ao mesmo tempo — em um único saldo compartilhado com margem cruzada. Dá para ver como as estratégias convivem na mesma carteira: carga total do depósito, drawdown geral, sobreposição de posições.
- O mesmo código de produção. O backtest roda o mesmo código com que o bot opera em tempo real: estratégias, serviço de posições, limitador de posições, opções da conta. Nada de reescrever a lógica para o testador.
- Simulação honesta dentro da vela. Passo de 1 minuto: a estratégia é chamada a cada minuto e vê a vela em formação, as ordens são verificadas pelo High/Low de cada minuto. Trailing stops, reposicionamento de ordens e saídas dentro da vela funcionam como no trading real. (Opcionalmente é possível ativar uma simulação mais detalhada, com precisão de tick)
- Custos realistas. Taxas de maker/taker, slippage em ordens a mercado e stop, funding, execução de ordens limitadas limitada pelo volume da vela.
- Os dados são baixados automaticamente. BYBIT, BINANCE, MEXC (spot e futuros) e BITMEX — para qualquer período histórico. Também é possível usar seus próprios dados em CSV.
- Relatório interativo detalhado. Curva de equity, mapa de calor do retorno mensal, gráficos de operações de cada par e mais de 50 métricas: Sharpe, Sortino, Calmar, CAGR, Recovery Factor, sequências de ganhos/perdas, carga do depósito etc.
- Otimizador de parâmetros. Varredura de quaisquer configurações do bot, das estratégias, da conta e do próprio testador. Execuções paralelas em todos os núcleos, amostragem Monte Carlo para espaços de parâmetros enormes, seleção de portfólio de pares sem repetição. Resultados — em uma tabela resumo e em mapas de calor / 3D surface.
- Testa sua própria lógica complexa, que não pode ser testada com precisão por soluções prontas de terceiros sem gambiarras.
Implementado como um conector separado
para uma "exchange" (um objeto mock que substitui a exchange). Assim é possível testar
todo o código já escrito do bot. O bot acha que está operando em uma exchange real (envia ordens, recebe saldo e
informações de posições). E essa exchange virtual simulada calcula tudo e gera o relatório.
Dados de mercado para
teste
As exchanges de criptomoedas compartilham publicamente dados históricos de mercado. O testador baixa sozinho o
intervalo de dados necessário, monta a partir deles velas de 1 minuto e, a partir desses minutos, forma as
barras do timeframe necessário para o bot. Nenhuma ação manual ou cadastro é necessário.
Além disso, são baixados WarmupDays dias antes do início do teste, para que todos os indicadores
de AT da estratégia já estejam calculados em StartDate.
Exchanges suportadas. A exchange é obtida do arquivo de configurações da estratégia:
settings.exchange.name.
- BYBIT — futuros (
bybit) e spot (bybit-spot). Arquivos de todas as operações depublic.bybit.com. - BINANCE — futuros USDT-M (
binance,binance-papi) e spot (binance-spot). Arquivos diários de operações agregadas dedata.binance.vision. - MEXC — spot (
mexc) e futuros (mexc-futures). Velas de 1 minuto prontas pela API pública da exchange. - BITMEX — (
bitmex). Arquivos diários de operações depublic.bitmex.com. Um arquivo contém as operações de todos os pares de uma vez — o testador o baixa uma única vez e distribui pelas pastas dos pares.
Se for indicada uma exchange para a qual não há downloader, o testador usa os dados da BYBIT.
Armazenamento. Os dados são salvos na pasta
tester/data/{exchange}/{symbol} — um arquivo de velas de 1 minuto por dia
no formato Parquet (2026-02-03_1m.parquet, na BitMEX 20260203_1m.parquet). Os
arquivos são comprimidos e ocupam menos espaço que CSV. Os arquivos de operações baixados são apagados após a conversão, para não
ocupar espaço. Dias já baixados não são baixados de novo: nos testes seguintes o testador baixa apenas os dias
que faltam (se UpdateData = true). Com UpdateData = false o teste roda apenas com os
dados que já estão na pasta.
Na varredura paralela os processos não atrapalham uns aos outros: o mesmo par é baixado por apenas um processo
de cada vez, os demais esperam e usam os arquivos já prontos.
Ao iniciar o teste, são lidos apenas os arquivos diários do período do teste (com o aquecimento). Arquivos sem
data no nome não são lidos.
Dados no formato CSV antigo. Os dados baixados por versões anteriores do bot (*_1m.csv)
não precisam ser baixados de novo: no primeiro teste de um par o testador converte os arquivos CSV dele para
Parquet e apaga o CSV. Para converter de uma vez toda a pasta tester/data, use
run_convert_data.bat (no macOS, run_convert_data_mac.sh) na pasta do bot: ele executa
o bot com a flag --convert-data. Pode ser executado também enquanto o testador está rodando.
Seus próprios dados. Você pode colocar seus dados no formato CSV na pasta
tester/data/{exchange}/{symbol}. No primeiro teste desse par (ou via
run_convert_data.bat) o testador converte os dados para Parquet e apaga o CSV original, então
guarde uma cópia se precisar dele. Requisitos:
— um arquivo por dia, o nome termina com a data e _1m.csv, por exemplo
2026-02-03_1m.csv (arquivos sem data no nome não são lidos);
— velas de 1 minuto (o testador percorre o histórico em passos de 1 minuto / opcionalmente é possível rodar a
cada tick, mas fica lento);
— a primeira linha é o cabeçalho, seguida das colunas timestamp,open,high,low,close,volume (as
demais colunas são ignoradas; se houver 9 colunas ou mais, as colunas 7–9 são lidas como
buy_volume,sell_volume,trades);
— timestamp em UTC: tempo unix em segundos, milissegundos, microssegundos ou nanossegundos (o
formato é detectado automaticamente), ou uma data em texto 2026-02-03 00:01:00;
— o separador de colunas é a vírgula, o separador decimal é o ponto.
Exemplo:
timestamp,open,high,low,close,volume 1770076800000,97512.5,97540.0,97480.1,97530.2,12.345 1770076860000,97530.2,97561.7,97522.0,97555.0,8.910
Download antecipado. O arquivo run_download_data.bat na pasta do bot executa o bot com a
flag --download-data. Nesse modo o testador não testa nada, apenas baixa todos os dados
necessários para o período do teste (+ aquecimento) de todos os pares de tester/settings_strategy,
incluindo os pares da varredura parameter_mining. É prático rodar antes de uma varredura
grande.
Comportamento
do testador
Do ponto de vista do bot, o testador é apenas mais uma exchange. O bot se conecta a ela e começa a receber barras, enviar ordens etc. Enquanto isso, o testador apenas emula o comportamento de uma exchange real.
Tempo e velas. O testador percorre o histórico em passos de 1 minuto, de forma sincronizada em todos os
pares. A partir dos minutos ele monta as velas do timeframe de trabalho da estratégia (1m, 5m, 15m, 30m, 1h,
2h, 4h, 6h, 8h, 12h, 1d, 1w) alinhadas ao UTC, como na exchange: velas de 1h começam em XX:00, de 4h — em
00:00/04:00/08:00…, de 1d — em 00:00 UTC, de 1w — na segunda-feira 00:00 UTC.
A estratégia é chamada a cada minuto, e não apenas no fechamento da vela — no timeframe de 1h são ~60
chamadas por vela. O bot recebe as barras fechadas e a vela atual em formação, cujo OHLC é atualizado a
cada minuto. Por isso a lógica que depende do preço dentro da vela (trailing stops, reposicionamento de ordens,
saída pelo preço atual etc.) funciona igual ao trading real.
As barras do período de aquecimento (WarmupDays) são usadas apenas para calcular os indicadores —
o trading começa em StartDate. Se faltar um minuto nos dados (não houve operações), o testador
insere uma vela "vazia" com o último preço.
Execução de ordens. Em cada vela de 1 minuto o testador verifica todas as ordens pendentes pelo seu High/Low:
market— executada imediatamente ao preço atual, considerando o slippage (SlippagePercent): compra mais caro, venda mais barato. Taxa de taker.limit— executada pelo seu próprio preço quando o preço do minuto o atinge (Low ≤ preço para compra, High ≥ preço para venda). Taxa de maker. ComLimitOrderVolumeCheck = trueo volume executado é limitado pelo volume da vela de 1 minuto — é possível execução parcial, o restante espera as próximas velas.stop/stop_market— dispara ao tocar o preço de gatilho e é executada nele com slippage. Taxa de taker.stop_limit— ativada pelo gatilho e executada pelo preço limite, se ele também for atingido nesse minuto. Taxa de maker.take_profit— executada pelo preço de gatilho quando ele é atingido. Taxa de taker.
As ordens podem ser alteradas (preço, volume, gatilho) e canceladas — como na exchange.
reduceOnly é suportado: uma ordem assim só pode reduzir a posição e nunca a inverte. As
configurações da estratégia use_long/use_short são respeitadas: se uma direção está
desativada, uma ordem nessa direção só pode fechar a posição oposta, e o volume "excedente" é descartado.
Posições. Modo One-Way (uma posição por par): uma compra com posição short primeiro fecha/reduz o short, e o excedente abre um long (inversão). Ao aumentar a posição, o preço de entrada é ponderado. O PnL é realizado a cada fechamento ou redução da posição.
O saldo é compartilhado entre todas as estratégias. Se comporta como os futuros da BYBIT/BINANCE com
margem cruzada. O bot pode consultar o saldo Wallet ou Margin:
— Wallet — saldo realizado: saldo inicial + PnL realizado − taxas ± funding;
— Margin (equity) — Wallet + PnL não realizado de todas as posições abertas. A curva de equity e o
drawdown máximo são calculados a partir dele.
A taxa é descontada do saldo imediatamente a cada execução de ordem.
Se o saldo Margin chegar a zero, o testador interrompe a execução — o depósito "quebrou", não faz sentido
continuar testando.
Funding. A cada FundingIntervalHours horas (em UTC, no início da hora) é aplicado funding a
todas as posições abertas: tamanho da posição × preço × FundingRate. Com taxa positiva, longs
pagam e shorts recebem. Os totais aparecem no relatório (Funding paid / received / net). Para desativar o
funding, defina FundingRate = 0.
Lógica do bot. No testador roda exatamente a mesma lógica do trading real: o serviço de posições, o limitador de posições abertas simultaneamente, as opções da conta (por exemplo, fechamento por lucro da margem) — tudo isso é o código de produção compartilhado do bot.
Relatório
Ao final do teste, um relatório HTML interativo detalhado é salvo na pasta
tester/report/{name_comment}.
E é adicionado um registro em reports_history.csv com informações resumidas do teste, para
facilitar a busca pelas melhores combinações de parâmetros ao otimizar estratégias.
Relatório do otimizador. Na varredura de parâmetros (parameter_mining), além dos relatórios
de cada execução, o testador gera mais um relatório resumo, report_optimizer_*.html, com todas as
execuções de uma vez. Nele os resultados da varredura são mostrados em mapas de calor e gráficos 3D surface:
nos eixos X e Y — os valores dos parâmetros varridos, no eixo Z — as métricas (retorno, drawdown, Profit Factor
etc.). Assim se veem de imediato os "platôs" estáveis de bons valores, e não picos isolados aleatórios. O
relatório é criado automaticamente na varredura paralela (max_parallel_runs > 1) ou
manualmente via run_report_optimizer.bat, mais detalhes na seção "Otimizador".
Cabeçalho do relatório — indicadores principais:
Pairs- número de pares de trading (estratégias) no testeInitial Balance/Final Balance- saldo inicial e final em USDTTotal PnL- lucro/prejuízo total em USDT e %Total Trades (Win/Los)- número de operações, das quais lucrativas e com prejuízoWin Rate- percentual de operações lucrativasMax Drawdown- drawdown máximo em USDT e %Total Fees- total de taxas pagasPosition avg (max), %- tamanho total médio (e máximo) das posições abertas em % do saldo Margin. Mostra o quanto o sistema carrega o depósitoProfit Factor- relação entre o lucro bruto e o prejuízo brutoDuration (days)- duração do período de teste em dias
Gráficos:
Equity Curve- gráfico do saldo Margin (considerando todas as posições abertas e o PnL não realizado) e do saldo Wallet. A linhaLiquidation Level(ativada na legenda) é o nível de liquidação em margem cruzada, aproximadamente como na UTA da Bybit: a margem de manutenção total das posições de futuros abertas em USDT (nocional × MMR do nível de risk limit − mmDeduction + taxa taker para fechar). Se o saldo Margin cair abaixo dessa linha, uma exchange real liquidaria. Os níveis de risk limit são baixados da Bybit; para as demais exchanges é usadomaintenance_margin_ratedoconfig_tester.json. Apenas para o gráfico, não interrompe o testeMonthly Returns Heatmap- mapa de calor do retorno por mês e o total de cada anoOpen Positions Size- tamanho total das posições abertas em USDT: geral, longs e shorts separadamente, e também por estratégias de tendência e contratendênciaStrategy Charts- gráficos de velas separados para cada estratégia, com marcações das operações e visualização da AT da estratégiaRealized PnL by Symbol- PnL realizado acumulado por par e no total
Report Statistics — estatísticas detalhadas:
- Period & Scope (período do teste)
Report range- datas de início e fim do testeDays in test- número de dias no testeMonths in test- número de meses do calendário abrangidos pelo testeMonths with data- número de meses para os quais o retorno foi calculadoPairs count- número de pares (estratégias)
- Balance & Equity (saldo)
Initial balance/Final balance- saldo inicial e finalMin balance/Max balance- valor mínimo e máximo do saldo Margin durante todo o teste
- Monthly Performance (retorno mensal)
Average monthly return (geometric), %- retorno mensal médio considerando juros compostos (reinvestimento). A estimativa mais honesta de "quanto por mês, em média"Average monthly return (arithmetic), %- média aritmética simples dos retornos mensaisBest month, %/Worst month, %- melhor e pior mês
- PnL, Volume & Fees (lucro, volume e taxas)
Total PnL/Total PnL, %- lucro/prejuízo total em USDT e %Gross profit- soma de todos os fechamentos lucrativos (lucro bruto)Gross loss- soma, em módulo, de todos os fechamentos com prejuízo (prejuízo bruto)Trading volume (USDT)- volume total negociadoTotal transactions (buy/sell)- número total de execuções de ordens (compras e vendas)Total fees- total de taxas pagasFunding net- resultado do funding (recebido menos pago)Funding accrued (received)- quanto de funding foi recebidoFunding paid- quanto de funding foi pago
- Trades (operações)
Total Trades/Win Trades/Los Trades- total de operações, lucrativas e com prejuízoWin Rate, %- percentual de operações lucrativasExpectancy per trade- expectativa matemática: resultado médio de uma operação em USDT ((lucro bruto − prejuízo bruto) / número de operações)Max consecutive wins/Max consecutive losses- maior sequência de operações lucrativas e com prejuízo seguidas
- Risk & Exposure (risco e carga do depósito)
Position avg / max, % of margin balance- tamanho total médio e máximo das posições abertas em % do saldo MarginLong / Short Position avg / max, % of margin balance- o mesmo, separadamente para longs e shortsMax Drawdown/Max Drawdown, %- drawdown máximo em USDT e %
- Risk by strategy (carga do depósito por tipo de estratégia)
T ...- tamanho médio e máximo das posições (geral, long, short) das estratégias de tendência em % do saldo MarginCT ...- o mesmo para as estratégias de contratendência
- Risk-Adjusted Ratios (índices retorno/risco)
Profit Factor- lucro bruto / prejuízo bruto. Acima de 1 — o sistema é lucrativoRisk/Reward- operação lucrativa média / operação com prejuízo médiaRecovery Factor- Total PnL / Max Drawdown. Quantas vezes o lucro cobre o drawdown máximoSharpe ratio (monthly)- índice de Sharpe com base nos retornos mensais (anualizado). Retorno em relação à volatilidade totalSortino ratio (monthly)- índice de Sortino. Como o Sharpe, mas considera apenas a volatilidade negativa (quedas)CAGR, %- taxa de crescimento anual composta do capitalCalmar ratio- CAGR / Max Drawdown %. Retorno anual em relação ao drawdown máximo
Details — abas com detalhamento:
Settings- configurações de todas as estratégias que participaram do testeTrades- tabelas com todas as operações de cada par: horário, ordem, estratégia, lado, ação, tamanho, preço, taxa, PnL, saldo, posição após a operação, valor da posição em USDT e em % do saldo MarginMarkets- parâmetros dos instrumentos: tipo do instrumento (Type: na Bybitcrypto,stock,ETF,commodity,forexetc.), tamanho máximo da ordem a mercado, alavancagem máxima, passo do lote, preço atual e volume médio diário negociado em 1, 10 e 100 diasSummary- tabela resumo por par: número de operações, Win Rate, Profit Factor, PnL, taxas, volume negociado, tamanho médio e máximo da posição em %Tester Config- parâmetros do testador e valores dos parâmetros varridos nesta execução, além das opções da contaclose_by_margin,open_positions_limitererisk_multiplier
Parâmetros
do testador
arquivo: config_tester.json Você pode editar o arquivo em um editor de texto.
name_comment - comentário do teste. Para facilitar a organização dos relatórios. Os relatórios são
salvos em uma pasta separada tester/report/{name_comment}.
InitialBalance - saldo inicial para o teste, em USDT
StartDate - data de início do teste, no formato 2026-02-03T00:00:00
EndDate - data de término do teste, no formato 2026-02-13T00:00:00
WarmupDays - número de dias de aquecimento antes do início do teste. Os dados desses dias são
baixados adicionalmente antes de StartDate, para que os indicadores de AT já estejam calculados no
início do teste.
MakerFee - taxa de maker (0.0001 = 0.01%) Padrão na BYBIT: 0.00036 = 0,0360%.
(guia de como reduzir bastante a taxa)
TakerFee - taxa de taker (0.0001 = 0.01%) Padrão na BYBIT: 0.001 = 0,1000%
SlippagePercent - slippage para ordens a mercado (0.0001 = 0.01%)
LimitOrderVolumeCheck - verificação de volume para a execução correta de ordens limitadas
(true/false). A ordem limitada é executada no máximo até o volume da vela atual: o testador "morde" da ordem o
volume disponível, e o restante espera a próxima vela (execução parcial/em etapas). Se desativado — a ordem
limitada é executada por inteiro ao tocar o preço.
FundingRate - Tamanho da taxa de funding (0.0001 = 0.01%)
FundingIntervalHours - Intervalo entre os pagamentos de funding, em horas (8)
maintenance_margin_rate - taxa de margem de manutenção como fração do nocional da posição (padrão
0.005 = 0,5%). Usada na linha Liquidation Level do gráfico de saldo quando a exchange não
fornece níveis de risk limit (hoje eles são baixados apenas da Bybit). Não afeta o teste em si.
Janela de negociação por estratégia: adicione "tester": { "StartDate": "...", "EndDate": "..." } ao
arquivo de configuração da estratégia. Antes de StartDate a estratégia não negocia; após
EndDate o testador cancela suas ordens e fecha sua posição uma vez. Qualquer campo pode ser omitido.
accounts - a conta do testador. É usado o primeiro item: dele vêm close_by_margin e
open_positions_limiter para todas as estratégias do teste. Chaves de API não são necessárias. Se a
seção não existir, é criada uma conta padrão (opções desligadas):
"accounts": [ { "name": "tester", "open_positions_limiter": 0, "close_by_margin": { "profit": 1.0,
"loss": 1.0, "size": 1.0, "each": false } } ]
Os arquivos de estratégia do testador ficam na pasta própria tester/settings_strategy, separada da
settings_strategy de produção. Todos os arquivos dela são testados; exchange.account é
ignorado. Na interface web do bot (Tester → Tabela) é possível adicionar, copiar, editar e excluir configurações
do testador, baixar dados, rodar o assistente ou a busca de parâmetros completa; a aba Arquivos é um gerenciador
de tester/runs, tester/report e tester/data, onde um snapshot de execução
pode ser editado e executado de novo.
UpdateData - atualizar (baixar o que falta) dos dados de mercado antes do teste (true/false)
use_logger - usar o logger. Se desativado, o teste fica mais rápido (true/false)
max_parallel_runs - número de execuções paralelas do testador ao varrer parâmetros. Cada execução
é iniciada como um processo separado. Se o desempenho do computador permitir, os processos podem ser
paralelizados sem perda de velocidade de cálculo. Com valor maior que 1, após o término de todas as execuções é
gerado automaticamente o relatório resumo do otimizador (mapas de calor / 3D surface).
single_mode - modo de teste separado (true/false). Se ativado, cada arquivo de configuração da
pasta tester/settings_strategy é testado separadamente, e não todos juntos no saldo compartilhado.
Prático para avaliar cada estratégia/par separadamente em uma única execução. A varredura
parameter_mining é aplicada a cada estratégia.
use_runs - executar testes a partir de snapshots salvos (true/false). Se ativado, o testador ignora
as configurações atuais e executa, um após o outro, todos os arquivos *.json da pasta
tester/runs. Cada arquivo é um snapshot completo (estratégias, configurações do programa e do testador,
incluindo a conta do testador em accounts). Este modo funciona apenas ao iniciar pelo console
(--run-tester): o botão Busca de parâmetros o ignora, e um snapshot individual é
executado na interface web com o botão Executar na aba "Arquivos". O próprio testador salva esses snapshots, run_snapshot_{name_comment}.json, na pasta
do relatório após uma varredura paralela — você pode copiá-los para tester/runs para repeti-los ou
colocar vários testes diferentes na fila.
shuffle_miner, monte_carlo, monte_carlo_seed - modos adicionais do
otimizador, descritos na seção "Otimizador".
arquivo: config_tester.json/report Configuração do conteúdo do relatório:
enable_html_report - gerar o relatório HTML (true/false). Se desativado — o HTML não é gerado,
apenas uma linha com as métricas resumidas é adicionada a reports_history.csv. Acelera muito as
varreduras grandes de parâmetros e economiza espaço em disco.
chart_ohlc_height - altura do gráfico OHLC em pixels
chart_balance_height - altura do gráfico de saldo em pixels
chart_position_height - altura do gráfico de tamanho das posições abertas em pixels
include_chart_ohlc - incluir o gráfico OHLC no relatório (true/false)
include_chart_balance - incluir o gráfico de saldo no relatório (true/false)
include_chart_position - incluir o gráfico de tamanho das posições abertas no relatório
(true/false)
include_settings - incluir as configurações das estratégias e os parâmetros do testador no
relatório (true/false)
include_trades_table - incluir as tabelas com a lista de operações de cada estratégia
(true/false)
include_summary_table - incluir a tabela resumo de todas as estratégias: volume negociado, taxas
etc. (true/false)
include_monthly_returns_heatmap - incluir o mapa de calor do retorno mensal (true/false)
include_position_stats - incluir as estatísticas das posições abertas: tamanho médio e máximo das
posições abertas em % do saldo Margin (true/false)
enable_timing_logs - exibir no console o tempo de geração de cada etapa do relatório. Útil para
diagnóstico, se os relatórios demoram para ser gerados (true/false)
Otimizador
(varredura de parâmetros)
O otimizador executa o teste automaticamente muitas vezes, cada vez com uma nova combinação de valores dos
parâmetros escolhidos. O resultado de cada execução é gravado como uma linha separada na tabela resumo
tester/report/{name_comment}/reports_history.csv: as métricas do teste mais colunas com os valores
dos parâmetros varridos. Ordenando-a, é fácil encontrar as melhores combinações.
arquivo: config_tester.json/parameter_mining Configuração do otimizador (varredor
de parâmetros):
Por padrão é uma lista vazia [] — um teste único normal. A lista é preenchida com objetos como
{"name": "nome_do_parametro", "start": 1, "end": 10, "step": 0.5, "values": []}. Cada objeto é um
parâmetro varrido.
name - caminho do parâmetro a varrer. Você pode informar qualquer configuração do bot. O caminho
começa com um dos 4 tipos de configuração:
1) settings — configurações de estratégia (arquivos .json na pasta
tester/settings_strategy). Aqui configuramos: o par de trading, o timeframe, o gerenciamento do depósito e
qual estratégia roda com quais configurações.
Exemplo: settings[*].mrs2.ma_long.type - varre o parâmetro type da ordem de abertura
da estratégia mrs2
2) account — a conta do testador (a seção accounts do
config_tester.json). Aqui configuramos o take profit geral da conta pelo saldo de margem, ou o
limitador do número de posições abertas simultaneamente.
Exemplo: account[*].close_by_margin.profit - varre o parâmetro profit da opção
close_by_margin
3) settings_program — configurações gerais do programa do bot (arquivo
settings_program.json). Aqui configuramos o multiplicador geral do lote
risk_multiplier.
Exemplo: settings_program.risk_multiplier
4) config_tester — configurações do próprio testador (arquivo
config_tester.json). Por exemplo, é possível rodar testes com diferentes níveis de taxa ou de
slippage.
Exemplo: config_tester.MakerFee
Escolha de uma estratégia/conta específica. Entre colchetes indica-se a quais arquivos aplicar o
parâmetro:
settings[*] — a todos os arquivos de configuração de uma vez
settings[0] — apenas ao primeiro arquivo (numeração a partir de 0, na ordem de carregamento)
settings[my_set_btc] — apenas ao arquivo cujo campo name é igual a
my_set_btc
O mesmo funciona para account[...] e para listas aninhadas dentro das configurações (por exemplo
[*], [0] em uma lista de ordens).
start - valor inicial do parâmetro
end - valor final do parâmetro (inclusive). Também é possível varrer em ordem decrescente, se
start > end
step - passo de variação do parâmetro
values - lista explícita de valores para varrer. Se a lista não estiver vazia,
start/end/step são ignorados. Os valores são escritos como strings e
convertidos automaticamente para o tipo do parâmetro: texto, números ("5", "10", "25"),
true/false (["true", "false"]) e listas de opções (enum).
Por exemplo, para o tipo de média móvel, os valores disponíveis são:
["SMA", "EMA", "GMA", "HARMONIC", "TEMA", "DEMA", "ZLEMA", "WMA", "VWMA", "RMA", "EHMA", "THMA", "HMA", "DMA", "ATR", "H", "L", "SMA_KALMAN", "EMA_KALMAN", "GMA_KALMAN", "HARMONIC_KALMAN", "TEMA_KALMAN", "DEMA_KALMAN", "ZLEMA_KALMAN", "WMA_KALMAN", "VWMA_KALMAN", "RMA_KALMAN", "EHMA_KALMAN", "THMA_KALMAN", "HMA_KALMAN", "DMA_KALMAN", "ATR_KALMAN", "H_KALMAN", "L_KALMAN"]
Para a fonte de preço:
["open", "high", "low", "close", "hl2", "hlc3", "ohlc4", "hlcc4", "oc2"].
Para varrer uma lista de pares de trading - veja o Exemplo 1.
Verificação dos nomes. Antes de iniciar, o testador verifica cada name. Se não for
encontrado um parâmetro com esse caminho (erro de digitação, estratégia inexistente etc.), é exibido no console
o aviso [MINER] Обнаружены невалидные parameter_mining.name ("parameter_mining.name inválido
encontrado"), e esse parâmetro não é aplicado — os testes rodam com o valor original. Sempre confira o console
na primeira execução de uma varredura.
O número de execuções é o produto do número de valores de todos os parâmetros. Se você indicar dois
parâmetros para varrer, por exemplo de 1 a 10 com passo 1, serão feitas 100! execuções (10 variantes do
primeiro parâmetro × 10 variantes do segundo parâmetro). Os resultados de todos os testes são salvos como
relatórios html separados e na tabela resumo reports_history.csv.
Dicas para uma varredura grande:
— desative os relatórios HTML (report.enable_html_report = false) e o logger
(use_logger = false) — isso acelera muito as execuções e economiza espaço em disco;
— aumente max_parallel_runs de acordo com o número de núcleos do processador;
— se houver combinações demais, use monte_carlo (veja abaixo).
Modos adicionais de varredura (arquivo: config_tester.json):
single_mode - cada arquivo de configuração de tester/settings_strategy é testado
separadamente, e toda a varredura parameter_mining é executada para cada um deles. Por exemplo, 5
arquivos de configuração × 20 combinações = 100 execuções. Prático quando é preciso ajustar os parâmetros de
cada par de forma independente, e não do portfólio.
shuffle_miner - varredura de pares de trading sem repetição entre estratégias (true/false).
Funciona quando a pasta tester/settings_strategy tem vários arquivos de configuração e
parameter_mining tem um parâmetro do tipo settings[*].... (por exemplo
settings[*].basic.symbol). Em vez de dar a todas as estratégias o mesmo valor, o testador
distribui a elas valores diferentes da lista e percorre todas as combinações únicas. Exemplo: 3 arquivos
de configuração e 10 pares em values → C(10,3) = 120 execuções, em cada uma das quais as
estratégias operam pares diferentes. Permite encontrar o melhor conjunto de pares para um portfólio no saldo
compartilhado.
monte_carlo - limitar o número de execuções por amostragem aleatória (0 = desativado). Se o número
total de combinações da varredura for maior que esse valor, o testador escolhe monte_carlo
combinações aleatórias em vez da varredura completa. Útil quando há milhões de combinações: é possível
"sondar" rapidamente o espaço de parâmetros e depois estreitar os intervalos em torno dos melhores
resultados.
monte_carlo_seed - valor inicial (seed) do gerador de números aleatórios para o Monte Carlo (por
padrão 42). Com o mesmo seed a amostra se repete; altere-o para obter outra amostra.
arquivo: config_tester.json/report_optimizer Relatório resumo do
otimizador:
Após uma varredura paralela (max_parallel_runs > 1) o testador gera automaticamente, a partir
de reports_history.csv, o relatório report_optimizer_*.html. Também é possível
gerá-lo manualmente — por exemplo após uma varredura sequencial, ou para refazê-lo com outros
z_parameters: o arquivo run_report_optimizer.bat (flag
--run-report-optimizer) usa a pasta tester/report/{name_comment}, ou a pasta passada
como primeiro argumento.
— se foram varridos 2 ou mais parâmetros numéricos — mapas de calor e gráficos 3D surface. Nos eixos X e Y
ficam os dois parâmetros numéricos com mais valores, no eixo Z — as métricas escolhidas;
— se foi varrido 1 parâmetro numérico — gráficos de linha das métricas em função desse parâmetro;
— se pares de trading foram varridos ao mesmo tempo — os gráficos são gerados separadamente para cada par;
— se não houver dados para gerar gráficos — o relatório mostra uma tabela com todos os resultados.
chart_height - altura dos gráficos do otimizador em pixels (550)
z_parameters - lista de métricas para o eixo Z. Por padrão
["TotalPnLPercent", "MaxDrawdownPercent", "ProfitFactor"]. É possível usar quaisquer colunas
numéricas de reports_history.csv: TotalPnL, TotalPnLPercent,
FinalBalance, TotalTrades, WinRate, MaxDrawdown,
MaxDrawdownPercent, TotalFees, PositionAvgPercent,
PositionMaxPercent, ProfitFactor.
Exemplo 1: varredura de pares de trading
parameter_mining é uma lista ([]), na qual são adicionados, separados por vírgula, objetos
de varredura ([{}, {}]).
Para varrer pares de trading, é usado o parâmetro do tipo string values, enquanto os campos numéricos
start/end/step são definidos como 1.0 (eles são ignorados quando
values não está vazio).
O parâmetro settings[*].basic.symbol será aplicado a todos os arquivos de configuração da pasta
tester/settings_strategy:
"parameter_mining": [
{
"name": "settings[*].basic.symbol",
"start": 1.0,
"end": 1.0,
"step": 1.0,
"values": [
"1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
"1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
"4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
]
}
]
Resultado: o testador vai rodar o teste, um de cada vez, para cada um dos 10 pares.
Exemplo 2: varredura de vários parâmetros ao mesmo tempo
Vamos adicionar, além da varredura de pares, uma varredura do valor de % do take-profit — de 0% a 10% em passos
de 0.5 (21 valores no total).
Número de combinações: 10 pares × 21 valores = 210 execuções.
"parameter_mining": [
{
"name": "settings[*].basic.symbol",
"start": 1.0,
"end": 1.0,
"step": 1.0,
"values": [
"1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
"1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
"4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
]
},
{
"name": "settings[*].options.take_profit_long",
"start": 0,
"end": 10.0,
"step": 0.5,
"values": []
}
]
Exemplo 3: configurando uma varredura
Demonstração em vídeo
Todas as estratégias do bot também estão disponíveis em formato PineScript para testes no TradingView.