7. Estrategias personalizadas: de la definición al uso

Una estrategia personalizada requiere: parámetros ajustables, declarados DataType inputs, a realize() implementation, then adding the instance to an Operator.

7.1. Definir parámetros ajustables

Declare parámetros ajustables con Parameter (par_range, name, par_type, etc.) and pass pars=[...] in the strategy __init__:

from qteasy import BaseStrategy, Parameter

class MyStg(BaseStrategy):
    def __init__(self):
        super().__init__(pars=[
            Parameter('short_period', (5, 20), 10),
            Parameter('long_period', (20, 60), 30),
        ])

Luego, sintonice a través de set_parameter(stg_id, pars={'short_period': 8, 'long_period': 40}) en optimización o configuración manual.

7.2. Declarar datos requeridos

Declare DataType, window_length (lookback), use_latest_data_cycle, etc., so the framework prepares data before runs and realize() reads it via get_data(dtype_id).

7.3. Implementar realizar()

  • realize() takes no arguments; use get_pars() for parameters and get_data(dtype_id) para datos.

  • Valor de retorno: por tipo de estrategia (por ejemplo, PT devuelve posiciones escalares/vectoriales en 0–1; PS devuelve una lista de selección).

7.4. Agregar a Operator

Utilice add_strategy(MyStg(), run_freq=..., run_timing=...); run_freq/run_timing para determinar el grupo.

7.5. Mini ejemplo completo

A continuación se muestra un ejemplo mínimo de temporización de media móvil dual (bosquejo lógico; clase base y DataType por API real):

import qteasy as qt
from qteasy import RuleIterator, Parameter

class DMA(RuleIterator):
    def __init__(self):
        super().__init__(pars=[
            Parameter('short_period', (5, 20), 10),
            Parameter('long_period', (20, 60), 30),
        ])
    def realize(self):
        close = self.get_data('close')
        p = self.get_pars()
        short = close[-p['short_period']:].mean()
        long_ = close[-p['long_period']:].mean()
        return 1.0 if short > long_ else 0.0

op = qt.Operator(signal_type='PT', run_freq='d')
op.add_strategy(DMA(), run_freq='d', run_timing='open')

Hay más ejemplos en los capítulos 5 a 7 de los tutoriales.