Saltar a contenido

Optimizar un cBot

El comando optimize explora distintos valores de los parámetros de un cBot para encontrar las combinaciones que ofrecen mejores resultados según los criterios que elijas. Realiza la misma búsqueda genética o por cuadrícula que la aplicación de escritorio de cTrader, pero desde el terminal y utilizando un archivo JSON con la configuración de los parámetros. Es el equivalente del comando de backtesting para la optimización.

Alcance

El comando optimize optimiza los parámetros de los cBots. Los indicadores y plugins se gestionan mediante sus propios comandos (indicator calculate, indicator history, create, build) y no forman parte de la optimización.

Requisitos previos

  • Debes tener cTrader CLI instalado y poder iniciar sesión.
  • El cBot debe estar exportado como archivo .algo y compilado para .NET 8.
  • Un archivo de parámetros que defina qué parámetros se van a explorar.

Nota

El comando optimize solo está disponible en la edición local de cTrader CLI. No está incluido en las versiones internas ni en la versión en la nube.

El comando optimize

ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]

La ruta del archivo .algo es el primer argumento. La opción --params es obligatoria. El período de tiempo base debe especificarse mediante --timeframe o en el archivo de parámetros. Si no se define en ninguno de los dos, el comando se detiene con un error.

Opciones de optimización

Solo es obligatorio --params. Entre las opciones habituales que se muestran en los ejemplos siguientes están --timeframe, --method, --criteria, --optres y --passes-dir.

Conviene conocer algunas opciones antes de empezar:

  • --method – genetic (predeterminado) o grid. Elige grid cuando haya pocas combinaciones de parámetros y quieras probarlas todas; elige genetic cuando haya muchas y resulte más rápida una búsqueda guiada.
  • --cores – número de procesos de trabajo paralelos que ejecutan la fase de backtesting de cada pase. Cada proceso utiliza un hilo de CPU, por lo que la ejecución emplea aproximadamente tantos hilos como indique el valor especificado. Se aceptan números enteros a partir de 1. Por defecto, se utiliza la mitad del número de procesadores más uno. Reduce el valor en un VPS pequeño para dejar recursos disponibles a otras tareas, o auméntalo en un equipo dedicado para distribuir la búsqueda genética entre más hilos.
  • --auto-select-best – selecciona automáticamente el mejor pase al finalizar la optimización, de modo que tengas listo el archivo .cbotset con mejores resultados sin pasos adicionales.

Nota

El comando optimize utiliza --timeframe, no --period. Los comandos run y backtest siguen utilizando --period. Si pasas --period a optimize, se rechazará como opción desconocida.

El archivo de parámetros

El archivo indicado mediante --params es un objeto JSON con un array parameters. Tiene la misma estructura que exporta la interfaz de optimización de la aplicación de escritorio de cTrader, por lo que puedes usar directamente un archivo exportado desde ella.

{
  "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"] }
  ]
}

Reglas de los campos

  • Name es obligatorio y debe coincidir con el nombre de una propiedad del cBot. Ejecuta ctrader-cli metadata <path-to-algo> para consultar los nombres de las propiedades disponibles. Si un nombre no aparece en los metadatos del cBot, se registra y se omite; la optimización continúa con los demás parámetros.
  • Si Optimize tiene el valor true, el parámetro se incluye en la búsqueda. Si tiene el valor false, el parámetro permanece fijo.
  • Los parámetros de rango que se optimizan, como los números enteros y los de coma flotante, requieren Min, Max y Step.
  • Los parámetros de valores discretos que se optimizan, como las enumeraciones y los símbolos, requieren un array Values que no esté vacío.
  • ParameterType es opcional. Si se omite, el tipo se determina mediante los metadatos del cBot, buscando una coincidencia con Name.

Fijar un parámetro en un único valor

Para mantener fijo un parámetro, inclúyelo con Optimize: false y su Value:

{ "Name": "MAType",      "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }

Advertencia

El archivo de parámetros es la referencia que prevalece. Antes de aplicarlo, cTrader CLI restablece todos los parámetros, de modo que solo se exploran aquellos que figuran con Optimize: true. Los parámetros que no figuren en el archivo conservarán su valor predeterminado, aunque el cBot los tenga configurados para optimizarse por defecto. Incluye un parámetro con Optimize: true para incorporarlo a la optimización.

Optimizar el período de tiempo principal

El comando optimize permite explorar distintos períodos de tiempo principales, además de los parámetros del cBot. El período de tiempo principal puede proceder de dos fuentes, y --timeframe tiene prioridad.

  • --timeframe <tf> – un único valor fija el período de tiempo principal; varios valores separados por comas permiten explorar distintos períodos de tiempo.
  • Archivo de parámetros – los archivos exportados desde la aplicación de escritorio ya incluyen un parámetro sintético de período de tiempo para este fin.

El período de tiempo base de los datos será el valor único, el valor fijado o el más corto de los valores que se exploran.

Compatibilidad entre períodos de tiempo y modos de datos

Los períodos de tiempo principales que se exploran o se fijan deben poder cargarse con el --data-mode elegido.

Modo de datos Períodos de tiempo principales válidos
open Períodos de tiempo del mismo tipo que sean múltiplos exactos del período de tiempo más corto seleccionado.
m1 o m1-csv Cualquier período de tiempo basado en unidades temporales; se rechazan los tipos no temporales, como Renko y las barras de rango.
ticks Cualquier período de tiempo que no sea personalizado.

Nota

Si una combinación no es válida, el comando se detiene antes de cargar datos y muestra los valores que provocaron el error.

Criterios

Cada elemento de --criteria vincula un indicador de rendimiento con la dirección max o min, por ejemplo NetProfit:max. La siguiente tabla enumera todos los nombres de indicadores admitidos y qué mide cada uno.

Indicador Qué mide
NetProfit Beneficio o pérdida final en la divisa de la cuenta
ProfitFactor Beneficio bruto dividido entre la pérdida bruta
MaxEquityDrawdownPercentages Mayor caída porcentual del capital entre un máximo y un mínimo
MaxBalanceDrawdownPercentages Mayor caída porcentual del saldo entre un máximo y un mínimo
MaxEquityDrawdown Mayor caída absoluta del capital, expresada en la divisa de la cuenta
MaxBalanceDrawdown Mayor caída absoluta del saldo, expresada en la divisa de la cuenta
WinningTrades Número de operaciones cerradas con beneficio
LosingTrades Número de operaciones cerradas con pérdida
TotalTrades Número total de operaciones cerradas
AverageTrade Beneficio neto dividido entre el número de operaciones cerradas

Para maximizar el beneficio neto y minimizar al mismo tiempo la reducción máxima del capital:

--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"

Para definir una clasificación personalizada, utiliza --fitness. El método GetFitness del cBot devuelve una puntuación; la optimización conserva los pases con los valores más altos. --fitness y --criteria son incompatibles entre sí: indica solo uno de los dos.

Opciones del entorno de pruebas

optimize reutiliza las opciones del entorno de pruebas de backtest. La siguiente tabla muestra las opciones que admite la versión actual de la CLI, qué configura cada una y, cuando procede, las diferencias entre ambos comandos.

Opción Finalidad Disponibilidad
--account Número de la cuenta de operaciones. Ambos
--symbol Símbolo con el que se va a realizar la prueba. Ambos
--start Fecha y hora de inicio del intervalo de prueba. Ambos
--end Fecha y hora de finalización del intervalo de prueba. Ambos
--balance Saldo inicial de la simulación. Ambos
--data-mode open, m1, m1-csv, tick-csv o ticks. Ambos
--data-file Ruta de un archivo CSV para m1-csv o tick-csv. Ambos
--commission Importe de la comisión por operación. Ambos
--spread Spread en pips. Ambos
--precise-conversion Utilizar una conversión precisa para los pares de divisas cruzados. Ambos
--timeframe Período de tiempo base para la búsqueda. Solo optimize
--period Período de tiempo base para la ejecución. Solo backtest
--report Ruta para guardar un informe HTML. Solo backtest
--report-json Ruta para guardar un informe JSON. Solo backtest

Nota

Las opciones de informes no se aplican a optimize. Para guardar los resultados, utiliza --optres y --passes-dir.

Ejemplo

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

Salida

Durante la ejecución, optimize muestra el progreso continuamente en el terminal:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • Resumen – al finalizar, cTrader CLI muestra en el terminal un resumen con el número total de pases, el tiempo transcurrido y el mejor pase con sus estadísticas.
  • Archivo de resultados – al indicar --optres, cTrader CLI guarda los resultados completos en un archivo JSON .optres que enumera todos los pases. Este archivo utiliza el mismo formato que los resultados de optimización de la aplicación de escritorio, por lo que puedes abrirlo o importarlo en su interfaz de optimización.
  • Informes por pase – al indicar --passes-dir, cTrader CLI guarda los informes de cada pase en ese directorio: una subcarpeta por pase, con archivos .html, .txt, .json y .cbotset. El archivo .cbotset muestra los valores exactos de los parámetros utilizados en ese pase.

Si no indicas --optres ni --passes-dir, la optimización termina y solo se muestra el resumen.

Nota

El comando optimize no genera un informe HTML conjunto. Los archivos HTML de cada pase sí se guardan en --passes-dir cuando indicas esta opción.

Comprobar que la optimización se ha aplicado correctamente

Después de ejecutar la optimización, comprueba que se hayan explorado los parámetros previstos.

  1. Abre un archivo .cbotset de un pase dentro de --passes-dir y comprueba que los parámetros optimizados cambian de un pase a otro, mientras que los parámetros fijados y los omitidos permanecen constantes.
  2. Si has explorado distintos períodos de tiempo, comprueba el valor Chart.Period en el archivo .cbotset de cada pase. Debe coincidir con uno de los períodos de tiempo seleccionados.
  3. Abre el archivo .optres o impórtalo en la interfaz de optimización de la aplicación de escritorio para revisar conjuntamente la configuración y todos los pases.

Validación y errores habituales

Cada fila de la siguiente tabla muestra un síntoma, su causa probable, el código de salida que devuelve cTrader CLI cuando se produce el error y qué hacer a continuación. cTrader CLI devuelve un código de salida distinto de cero ante cualquier error de validación, de modo que un script puede detenerse en el primer error sin tener que interpretar el mensaje.

En la tabla, «Código de salida» se refiere al valor que cTrader CLI devuelve al shell. No se publican códigos numéricos concretos. Por eso, non-zero indica que el comando ha fallado sin un código específico; unknown indica un error interno que requiere cambiar de versión o contactar con soporte.

Síntoma Causa probable Código de salida Siguiente paso
Error de validación: falta --params No se ha proporcionado el archivo JSON de parámetros. non-zero Indica --params=<path>.
Error de validación: período de tiempo desconocido El valor de --timeframe no coincide con ningún identificador reconocido. non-zero Ejecuta ctrader-cli periods y utiliza uno de los identificadores de la lista.
Error de validación: período de tiempo principal no válido Un período de tiempo no se puede cargar con el --data-mode elegido. non-zero Elige otro período de tiempo u otro --data-mode.
Error de validación: pares de criterios mal formados El nombre de un indicador es incorrecto o la dirección no es max ni min. non-zero Utiliza uno de los nombres de indicadores admitidos con max o min.
Error de validación: indicador de rendimiento desconocido Uno de los nombres indicados en --criteria no figura entre los admitidos. non-zero Utiliza uno de los nombres de indicadores incluidos en la sección Criterios.
Error de validación: valor desconocido de --method El valor de --method no es genetic ni grid. non-zero Utiliza --method=genetic (predeterminado) o --method=grid.
Se han indicado --fitness y --criteria a la vez Estas dos opciones son incompatibles entre sí. non-zero Indica --fitness o --criteria, pero no ambas.
optimize no está disponible Se está utilizando la edición interna o en la nube de la CLI. unknown Cambia a la edición local para usuarios.