Jetzt beitreten
Befehle/probuilder · probacktest · proorder · proscreener

IsSet

IsSet in ProBuilder gibt 1 zurück, wenn einem bestimmten Array-Element ein Wert zugewiesen wurde, und 0, wenn nicht, und verhindert so das Lesen nicht initialisierter Array-Einträge.

Syntax

probuilder
ISSET($MyArray[index])

Parameter

NameTypStandardBeschreibung
$MyArrayArrayerforderlichDas Array, dessen Element geprüft wird. Array-Namen beginnen mit $.
IndexGanzzahlerforderlichDie zu prüfende Position des Elements.

Formel

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

So funktioniert es

ProBuilder-Arrays müssen nicht mit einer Größe deklariert werden, und Elemente können an beliebigen Indizes geschrieben werden. Diese Flexibilität bedeutet, dass ein Array Lücken enthalten kann: Index 0 und Index 2 können Werte halten, während Index 1 nie berührt wurde. ISSET meldet pro Element, ob eine Zuweisung erfolgt ist.

Das Lesen eines Elements, das nie gesetzt wurde, löst keinen Fehler aus, es liefert einfach einen Standardwert, was Fehler dieser Art unauffällig und schwer nachvollziehbar macht. Werden Lesezugriffe mit ISSET abgesichert, wird aus dem stillen Standardwert ein ausdrücklicher Zweig, sodass das Skript das Element überspringen, einen Ersatzwert einsetzen oder anderswo suchen kann.

Die Prüfung erfolgt pro Index, nicht pro Array. Das Testen von ISSET($a[0]) sagt nichts aus über $a[1]. Ein Element bleibt nach der Zuweisung gesetzt, sofern es nicht ausdrücklich mit UNSET geleert wird, wonach ISSET dafür wieder 0 zurückgibt. LASTSET ergänzt ISSET, indem es den höchsten zugewiesenen Index zurückgibt, was beim Iterieren über ein spärlich gefülltes Array nützlich ist.

Beispiele

Beispiel 1, Lückenhafte Array-Elemente prüfen (Indikator)

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"

Nur die Indizes 0 und 2 wurden geschrieben, daher geben die vier Prüfungen 1, 0, 1, 0 zurück und der Indikator zeichnet 2, die Anzahl der belegten Elemente.

Beispiel 2, Einen Wert pro Bar nur lesen, wenn er existiert (Indikator)

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"

Das Array wird nur auf Hochpunkt-Bars geschrieben und lässt überall sonst Lücken. ISSET unterscheidet erfasste Bars von leeren, bevor das Element gelesen wird.

Beispiel 3, Gespeicherte Einstiegskurse absichern (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

Bevor die Ausstiegsregel den zuletzt gespeicherten Einstiegskurs liest, bestätigt ISSET, dass das Element existiert, was die ersten Bars schützt, auf denen noch kein Trade erfasst wurde.

Häufige Fehler und Stolperfallen

  • Lesezugriffe auf nicht gesetzte Elemente schlagen stillschweigend fehl. Der Zugriff auf ein Element, dem nie ein Wert zugewiesen wurde, gibt einen Standardwert zurück statt eines Fehlers, sodass eine fehlende ISSET-Absicherung falsche Zahlen erzeugt und keinen Abbruch.
  • Null ist ein gesetzter Wert. Ein Element, dem der Wert 0 zugewiesen wurde, meldet weiterhin ISSET = 1. Ein Test $a[i] = 0 ist kein Ersatz für ISSET, da es nicht zwischen "Null zugewiesen" und "nie zugewiesen" unterscheiden kann.
  • Gültigkeit pro Element. ISSET prüft einen Index auf einmal. Um zu überprüfen, ob ein Array "Daten enthält", müssen die konkreten Indizes geprüft werden, die der Code liest, oder es muss LASTSET verwendet werden, um den belegten Bereich zu finden.
  • UNSET löscht das Flag. Nachdem UNSET ein Element entfernt hat, gibt ISSET für diesen Index wieder 0 zurück. Code, der einen Index über mehrere Bars hinweg behält, sollte vor dem Lesen erneut prüfen.
  • Unset, löscht ein Array-Element oder ein ganzes Array.
  • LastSet, gibt den höchsten in einem Array zugewiesenen Index zurück.
  • ArrayMax, größter in einem Array gespeicherter Wert.
  • ArrayMin, kleinster in einem Array gespeicherter Wert.
  • ArraySort, sortiert den Inhalt eines Arrays an Ort und Stelle.
  • ONCE, einmalige Variableninitialisierung auf dem ersten Bar.
  • BarIndex, aktuelle Bar-Nummer, ein häufiger Array-Index.