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
ISSET($MyArray[index])Parametri
| Nome | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| $MyArray | array | obbligatorio | L'array di cui viene testato l'elemento. I nomi degli array iniziano con $. |
| indice | intero | obbligatorio | La posizione dell'elemento da verificare. |
Formula
ISSET($a[i]) = 1 if element i of $a has been assigned
= 0 otherwiseCome 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)
// 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)
// 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)
// 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
ENDIFPrima 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] = 0non 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.
Istruzioni correlate
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.