REM
REM starts a comment line in ProBuilder. Together with // and /* */ it lets ProRealTime™ code carry notes that the compiler ignores completely during execution.
Sintaxis
REM This is a comment
// This is another way to comment the code
/* This is another way to comment the code
with multiple lines */Cómo funciona
Todo lo que sigue a REM en la misma línea es ignorado por el compilador. La palabra clave existe únicamente para documentar: explicar qué calcula un bloque, por qué se eligió un umbral o marcar secciones de un script más largo. Los comentarios no tienen coste de ejecución porque se eliminan antes de ejecutar.
ProBuilder admite tres formas de comentario. REM y // comentan ambos el resto de una línea y son intercambiables. El / / par comenta todo lo que hay entre los marcadores, incluidos los saltos de línea, lo que sirve para explicaciones más largas y para desactivar temporalmente bloques de código durante la depuración. Los marcadores de comentario no pueden anidarse unos dentro de otros, un / / el bloque no se reinicia si otro /* aparece dentro de él.
Los comentarios son válidos en cualquier parte del código de indicadores, estrategias y screeners. Las convenciones habituales incluyen un comentario de cabecera que describe el propósito y los parámetros del script, una nota breve sobre cualquier cálculo no obvio, y // comentarios al final de línea que explican asignaciones concretas. Desactivar una línea anteponiéndole REM o // es la forma estándar de probar variantes sin borrar código.
Como los nombres de variables en ProBuilder suelen ser cortos, los comentarios soportan buena parte de la carga de hacer que un script sea mantenible. Un script que se retoma meses después se lee primero a través de sus comentarios.
Ejemplos
Ejemplo 1, Documentar un cálculo (Indicador)
REM Compute the 10-period simple moving average of the high
i1 = average[10](high)
// i1 now holds the SMA value
/*
multi-line comment describing
the rest of the script
*/
RETURN i1 AS "SMA high 10"Los tres estilos de comentario aparecen juntos. Ninguno de ellos afecta al valor devuelto.
Ejemplo 2, Cabecera de estrategia y línea de prueba desactivada (ProOrder)
REM Trend-following system, hourly timeframe
REM Entries on MA crossover, fixed percentage stop
DEFPARAM CumulateOrders = false
fastMA = average[20](close)
slowMA = average[100](close)
// BUY 2 CONTRACT AT MARKET <- disabled while testing size 1
IF fastMA crosses over slowMA THEN
BUY 1 CONTRACT AT MARKET
ENDIF
SET STOP %LOSS 2REM lines document the system at the top, and a // como prefijo mantiene una línea de orden alternativa en el archivo sin ejecutarla.
Ejemplo 3, Condición de screener anotada (ProScreener)
REM Filter: price above its 50-bar average with rising volume
avgPrice = average[50](close)
volUp = volume > volume[1]
SCREENER[close > avgPrice AND volUp] (close AS "Last price")La línea REM indica la intención del filtro, por lo que la condición de abajo no necesita más explicación.
Errores y trampas habituales
- Sin anidamiento. Los marcadores de comentario no pueden contenerse entre sí. Un
/dentro de un existente/ /bloque no abre un segundo bloque, y el primer/termina el comentario de todos modos. - REM comments the whole rest of the line. El código colocado después de REM en la misma línea se ignora.
REM init a = 5no asigna nada. - Comentarios de bloque sin cerrar. A
/sin su correspondiente/se traga todo el código restante y suele manifestarse como un error de compilación confuso, lejos del marcador de apertura. - Los comentarios obsoletos engañan. Los comentarios no se comprueban contra el código. Después de editar un cálculo, actualiza la nota que está encima, un comentario desactualizado es peor que ninguno.
Instrucciones relacionadas
IF, bloque condicional que se beneficia de un comentario que indique su intención.FOR, bucle contado, a menudo anotado con lo que acumula la iteración.RETURN, devuelve el valor del indicador que describen los comentarios de cabecera.DEFPARAM, ajustes de ejecución de la estrategia, agrupados por convención bajo un comentario de cabecera.ONCE, inicialización única, conviene señalarla con un comentario.CALL, invoca otro indicador, los comentarios deben indicar qué devuelve el código llamado.