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; useget_pars()for parameters andget_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.