Otimizar um cBot¶
O comando optimize explora diferentes valores dos parâmetros de um cBot para encontrar as combinações com os melhores resultados de acordo com os critérios escolhidos. Executa a mesma pesquisa genética ou em grelha que a aplicação cTrader para desktop, mas a partir do terminal e através de um ficheiro JSON com os parâmetros. É o equivalente, para a otimização, ao comando de testes de verificação.
Âmbito ¶
O comando optimize otimiza os parâmetros dos cBots. Os indicadores e os plugins têm os seus próprios comandos (indicator calculate, indicator history, create, build) e não estão incluídos na otimização.
Pré-requisitos ¶
- Ter o cTrader CLI instalado e conseguir iniciar sessão.
- O cBot deve estar exportado como ficheiro
.algoe compilado para .NET 8. - Um ficheiro de parâmetros que defina os parâmetros a explorar.
Nota
O comando optimize só está disponível na edição local do cTrader CLI. Não está incluído nas versões internas ou na nuvem.
O comando optimize ¶
ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]
O caminho para o ficheiro .algo é o primeiro argumento. A opção --params é obrigatória. O intervalo de tempo de base tem de ser definido através de --timeframe ou no ficheiro de parâmetros. Se não for definido em nenhum dos dois, o comando termina com um erro.
Opções de otimização ¶
A única opção obrigatória é --params. As opções facultativas mais comuns, utilizadas nos exemplos seguintes, são --timeframe, --method, --criteria, --optres e --passes-dir.
Convém conhecer algumas opções antes de começar:
--method–genetic(predefinido) ougrid. Escolhagridse houver poucas combinações de parâmetros e quiser testar todas. Escolhageneticse houver muitas combinações e uma pesquisa orientada puder ser mais rápida.--cores– número de processos de trabalho em paralelo que executam os testes de verificação de cada execução de otimização. Cada processo utiliza uma thread da CPU, pelo que a otimização ocupa aproximadamente tantas threads quantas as indicadas neste valor. São aceites números inteiros iguais ou superiores a 1. Por predefinição, o valor corresponde a metade do número de processadores, mais um. Reduza o valor num VPS de pequena dimensão para deixar recursos disponíveis para outras tarefas. Numa máquina dedicada, pode aumentá-lo para distribuir a pesquisa genética por mais threads.--auto-select-best– seleciona automaticamente a melhor execução no final da otimização, para que o ficheiro.cbotsetcom os parâmetros de melhor desempenho fique disponível sem passos adicionais.
Nota
O comando optimize utiliza --timeframe, e não --period. Os comandos run e backtest continuam a utilizar --period. A opção --period é rejeitada por optimize como opção desconhecida.
O ficheiro de parâmetros ¶
O ficheiro indicado através de --params é um objeto JSON que contém uma matriz parameters. Tem a mesma estrutura do ficheiro exportado pela interface de otimização da aplicação cTrader para desktop, pelo que pode utilizar diretamente um ficheiro exportado dessa aplicação.
{
"parameters": [
{ "Name": "SlowPeriods", "Optimize": true, "Min": "5", "Max": "50", "Step": "5" },
{ "Name": "StopLossPips", "Optimize": true, "Min": "10", "Max": "60", "Step": "5" },
{ "Name": "MAType", "Optimize": true, "Values": ["0", "1", "2"] },
{ "Name": "MySymbol", "Optimize": true, "Values": ["EURUSD", "GBPUSD"] }
]
}
Regras dos campos ¶
- O campo
Nameé obrigatório e tem de corresponder ao nome de uma propriedade do cBot. Executectrader-cli metadata <path-to-algo>para consultar os nomes das propriedades disponíveis. Se um nome não constar dos metadados do cBot, essa situação é registada e o parâmetro é ignorado. A otimização prossegue com os restantes parâmetros. - Se
Optimizetiver o valortrue, o parâmetro é incluído na pesquisa. Se tiver o valorfalse, o parâmetro permanece fixo. - Para os parâmetros definidos por intervalos, como números inteiros ou de vírgula flutuante, são necessários os campos
Min,MaxeStepse o parâmetro tiver de variar. - Para os parâmetros com valores discretos, como enumerações ou símbolos, é necessária uma matriz
Valuesnão vazia se o parâmetro tiver de variar. - O campo
ParameterTypeé facultativo. Se for omitido, o tipo é determinado através dos metadados do cBot, por correspondência comName.
Fixar um parâmetro num único valor ¶
Para manter um parâmetro fixo, inclua-o com Optimize: false e o respetivo Value:
{ "Name": "MAType", "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }
Aviso
O ficheiro de parâmetros é a referência principal. Antes de o aplicar, o cTrader CLI repõe todas as definições de parâmetros, pelo que só são explorados os que estiverem assinalados com Optimize: true. Um parâmetro totalmente ausente do ficheiro mantém o valor predefinido, mesmo que o cBot o tenha configurado, por predefinição, para otimização. Inclua um parâmetro com Optimize: true para o adicionar à otimização.
Otimizar o intervalo de tempo principal ¶
O comando optimize permite explorar diferentes intervalos de tempo principais, além dos parâmetros do cBot. O intervalo de tempo principal pode ser definido de duas formas, tendo --timeframe prioridade.
--timeframe <tf>– um único valor fixa o intervalo de tempo principal; vários valores separados por vírgulas permitem explorar diferentes intervalos de tempo.- Ficheiro de parâmetros – um ficheiro exportado da aplicação para desktop já inclui um parâmetro sintético de intervalo de tempo para este efeito.
O intervalo de tempo de base dos dados corresponde ao valor único, ao valor fixo ou ao menor dos valores explorados.
Compatibilidade entre intervalos de tempo e modos de dados ¶
Os intervalos de tempo principais que sejam explorados ou fixados têm de ser compatíveis com o --data-mode escolhido.
| Modo de dados | Intervalos de tempo principais válidos |
|---|---|
open | Intervalos de tempo do mesmo tipo que sejam múltiplos exatos do menor intervalo de tempo selecionado. |
m1 ou m1-csv | Qualquer intervalo de tempo baseado no tempo; os tipos não temporais, como Renko ou barras Range, são rejeitados. |
ticks | Qualquer intervalo de tempo que não seja personalizado. |
Nota
Uma combinação inválida interrompe o comando antes de carregar os dados e apresenta os valores que causaram o erro.
Critérios ¶
Cada elemento de --criteria associa uma métrica de desempenho a uma direção max ou min, por exemplo NetProfit:max. A tabela seguinte apresenta todos os nomes de métricas suportados e o que medem.
| Métrica | O que mede |
|---|---|
NetProfit | Lucro líquido ou perda líquida final, na moeda da conta |
ProfitFactor | Lucro bruto dividido pela perda bruta |
MaxEquityDrawdownPercentages | Maior queda percentual do capital entre um máximo e um mínimo |
MaxBalanceDrawdownPercentages | Maior queda percentual do saldo entre um máximo e um mínimo |
MaxEquityDrawdown | Maior queda absoluta do capital, na moeda da conta |
MaxBalanceDrawdown | Maior queda absoluta do saldo, na moeda da conta |
WinningTrades | Número de negociações fechadas com lucro |
LosingTrades | Número de negociações fechadas com perda |
TotalTrades | Número total de negociações fechadas |
AverageTrade | Lucro líquido dividido pelo número de negociações fechadas |
Para maximizar o lucro líquido e, ao mesmo tempo, minimizar a maior queda do capital:
--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"
Para definir uma classificação personalizada, utilize --fitness. O método GetFitness do cBot devolve uma pontuação; a otimização mantém as execuções com as pontuações mais elevadas. --fitness e --criteria são mutuamente exclusivos: especifique apenas um deles.
Opções do contexto de teste ¶
optimize reutiliza as opções do contexto de teste de backtest. A tabela seguinte apresenta as opções aceites pela CLI atual, a respetiva função e, quando relevante, as diferenças entre os dois comandos.
| Opção | Função | Disponibilidade |
|---|---|---|
--account | Número da conta de negociação. | Ambos |
--symbol | Símbolo a utilizar no teste. | Ambos |
--start | Data e hora de início do período de teste. | Ambos |
--end | Data e hora de fim do período de teste. | Ambos |
--balance | Saldo inicial da simulação. | Ambos |
--data-mode | open, m1, m1-csv, tick-csv ou ticks. | Ambos |
--data-file | Caminho para um ficheiro CSV para m1-csv ou tick-csv. | Ambos |
--commission | Valor da comissão por negociação. | Ambos |
--spread | Spread em pips. | Ambos |
--precise-conversion | Utilizar conversão precisa para pares de moedas cruzadas. | Ambos |
--timeframe | Intervalo de tempo de base para a pesquisa de parâmetros. | Apenas optimize |
--period | Intervalo de tempo de base para a execução. | Apenas backtest |
--report | Caminho para guardar um relatório HTML. | Apenas backtest |
--report-json | Caminho para guardar um relatório JSON. | Apenas backtest |
Nota
As opções de relatório não se aplicam a optimize. Utilize antes --optres e --passes-dir para guardar os resultados.
Exemplo ¶
ctrader-cli optimize "C:/test/Sample Trend cBot.algo" \
--params=C:/test/optimize-params.json \
--account=1234567 --symbol=EURUSD --timeframe=h1,h2 \
--start="01/01/2025" --end="01/02/2025" \
--balance=100000 --data-mode=open --commission=30 --spread=2 \
--method=grid \
--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min" \
--auto-select-best \
--optres=C:/test/result.optres \
--passes-dir=C:/test/result-passes \
--ctid=letstrade --pwd-file=C:/test/password.pwd
Saída ¶
Durante a execução, optimize apresenta continuamente o progresso no terminal:
Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
- Resumo – no final da otimização, o cTrader CLI apresenta no terminal um resumo com o número total de execuções, o tempo decorrido e a melhor execução com as respetivas estatísticas.
- Ficheiro de resultados – se especificar
--optres, o cTrader CLI guarda os resultados completos num ficheiro JSON.optresque lista todas as execuções. Este ficheiro utiliza o mesmo formato dos resultados de otimização da aplicação para desktop, pelo que pode abri-lo ou importá-lo na respetiva interface de otimização. - Relatórios por execução – se especificar
--passes-dir, o cTrader CLI guarda os relatórios de cada execução nessa diretoria, com uma subpasta por execução que contém ficheiros.html,.txt,.jsone.cbotset. O ficheiro.cbotsetapresenta os valores exatos dos parâmetros utilizados nessa execução.
Se não especificar --optres nem --passes-dir, a otimização termina e apresenta apenas o resumo.
Nota
O comando optimize não gera um relatório HTML global. Os ficheiros HTML de cada execução são, no entanto, guardados em --passes-dir se especificar essa opção.
Verificar se a otimização foi aplicada corretamente ¶
Após a execução, verifique se a pesquisa percorreu os parâmetros pretendidos.
- Abra um ficheiro
.cbotsetde uma execução em--passes-dire confirme que os parâmetros otimizados variam entre execuções, enquanto os parâmetros fixos ou omitidos se mantêm inalterados. - Se tiver explorado vários intervalos de tempo, verifique o valor
Chart.Periodno ficheiro.cbotsetde cada execução. Deve corresponder a um dos intervalos de tempo selecionados. - Abra o ficheiro
.optresou importe-o na interface de otimização da aplicação para desktop para analisar a configuração e todas as execuções em conjunto.
Validação e erros comuns ¶
Cada linha da tabela seguinte apresenta um sintoma, a causa provável, o código de saída devolvido pelo cTrader CLI em caso de falha e a ação a tomar. O cTrader CLI devolve um código de saída diferente de zero para todos os erros de validação. Assim, um script pode interromper-se no primeiro erro sem ter de interpretar a mensagem.
Na tabela, o código de saída corresponde ao valor devolvido pelo cTrader CLI à shell. Os códigos numéricos exatos não estão publicados. Por isso, non-zero indica uma falha sem um código específico publicado, enquanto unknown indica um erro interno que exige mudar de versão ou contactar o suporte.
| Sintoma | Causa provável | Código de saída | Ação a tomar |
|---|---|---|---|
Erro de validação: falta --params | O ficheiro JSON de parâmetros não foi fornecido. | non-zero | Especifique --params=<path>. |
| Erro de validação: intervalo de tempo desconhecido | O valor de --timeframe não corresponde a nenhum identificador reconhecido. | non-zero | Execute ctrader-cli periods e utilize um dos identificadores apresentados. |
| Erro de validação: intervalo de tempo principal inválido | Um intervalo de tempo não é compatível com o --data-mode selecionado. | non-zero | Escolha outro intervalo de tempo ou outro --data-mode. |
| Erro de validação: pares de critérios malformados | O nome de uma métrica está incorreto ou a direção não é max nem min. | non-zero | Utilize um dos nomes de métricas suportados com max ou min. |
| Erro de validação: métrica de desempenho desconhecida | Um dos nomes especificados em --criteria não consta da lista de métricas suportadas. | non-zero | Utilize um dos nomes de métricas suportados indicados em Criteria. |
Erro de validação: valor desconhecido para --method | O valor de --method não é genetic nem grid. | non-zero | Utilize --method=genetic (predefinido) ou --method=grid. |
--fitness e --criteria especificados em simultâneo | Estas duas opções são incompatíveis. | non-zero | Especifique --fitness ou --criteria, mas não ambas. |
optimize indisponível | Está a ser utilizada a edição interna ou na nuvem da CLI. | unknown | Mude para a edição local destinada aos utilizadores. |