Únete hoy
Instrucciones/probuilder · probacktest · proorder · proscreener

IsSet

IsSet en ProBuilder devuelve 1 cuando a un elemento dado de un array se le ha asignado un valor y 0 cuando no, evitando lecturas de entradas de array no inicializadas.

Sintaxis

probuilder
ISSET($MyArray[index])

Parámetros

NombreTipoPor defectoDescripción
$MyArrayarrayobligatorioEl array cuyo elemento se comprueba. Los nombres de array empiezan por $.
índiceenteroobligatorioLa posición del elemento a comprobar.

Fórmula

código
ISSET($a[i]) = 1  if element i of $a has been assigned
             = 0  otherwise

Cómo funciona

Los arrays de ProBuilder no necesitan declararse con un tamaño, y los elementos pueden escribirse en índices arbitrarios. Esa flexibilidad implica que un array puede contener huecos: los índices 0 y 2 pueden tener valores mientras que el índice 1 nunca se tocó. ISSET informa, elemento a elemento, de si se ha producido una asignación.

Leer un elemento que nunca se estableció no genera un error, simplemente produce un valor por defecto, lo que hace que los errores de este tipo sean silenciosos y difíciles de rastrear. Proteger las lecturas con ISSET convierte ese valor por defecto silencioso en una rama explícita, de modo que el script puede omitir el elemento, sustituirlo por una alternativa o buscar en otro sitio.

La comprobación es por índice, no por array. Probar ISSET($a[0]) no dice nada sobre $a[1]. Un elemento permanece asignado una vez se le da valor, salvo que se borre explícitamente con UNSET, tras lo cual ISSET vuelve a devolver 0 para él. LASTSET complementa a ISSET devolviendo el índice más alto que se ha asignado, lo que resulta útil para recorrer un array poco poblado.

Ejemplos

Ejemplo 1, Comprobar elementos dispersos de un array (Indicador)

probuilder
// Assign two of four elements
$levels[0] = 10
$levels[2] = 30

// ISSET returns 1 for assigned indices and 0 for the gaps
a = ISSET($levels[0]) // 1
b = ISSET($levels[1]) // 0
c = ISSET($levels[2]) // 1
d = ISSET($levels[3]) // 0
RETURN a + b + c + d AS "elements set"

Solo se escribieron los índices 0 y 2, por lo que las cuatro comprobaciones devuelven 1, 0, 1, 0 y el indicador dibuja 2, el número de elementos rellenados.

Ejemplo 2, Leer un valor por bar solo cuando existe (Indicador)

probuilder
// Store the high of each bar that sets a new 20-bar peak
IF high >= Highest[20](high) THEN
  $peaks[BarIndex] = high
ENDIF

// Fall back to 0 on bars where no peak was recorded
val = 0
IF ISSET($peaks[BarIndex]) THEN
  val = $peaks[BarIndex]
ENDIF
RETURN val AS "latest peak"

El array solo se escribe en los bars de máximo, dejando huecos en todos los demás. ISSET distingue los bars registrados de los vacíos antes de leer el elemento.

Ejemplo 3, Proteger los precios de entrada almacenados (ProBacktest)

probuilder
// Record each entry price in an array as trades open
IF NOT ONMARKET AND close CROSSES OVER Average[50](close) THEN
  BUY 1 CONTRACT AT MARKET
  $entryPrices[n] = close
  n = n + 1
ENDIF

// Exit 2 percent above the last stored entry, if one exists
IF LONGONMARKET AND ISSET($entryPrices[n - 1]) THEN
  IF close > $entryPrices[n - 1] * 1.02 THEN
    SELL AT MARKET
  ENDIF
ENDIF

Antes de que la regla de salida lea el precio de entrada almacenado más reciente, ISSET confirma que el elemento existe, lo que protege los primeros bars en los que aún no se ha registrado ninguna operación.

Errores y trampas habituales

  • Las lecturas no asignadas fallan en silencio. Acceder a un elemento que nunca se asignó devuelve un valor por defecto en lugar de un error, por lo que la falta de una guarda ISSET produce números incorrectos en vez de un fallo.
  • Cero es un valor asignado. Un elemento al que se asigna el valor 0 sigue informando ISSET = 1. Probar $a[i] = 0 no sustituye a ISSET, ya que no puede distinguir "asignado a cero" de "nunca asignado".
  • Ámbito por elemento. ISSET comprueba un índice a la vez. Verificar que un array "tiene datos" requiere comprobar los índices concretos que leerá el código, o usar LASTSET para hallar el rango poblado.
  • UNSET borra la bandera. Después de que UNSET elimine un elemento, ISSET vuelve a devolver 0 para ese índice. El código que conserva un índice a lo largo de los bars debería volver a comprobarlo antes de leer.
  • Unset, borra un elemento de un array o un array completo.
  • LastSet, devuelve el índice más alto asignado en un array.
  • ArrayMax, valor más grande almacenado en un array.
  • ArrayMin, valor más pequeño almacenado en un array.
  • ArraySort, ordena el contenido de un array en su lugar.
  • ONCE, inicialización única de variables en el primer bar.
  • BarIndex, número del bar actual, un índice de array habitual.