Bli medlem idag
Instruktioner/probuilder · probacktest · proorder · proscreener

IsSet

IsSet i ProBuilder returnerar 1 när ett givet arrayelement har tilldelats ett värde och 0 när det inte har det, vilket förhindrar läsning av oinitierade arrayposter.

Syntax

probuilder
ISSET($MyArray[index])

Parametrar

NamnTypStandardBeskrivning
$MyArrayarrayobligatoriskArrayen vars element testas. Arraynamn börjar med $.
indexheltalobligatoriskElementpositionen som ska kontrolleras.

Formel

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

Så fungerar det

ProBuilder-arrayer behöver inte deklareras med en storlek, och element kan skrivas på valfria index. Den flexibiliteten innebär att en array kan innehålla luckor: index 0 och index 2 kan hålla värden medan index 1 aldrig berörts. ISSET rapporterar, per element, om en tilldelning har skett.

Att läsa ett element som aldrig satts ger inget fel, det ger helt enkelt ett standardvärde, vilket gör den här typen av buggar tysta och svåra att spåra. Att skydda läsningar med ISSET förvandlar det tysta standardvärdet till en explicit gren, så att skriptet kan hoppa över elementet, sätta in ett reservvärde eller söka någon annanstans.

Kontrollen sker per index, inte per array. Att testa ISSET($a[0]) säger ingenting om $a[1]. Ett element förblir satt när det har tilldelats, såvida det inte uttryckligen rensas med UNSET, varefter ISSET igen returnerar 0 för det. LASTSET kompletterar ISSET genom att returnera det högsta index som har tilldelats, vilket är användbart för att iterera över en glest fylld array.

Exempel

Exempel 1, Testa glest ifyllda arrayelement (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"

Endast index 0 och 2 skrevs, så de fyra kontrollerna returnerar 1, 0, 1, 0 och indikatorn plottar 2, antalet ifyllda element.

Exempel 2, Läsa ett värde per bar endast när det finns (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"

Arrayen skrivs bara på toppbarer, vilket lämnar luckor överallt annars. ISSET skiljer registrerade barer från tomma innan elementet läses.

Exempel 3, Skydda lagrade entrypriser (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

Innan exitregeln läser det senast lagrade entrypriset bekräftar ISSET att elementet finns, vilket skyddar de första barerna där ingen affär ännu har registrerats.

Vanliga fel och fallgropar

  • Läsningar av osatta element misslyckas tyst. Att läsa ett element som aldrig tilldelats returnerar ett standardvärde i stället för ett fel, så ett saknat ISSET-skydd ger felaktiga tal snarare än en krasch.
  • Noll är ett satt värde. Ett element som tilldelats värdet 0 rapporterar fortfarande ISSET = 1. Att testa $a[i] = 0 är inte en ersättning för ISSET, eftersom det inte kan skilja "tilldelad noll" från "aldrig tilldelad".
  • Omfattning per element. ISSET kontrollerar ett index i taget. Att verifiera att en array "har data" kräver att man kontrollerar de specifika index som koden ska läsa, eller att man använder LASTSET för att hitta det ifyllda intervallet.
  • UNSET rensar flaggan. Efter att UNSET tagit bort ett element returnerar ISSET 0 för det indexet igen. Kod som håller kvar ett index över flera barer bör kontrollera på nytt före läsning.
  • Unset, rensar ett arrayelement eller en hel array.
  • LastSet, returnerar det högsta index som tilldelats i en array.
  • ArrayMax, största värdet som lagrats i en array.
  • ArrayMin, minsta värdet som lagrats i en array.
  • ArraySort, sorterar arrayens innehåll på plats.
  • ONCE, engångsinitiering av variabler på den första baren.
  • BarIndex, numret på den aktuella baren, ett vanligt arrayindex.