**FeatureGeneratorByLeoConfig** es un DSL declarativo diseñado para definir conjuntos de *features* que la clase (CAiLeoMulyiFeatureGen) transforma en un **vector** o una **matriz** de valores numéricos. Su principal caso de uso es la generación de datos de entrada para modelos ML dentro de plataformas MT5.
## Extensiones de archivo
-`.fgblc`: Tanto para archivos y codigo en MD
---
## Conceptos Fundamentales
| Concepto | Descripción |
|---|---|
| **Feature** | Clase que produce uno o varios valores numéricos en cada tick o barra |
| **Vector** | Salida de una sola fila: cada feature ocupa una columna |
| **Matrix** | Salida de múltiples filas: cada contexto local ocupa una o varias filaso son acopladas (varias features en una columna) |
| **Índice (`idx`)** | Número entero que parametriza la feature (p.ej. período de un indicador) |
| **Contexto Global** | Bloque `@New` que declara si la salida es Vector o Matrix |
| **Contexto Local** | Bloque `#` dentro de un `@New` que define cómo se asignan los índices |
| **Prefijo** | Cadena opcional que diferencia dos instancias de la misma feature |
---
## Sintaxis del Lenguaje
La estructura general de un archivo `.fgblc` es:
```fgblc
name = [Generador de features]
@Config
{
cols=37; // Siempre se define el numero de columnas primero
}
@New Vector {
#Normal(idx=<n>) {
[Feature1][prefijo](param1|param2|...)
[Feature2][prefijo](param1|...)
}
}
```
### Nombre del generador "name"
En caso que la clase CAiLeoMulyiFeatureGen se inicialize por archivo (`InitByFile(...)`)se requeria que la primera linea del archivo se ubique el nombre del
Generador, entre [], ejemplo:
```fgblc
name = [Generador de features]
```
En caso se use `Init(const string& name, const string& src)` uno debera de pasar el nombre del generador.. aparte **no dentro del DSL**
### Configuración `@Config`
Define el número de columnas (features) que tendrá cada fila de la salida.
```fgblc
cols = 4;
```
> **Obligatorio.** Debe ser el primer elemento del archivo. El parser rechazará cualquier script que no comience con este token.
---
### Contexto Global `@New`
Declara el tipo de contenedor de salida y abre un bloque de definición.
#### Vector
Genera una salida de una sola fila.
```fgblc
@New Vector {
// contextos locales y features aquí
}
```
#### Matrix
Genera una salida de múltiples filas. Requiere especificar el número de filas.
```fgblc
@New Matrix(rows=<n>) {
// contextos locales y features aquí
}
```
| Parámetro | Tipo | Descripción |
|---|---|---|
| `rows` | `int` | Número de filas que tendrá la matriz. Cada contexto local debe coincidir con este número. |
---
### Contexto Local `#`
Define cómo se asignan los índices a las features dentro de su bloque. Se escribe dentro de un `@New`.
Los contextos locales varían según si el padre (contexto global) es **Vector** o **Matrix**.
#### Dentro de `@New Vector`
| Sintaxis | Tipo | Descripción |
|---|---|---|
| `#Normal(idx=<n>)` | Índice fijo | Todas las features del bloque reciben el mismo índice `n` |
| `#Custom([i1,i2,...])` | Índice por feature | Cada feature recibe el índice correspondiente de la lista, en orden |
```fgblc
// Todas las features reciben idx=1
#Normal(idx=1) {
[RSI][_rsi14](period=14|price=CLOSE)
[EMA][_ema](period=50|price=CLOSE)
}
// Cada feature recibe su propio índice
#Custom([1,2,3]) {
[RSI][a]() // idx=1
[RSI][b]() // idx=2
[RSI][c]() // idx=3
}
```
#### Dentro de `@New Matrix`
| Sintaxis | Tipo | Descripción |
|---|---|---|
| `#Matrix([i1,i2,...])` | Índices básicos | Una lista de índices, uno por fila. El número de elementos debe coincidir con `rows` |
| `#Generate([start,step,len])` | Índices generados | Genera automáticamente la lista: `start`, `start+step`, `start+step*2`, ... |
| `#Custom([i1,i2,...])` | Índices multi | Asigna índices distintos a features en una misma fila (acoplamiento de features) |
```fgblc
// Matrix con índices explícitos [1,2,3]
#Matrix([1,2,3]) {
[RSI][](period=14|price=CLOSE)
}
// Matrix con índices generados: start=1, step=1, len=5 → [1,2,3,4,5]
#Generate([1,1,5]) {
[EMA][](period=50|price=CLOSE)
}
// Custom: varias features con índices distintos por fila
#Custom([10,20,30]) {
[RSI][a]() // idx=10
[EMA][b]() // idx=20
[ATR][c]() // idx=30
}
```
---
### Feature
Unidad básica del lenguaje. Representa una instancia de una clase que produce datos.
- El codigo se parsea **de arriba hacia abajo**. El orden de declaración determina la posición en el resultado: la primera feature ocupa la columna `0`.
- En las **matrices**, la estructura crece hacia abajo (en filas). Cada contexto local `#Matrix` o `#Generate` suma filas al total.
- En modo `#Custom` dentro de una Matrix, las features se **acoplan en columnas** dentro de una misma fila en lugar de apilarse.
- El número de features en un contexto local no puede superar el valor de `cols`. El parser lo rechazará con un error crítico.
- Una feature con `support_idx = false` solo acepta `idx` con valor `0` o `1`. Un índice mayor provocará error.