PáginasParámetros de entrada · 14 / 29
Parámetros de entrada
Los parámetros de entrada te permiten convertir valores dentro del código de tu estrategia (por ejemplo, una longitud de retrospectiva o un número máximo de posiciones largas abiertas) en controles que configuras desde los cuadros de ejecución, sin editar el archivo cada vez que quieras probar un número nuevo. El mismo mecanismo params se aplica a Run backtest (Backtests), Bulk forward (AutoTrading / QuantCloud) y a los parámetros del algoritmo en Chart forward test. Test se describe en Ejecución de código; los barridos de varias ejecuciones se tratan en Optimización. Los params no se rellenan en un Run simple.
Esta página cubre las dos mitades de ese flujo:
- Declarar
paramsen tu archivo de Python - Conectar esos params a los cuadros de ejecución para poder configurarlos, guardarlos y optimizarlos (consulta también Preajustes de ejecución (.qcs))
Cómo funciona de un vistazo
- En tu archivo de estrategia, importas un objeto especial
paramsy lees atributos de él (p. ej.params.PERIOD). - El IDE analiza tu código para descubrir esos nombres y los lista en el cuadro de ejecución (Test, bulk forward o chart forward).
- Introduces un tipo y un valor para cada nombre en el cuadro de diálogo (o defines un barrido cuando optimizas).
- Cuando inicias la ejecución, el motor rellena
paramscon tus valores antes de que se ejecute tu script, de modo que los valores están disponibles en cuanto se importa tu archivo.
Las entradas se rellenan en los cuadros Run backtest, Bulk forward y Chart forward test. No se rellenan en un Run simple (
/ws/run): usa valores por defecto conhasattrsi quieres que el mismo archivo funcione de ambas formas. Consulta Ciclo de vida de la estrategia para saber cuándo losparamsson visibles para los callbacks.
Declarar params en tu estrategia
Añade una única importación y haz referencia a cada nombre 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"Se aplican algunas reglas:
- Escríbelo como
from quantcraft.inputs import params. La expresión regular de descubrimiento también acepta las formas antiguasfrom quantcraft.inputs_module import paramsyfrom ide.inputs_module import paramspara que los scripts existentes sigan funcionando (consulta Referencia), pero el código nuevo debe usarquantcraft.inputs. Debe ser la formafrom … import params:import quantcraft.inputs as inpno se detecta, así que la pestaña Script no aparecerá. - El ejecutor aplica los valores del cuadro antes de que se cargue tu script de entrada, lo que basta para
from quantcraft.inputs import paramsen el archivo de estrategia. paramses un único objeto «vivo». Cada ejecución cambia los valores que hay detrás, por lo que siempre muestra las entradas de esta ejecución, también en los módulos auxiliares que lo importaron durante una ejecución forward anterior y, por separado, en las ejecuciones forward activas al mismo tiempo. Una ejecución iniciada sin entradas ve unparamsvacío, nunca los valores de la ejecución anterior.- Cada nombre de parámetro debe ser un identificador de Python válido (
A–Z,a–z,0–9,_, sin empezar por un dígito); cualquier otro se omite. - Cada entrada debe incluir un token literal
params.NAMEen el código fuente para que el IDE pueda descubrirla. El cliente busca con expresión regularparams.<identificador>; los nombres referenciados solo mediantegetattr(params, "NAME", default)no se descubren y no aparecerán en la pestaña Script.getattr(params, "NAME", default)sí funciona en tiempo de ejecución: basta con mantener unparams.NAMEliteral en la misma línea para el descubrimiento. - Puedes usar
params.NAMEen cualquier parte del archivo: a nivel superior, dentro deon_init, dentro deon_bar, etc. Cada referencia única se convierte en una entrada sobre la que te preguntará el cuadro de diálogo. - No hay un esquema en el propio módulo: los nombres que referencias son el esquema.
Evita (el formulario no listará el parámetro):
MA_PERIOD = getattr(params, "MA_PERIOD", 24) # no params.MA_PERIOD token
PERIOD = 14 # no params referenceModismos habituales:
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
...Consejo: lee el valor una sola vez en una variable local/global para no pagar búsquedas de atributos en cada barra.
Conectar el cuadro Test / backtest
Abre el cuadro Test desde la barra de herramientas del editor (el botón Test). Cuando tu archivo declara entradas params.NAME, aparece una pestaña Script con filas de parámetros y Optimize. El IDE ya ha analizado tu archivo activo en busca de referencias params.NAME, así que cada parámetro que usaste aparece como una fila.
Para cada fila estableces:
| Columna | Qué introduces |
|---|---|
| Parameter | El nombre (solo lectura: viene de tu código). |
| Type | Uno de int, float, str, bool (los alias integer, number, boolean también se aceptan en la comunicación). |
| Value | El valor que se usará en la ejecución. |
Notas sobre las opciones de Type:
int/integer— números enteros (p. ej.14); se admiten separadores de miles (1,000→1000).float/number— decimales (p. ej.0.5,1e-3); las comas en los números se eliminan.bool/boolean—true/false,yes/no,y/n,on/offy1/0(en cualquier combinación de mayúsculas). Cualquier otro valor detiene la ejecución coninvalid boolean: …. El cuadro ofrece True/False.str— texto libre, conservado tal cual (sin los espacios de alrededor).
Al iniciar el backtest, el cuadro de diálogo empaqueta tus filas y las envía al motor. El motor establece los valores en params antes de que se ejecute tu on_init(), de modo que:
from quantcraft.inputs import params
PERIOD = params.PERIOD # <- already filled by the time this line executesSi un nombre de parámetro no tiene fila en el cuadro de diálogo (eliminaste la entrada, o tu archivo referencia un nombre totalmente nuevo que aún no has configurado), params no tendrá ese atributo y una lectura directa de params.NAME lanzará AttributeError. Añade la fila en el cuadro de diálogo y vuelve a ejecutar, o usa el patrón hasattr + valor por defecto else mostrado arriba (que sigue incluyendo el token params.NAME para el descubrimiento).
Los valores de tu cuadro de diálogo se recuerdan entre ejecuciones, así que no tienes que volver a escribirlos cada vez. Guarda y vuelve a cargar conjuntos completos de parámetros con los Preajustes de ejecución (.qcs).
Optimizar parámetros
En la pestaña Script, activa Optimize para ejecutar tu estrategia muchas veces con distintas combinaciones de parámetros. Elige Brute force o Genetic:
Fuerza bruta
Para cada fila de parámetro, el cuadro de diálogo añade columnas Step y Max cuando tiene sentido:
int/float— define una cuadrícula discreta: valor inicial → paso → máximo.bool— se prueban tantotruecomofalse.str— se mantiene fijo (los parámetros de cadena no forman una cuadrícula).
El motor ejecuta todas las combinaciones de esos valores discretos e informa de cada ejecución por separado en la vista Test Results.
Útil para cuadrículas pequeñas (un puñado de parámetros con unos pocos valores cada uno). Las combinaciones se disparan rápido: mantén el espacio de búsqueda modesto.
Genético
Para espacios de búsqueda mayores, cambia a Genetic para que una búsqueda evolutiva encuentre buenas combinaciones sin probar cada celda:
- Population size — número de combinaciones de parámetros evaluadas en cada generación.
- Generations — cuántas generaciones ejecutar (cada una es una población completa de backtests).
- Elitism — los mejores individuos se copian sin cambios a la siguiente generación.
- Crossover rate (
0–1) — probabilidad de que dos progenitores generen un hijo mixto. - Mutation rate (
0–1) — probabilidad de que un gen salte a otro valor. - Fitness metric — qué métrica optimizar (Sharpe, Sortino, rentabilidad total, etc.).
- Random seed (opcional) — reproducibilidad de la población y de los operadores.
Ambos modos muestran el progreso en vivo en el panel de salida (una barra de progreso en la cabecera) y un botón Stop para terminar una ejecución larga.
Cuando termina la optimización, la vista Test Results muestra las ejecuciones ordenadas por tu métrica de aptitud y puedes profundizar en cada una.
Consejos
-
Los nombres se descubren a partir de tu archivo: si una fila no aparece, revisa tus referencias
params.NAMEy que importesparamsdesdequantcraft.inputs(las rutas antiguasquantcraft.inputs_moduleeide.inputs_moduletambién se reconocen, para los scripts existentes). -
Mantén los nombres en UPPER_SNAKE_CASE: por convención se leen como constantes en tu código.
-
Indica tipos adecuados en el cuadro de diálogo para que la conversión haga lo que esperas (p. ej. no establezcas
intpara un valor como0.5). -
Los booleanos no distinguen mayúsculas —
True,true,1,yesse evalúan como verdadero. -
Usa Optimize para las búsquedas de parámetros, no scripts del editor: la fuerza bruta es exhaustiva, la genética es para espacios mayores.
-
Un Run simple no rellena los params: al hacer clic en Run,
paramsno se rellena. Usa valores por defecto conhasattr(con un tokenparams.NAMEliteral) si quieres que el mismo archivo funcione tanto con Run como con Test:from quantcraft.inputs import params PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14 -
Las ejecuciones forward usan las mismas reglas de descubrimiento — los cuadros bulk forward y chart forward buscan
params.NAMEigual que el cuadro de backtest.

