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
.algoy 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) ogrid. Eligegridcuando haya pocas combinaciones de parámetros y quieras probarlas todas; eligegeneticcuando 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.cbotsetcon 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 ¶
Namees obligatorio y debe coincidir con el nombre de una propiedad del cBot. Ejecutactrader-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
Optimizetiene el valortrue, el parámetro se incluye en la búsqueda. Si tiene el valorfalse, 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,MaxyStep. - Los parámetros de valores discretos que se optimizan, como las enumeraciones y los símbolos, requieren un array
Valuesque no esté vacío. ParameterTypees opcional. Si se omite, el tipo se determina mediante los metadatos del cBot, buscando una coincidencia conName.
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.optresque 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,.jsony.cbotset. El archivo.cbotsetmuestra 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.
- Abre un archivo
.cbotsetde un pase dentro de--passes-diry comprueba que los parámetros optimizados cambian de un pase a otro, mientras que los parámetros fijados y los omitidos permanecen constantes. - Si has explorado distintos períodos de tiempo, comprueba el valor
Chart.Perioden el archivo.cbotsetde cada pase. Debe coincidir con uno de los períodos de tiempo seleccionados. - Abre el archivo
.optreso 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. |