Iscriviti ora
Istruzioni/probuilder · probacktest · proorder · proscreener

IsSet

IsSet in ProBuilder restituisce 1 quando a un dato elemento di un array è stato assegnato un valore e 0 quando non lo è, evitando letture di voci di array non inizializzate.

Sintassi

probuilder
ISSET($MyArray[index])

Parametri

NomeTipoPredefinitoDescrizione
$MyArrayarrayobbligatorioL'array di cui viene testato l'elemento. I nomi degli array iniziano con $.
indiceinteroobbligatorioLa posizione dell'elemento da verificare.

Formula

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

Come funziona

Gli array di ProBuilder non devono essere dichiarati con una dimensione, e gli elementi possono essere scritti a indici arbitrari. Questa flessibilità significa che un array può contenere lacune: l'indice 0 e l'indice 2 possono contenere valori mentre l'indice 1 non è mai stato toccato. ISSET segnala, per ogni elemento, se un'assegnazione è avvenuta.

Leggere un elemento mai impostato non genera un errore, restituisce semplicemente un valore predefinito, il che rende i bug di questo tipo silenziosi e difficili da rintracciare. Proteggere le letture con ISSET trasforma il valore predefinito silenzioso in un ramo esplicito, così lo script può saltare l'elemento, sostituirlo con un ripiego o cercare altrove.

Il controllo è per indice, non per array. Testare ISSET($a[0]) non dice nulla su $a[1]. Un elemento resta impostato una volta assegnato, a meno che non venga esplicitamente azzerato con UNSET, dopodiché ISSET restituisce di nuovo 0 per quell'elemento. LASTSET completa ISSET restituendo l'indice più alto che è stato assegnato, cosa utile per iterare su un array riempito in modo sparso.

Esempi

Esempio 1, Verificare elementi sparsi di un array (Indicatore)

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"

Sono stati scritti solo gli indici 0 e 2, quindi i quattro controlli restituiscono 1, 0, 1, 0 e l'indicatore traccia 2, il numero di elementi popolati.

Esempio 2, Leggere un valore per bar solo quando esiste (Indicatore)

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"

L'array viene scritto solo sulle bar di picco, lasciando lacune in tutto il resto. ISSET distingue le bar registrate da quelle vuote prima che l'elemento venga letto.

Esempio 3, Proteggere i prezzi di ingresso memorizzati (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

Prima che la regola di uscita legga il prezzo di ingresso memorizzato più recente, ISSET conferma che l'elemento esiste, il che protegge le prime bar in cui nessuna operazione è ancora stata registrata.

Errori e insidie comuni

  • Le letture non impostate falliscono silenziosamente. Accedere a un elemento mai assegnato restituisce un valore predefinito invece di un errore, quindi una guardia ISSET mancante produce numeri errati anziché un blocco.
  • Zero è un valore impostato. Un elemento a cui è assegnato il valore 0 riporta comunque ISSET = 1. Testare $a[i] = 0 non sostituisce ISSET, poiché non può distinguere "zero assegnato" da "mai assegnato".
  • Ambito per singolo elemento. ISSET verifica un indice alla volta. Verificare che un array "contenga dati" richiede di controllare gli indici specifici che il codice leggerà, oppure di usare LASTSET per trovare l'intervallo popolato.
  • UNSET azzera il flag. Dopo che UNSET rimuove un elemento, ISSET restituisce di nuovo 0 per quell'indice. Il codice che conserva un indice tra le bar dovrebbe ricontrollare prima di leggere.
  • Unset, cancella un elemento di un array o un intero array.
  • LastSet, restituisce l'indice più alto assegnato in un array.
  • ArrayMax, valore più grande memorizzato in un array.
  • ArrayMin, valore più piccolo memorizzato in un array.
  • ArraySort, ordina il contenuto di un array sul posto.
  • ONCE, inizializzazione di variabile una sola volta sulla prima bar.
  • BarIndex, numero della bar corrente, un indice di array comune.