ONCE
ONCE en ProBuilder ejecuta una asignación solo en el primer bar que procesa el script, evitando que los valores iniciales se sobrescriban en cada bar posterior.
Sintaxis
ONCE variable = expressionCómo funciona
Un script de ProBuilder se ejecuta de arriba abajo en cada bar del gráfico, y las variables conservan sus valores de un bar al siguiente. Una asignación simple como counter = 0 borra por tanto la variable a cero en cada bar. Prefijar la línea con ONCE restringe la asignación a la primera evaluación únicamente, de modo que los bars posteriores dejan la variable intacta y puede acumular estado a lo largo del gráfico.
La expresión del lado derecho se evalúa con los datos disponibles en ese primer bar. El historial es corto en ese punto, por lo que las funciones que necesitan un lookback, como lowest[10](low), trabaja con las bars que existan cuando arranca el script.
El valor fijado por ONCE persiste hasta que el script se recalcula desde cero, por ejemplo después de editar el código, cambiar el marco temporal o reiniciar la plataforma. En los sistemas de trading, ONCE es la forma estándar de definir contadores, flags y ajustes fijos que la lógica de entrada y de salida lee en cada bar.
Ejemplos
Ejemplo 1, Seguimiento de nuevos mínimos frente a una referencia inicial (Indicador)
// capture the 10-bar low a single time when the script starts
ONCE myFirstLowest = lowest[10](low)
IF low < myFirstLowest OR low < recentLow THEN
recentLow = low
ELSE
recentLow = recentLow
ENDIF
RETURN recentLowmyFirstLowest se calcula solo en la primera barra y nunca se actualiza. El indicador sigue entonces cada nuevo mínimo que se imprime después de esa referencia inicial.
Ejemplo 2, Constantes fijas de la estrategia (ProOrder)
DEFPARAM CumulateOrders = false
// define risk settings a single time
ONCE stopPoints = 40
ONCE targetPoints = 80
IF NOT onmarket AND close CROSSES OVER Average[50](close) THEN
BUY 1 CONTRACT AT MARKET
SET STOP pLOSS stopPoints
SET TARGET pPROFIT targetPoints
ENDIFLas dos constantes de riesgo se asignan en la primera evaluación y se reutilizan en cada bar posterior, manteniendo la configuración en un único lugar evidente al principio de la estrategia.
Ejemplo 3, Ganancia desde el primer bar escaneado (ProScreener)
// record the close of the first bar in the scanned history
ONCE startLevel = close
gainPct = (close - startLevel) / startLevel * 100
SCREENER[gainPct > 10] (gainPct AS "Gain %")startLevel congela el cierre del primer bar procesado. Cada bar posterior compara el cierre actual con él, y el screener conserva los instrumentos que suben más del 10 por ciento a lo largo de la ventana analizada.
Errores y trampas habituales
- Esperar un reinicio en cada sesión o día. ONCE se dispara en la primera evaluación del script y nunca más hasta un recálculo completo. Los valores que deben reiniciarse a diario necesitan lógica explícita, por ejemplo comparar la fecha actual con una fecha almacenada.
- Los datos del primer bar son escasos. La expresión se evalúa cuando el historial es más corto. Una función de lookback dentro de ONCE puede ver menos bars de los solicitados, lo que puede hacer que el valor inicial no sea representativo. En las estrategias, PRELOADBARS controla cuánto historial está disponible antes del inicio.
- ONCE en una línea que debería ejecutarse en cada bar. Detrás de ONCE solo deben ir inicializaciones de verdad. Marcar así un cálculo que depende de los precios actuales lo deja permanentemente desactualizado después del primer bar.
- Autoasignación redundante en lugar de ONCE. Escribir
x = xen cada bar para conservar un valor funciona, pero oculta la intención.ONCE x = startValuedeclara la inicialización de forma explícita y evita sobrescrituras accidentales.
Instrucciones relacionadas
IF, lógica condicional que normalmente consume estado inicializado con ONCE.ELSE, rama alternativa dentro de esa lógica condicional.ENDIF, cierra un bloque IF.BarIndex, contador de bars, útil para lógica ligada a los primeros bars.DEFPARAM, ajustes de ejecución a nivel de script, también definidos al principio.RETURN, devuelve el valor final de un indicador.