PáginasParâmetros de entrada · 14 / 29
Parâmetros de entrada
Os parâmetros de entrada permitem transformar valores dentro do código da sua estratégia (por exemplo, um período de retrospectiva ou um número máximo de posições compradas abertas) em controles que você define nas caixas de execução, sem editar o arquivo toda vez que quiser testar um novo número. A mesma estrutura params se aplica a Run backtest (Backtests), Bulk forward (AutoTrading / QuantCloud) e aos parâmetros do algoritmo no Chart forward test. O Test é descrito em Execução de código; as varreduras de várias execuções são tratadas em Otimização. Os params não são preenchidos em um Run simples.
Esta página cobre as duas metades desse fluxo:
- Declarar
paramsno seu arquivo Python - Ligar esses params às caixas de execução para poder defini-los, salvá-los e otimizá-los (veja também Predefinições de execução (.qcs))
Como funciona, em resumo
- No seu arquivo de estratégia, você importa um objeto especial
paramse lê atributos dele (por exemplo,params.PERIOD). - O IDE analisa o seu código para descobrir esses nomes e os lista na caixa de execução (Test, bulk forward ou chart forward).
- Você informa um tipo e um valor para cada nome na caixa de diálogo (ou define uma varredura ao otimizar).
- Quando você inicia a execução, o mecanismo preenche
paramscom os seus valores antes de o seu script ser executado, de modo que os valores estão disponíveis no instante em que o seu arquivo é importado.
As entradas são preenchidas nas caixas Run backtest, Bulk forward e Chart forward test. Elas não são preenchidas em um Run simples (
/ws/run) — use valores padrão comhasattrse quiser que o mesmo arquivo funcione das duas formas. Veja Ciclo de vida da estratégia para saber quando osparamsficam visíveis para os callbacks.
Declarando params na sua estratégia
Adicione uma única importação e referencie cada nome de parâmetro como atributo de params:
from quantcraft.inputs import params
PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14
MAX_OPEN_LONGS = params.MAX_OPEN_LONGS if hasattr(params, "MAX_OPEN_LONGS") else 3
USE_FILTER = params.USE_FILTER if hasattr(params, "USE_FILTER") else True
LABEL = params.LABEL if hasattr(params, "LABEL") else "default"Algumas regras se aplicam:
- Escreva como
from quantcraft.inputs import params. A expressão regular de descoberta também aceita as formas mais antigasfrom quantcraft.inputs_module import paramsefrom ide.inputs_module import paramspara que os scripts existentes continuem funcionando — veja Referência — mas o código novo deve usarquantcraft.inputs. Deve ser a formafrom … import params:import quantcraft.inputs as inpnão é detectado, então a aba Script não aparecerá. - O executor aplica os valores da caixa antes de o seu script de entrada ser carregado, o que é suficiente para
from quantcraft.inputs import paramsno arquivo de estratégia. paramsé um único objeto “vivo”. Cada execução troca os valores por trás dele, então ele sempre mostra as entradas desta execução — inclusive em módulos auxiliares que o importaram durante uma execução forward anterior, e separadamente para execuções forward ativas ao mesmo tempo. Uma execução iniciada sem entradas vê umparamsvazio, nunca os valores da execução anterior.- Cada nome de parâmetro deve ser um identificador Python válido (
A–Z,a–z,0–9,_, sem começar por dígito); qualquer outro é ignorado. - Cada entrada deve incluir um token literal
params.NAMEno código-fonte para que o IDE possa descobri-la. O cliente procura por expressão regularparams.<identificador>; nomes referenciados apenas viagetattr(params, "NAME", default)não são descobertos e não aparecerão na aba Script. Ogetattr(params, "NAME", default)funciona em tempo de execução — basta manter umparams.NAMEliteral na mesma linha para a descoberta. - Você pode usar
params.NAMEem qualquer lugar do arquivo — no nível superior, dentro deon_init, dentro deon_baretc. Cada referência única se torna uma entrada sobre a qual a caixa de diálogo perguntará. - Não há esquema no próprio módulo — os nomes que você referencia são o esquema.
Evite (o formulário não listará o parâmetro):
MA_PERIOD = getattr(params, "MA_PERIOD", 24) # no params.MA_PERIOD token
PERIOD = 14 # no params referenceIdiomas comuns:
def on_init():
global lookback
lookback = int(params.PERIOD)
def on_bar(bar_index, bar, fundamentals=None, symbol=None):
if bar.bars_back < lookback:
return
...Dica: leia o valor uma única vez para uma variável local/global para não pagar consultas de atributo a cada barra.
Ligando a caixa Test / backtest
Abra a caixa Test na barra de ferramentas do editor (o botão Test). Quando o seu arquivo declara entradas params.NAME, aparece uma aba Script com linhas de parâmetros e Optimize. O IDE já analisou o seu arquivo ativo em busca de referências params.NAME, então cada parâmetro usado aparece como uma linha.
Para cada linha você define:
| Coluna | O que você informa |
|---|---|
| Parameter | O nome (somente leitura — vem do seu código). |
| Type | Um entre int, float, str, bool (os aliases integer, number, boolean também são aceitos na comunicação). |
| Value | O valor a ser usado na execução. |
Observações sobre as opções de Type:
int/integer— números inteiros (por exemplo,14); separadores de milhar são aceitos (1,000→1000).float/number— decimais (por exemplo,0.5,1e-3); vírgulas em números são removidas.bool/boolean—true/false,yes/no,y/n,on/offe1/0(qualquer combinação de maiúsculas e minúsculas). Qualquer outro valor interrompe a execução cominvalid boolean: …. A caixa oferece True/False.str— texto livre, mantido como está (sem os espaços ao redor).
Ao iniciar o backtest, a caixa de diálogo empacota as suas linhas e as envia ao mecanismo. O mecanismo define os valores em params antes de o seu on_init() ser executado; assim:
from quantcraft.inputs import params
PERIOD = params.PERIOD # <- already filled by the time this line executesSe um nome de parâmetro não tiver linha na caixa de diálogo (você removeu a entrada, ou seu arquivo referencia um nome totalmente novo que você ainda não definiu), params não terá esse atributo e uma leitura direta de params.NAME levantará AttributeError. Adicione a linha na caixa de diálogo e execute novamente — ou use o padrão hasattr + valor padrão else mostrado acima (que ainda inclui o token params.NAME para a descoberta).
Os valores da sua caixa de diálogo são lembrados entre as execuções, então você não precisa digitá-los de novo toda vez. Salve e recarregue conjuntos completos de parâmetros com as Predefinições de execução (.qcs).
Otimizando parâmetros
Na aba Script, ative Optimize para executar a sua estratégia várias vezes com diferentes combinações de parâmetros. Escolha Brute force ou Genetic:
Força bruta
Para cada linha de parâmetro, a caixa de diálogo adiciona colunas Step e Max quando faz sentido:
int/float— defina uma grade discreta: valor inicial → passo → máximo.bool— tantotruequantofalsesão testados.str— mantido fixo (parâmetros de string não formam uma grade).
O mecanismo executa todas as combinações desses valores discretos e relata cada execução separadamente na visualização Test Results.
Útil para grades pequenas (alguns parâmetros com poucos valores cada). As combinações explodem rápido — mantenha o espaço de busca modesto.
Genético
Para espaços de busca maiores, mude para Genetic para deixar uma busca evolutiva encontrar boas combinações sem testar cada célula:
- Population size — número de combinações de parâmetros avaliadas a cada geração.
- Generations — quantas gerações executar (cada uma é uma população completa de backtests).
- Elitism — melhores indivíduos copiados sem alteração para a geração seguinte.
- Crossover rate (
0–1) — chance de dois pais produzirem um filho misto. - Mutation rate (
0–1) — chance de um gene saltar para outro valor. - Fitness metric — qual métrica otimizar (Sharpe, Sortino, retorno total etc.).
- Random seed (opcional) — reprodutibilidade da população e dos operadores.
Ambos os modos mostram o progresso ao vivo no painel de saída (uma barra de progresso no cabeçalho) e um botão Stop para encerrar uma execução longa.
Quando a otimização termina, a visualização Test Results mostra as execuções ordenadas pela sua métrica de aptidão, e você pode detalhar cada uma.
Dicas
-
Os nomes são descobertos a partir do seu arquivo: se uma linha não aparecer, confira as suas referências
params.NAMEe se você importaparamsdequantcraft.inputs(os caminhos mais antigosquantcraft.inputs_moduleeide.inputs_moduletambém são reconhecidos, para scripts existentes). -
Mantenha os nomes em UPPER_SNAKE_CASE — por convenção, eles são lidos como constantes no seu código.
-
Informe tipos adequados na caixa de diálogo para que a conversão faça o que você espera (por exemplo, não defina
intpara um valor como0.5). -
Booleanos não diferenciam maiúsculas de minúsculas —
True,true,1,yesvalem como verdadeiro. -
Use Optimize para buscas de parâmetros, não scripts do editor: a força bruta é exaustiva, a genética é para espaços maiores.
-
O Run simples não preenche os params: ao clicar em Run,
paramsnão é preenchido. Use valores padrão comhasattr(com um tokenparams.NAMEliteral) se quiser que o mesmo arquivo funcione tanto no Run quanto no Test:from quantcraft.inputs import params PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14 -
As execuções forward usam as mesmas regras de descoberta — as caixas bulk forward e chart forward procuram
params.NAMEdo mesmo modo que a caixa de backtest.

