Word nu lid
Instructies/probuilder · probacktest · proorder · proscreener

IsSet

IsSet in ProBuilder geeft 1 wanneer aan een bepaald array-element een waarde is toegekend en 0 wanneer dat niet zo is, waarmee het lezen van niet-geïnitialiseerde array-elementen wordt voorkomen.

Syntaxis

probuilder
ISSET($MyArray[index])

Parameters

NaamTypeStandaardBeschrijving
$MyArrayarrayverplichtDe array waarvan het element wordt getest. Arraynamen beginnen met $.
indexgeheel getalverplichtDe elementpositie die moet worden gecontroleerd.

Formule

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

Hoe het werkt

ProBuilder-arrays hoeven niet met een grootte te worden gedeclareerd, en elementen kunnen op willekeurige indices worden geschreven. Door die flexibiliteit kan een array gaten bevatten: index 0 en index 2 kunnen waarden bevatten terwijl index 1 nooit is aangeraakt. ISSET meldt per element of er een toekenning heeft plaatsgevonden.

Het lezen van een element dat nooit is gezet, veroorzaakt geen fout, het levert simpelweg een standaardwaarde op, waardoor bugs van dit soort stil en moeilijk te traceren zijn. Door reads met ISSET af te schermen wordt de stille standaardwaarde een expliciete tak, zodat het script het element kan overslaan, een terugvalwaarde kan gebruiken of elders kan zoeken.

De controle is per index, niet per array. Testen van ISSET($a[0]) zegt niets over $a[1]. Een element blijft gezet zodra het is toegekend, tenzij het expliciet met UNSET wordt gewist, waarna ISSET er weer 0 voor teruggeeft. LASTSET vult ISSET aan door de hoogste index terug te geven die is toegekend, wat nuttig is om over een dun gevulde array te itereren.

Voorbeelden

Voorbeeld 1, Dunbezette array-elementen testen (Indicator)

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"

Alleen index 0 en 2 zijn geschreven, dus de vier checks geven 1, 0, 1, 0 terug en de indicator plot 2, het aantal gevulde elementen.

Voorbeeld 2, Een waarde per bar alleen lezen als die bestaat (Indicator)

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"

De array wordt alleen op piekbars geschreven, waardoor er overal elders gaten blijven. ISSET onderscheidt vastgelegde bars van lege voordat het element wordt gelezen.

Voorbeeld 3, Opgeslagen instapprijzen afschermen (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

Voordat de uitstapregel de meest recent opgeslagen instapprijs leest, bevestigt ISSET dat het element bestaat, wat de eerste bars beschermt waarop nog geen trade is vastgelegd.

Veelvoorkomende fouten en valkuilen

  • Niet-gezette reads falen stil. Het benaderen van een element dat nooit is toegekend, geeft een standaardwaarde in plaats van een fout, dus een ontbrekende ISSET-guard levert verkeerde getallen op in plaats van een crash.
  • Nul is een gezette waarde. Een element waaraan de waarde 0 is toegekend rapporteert nog steeds ISSET = 1. Testen $a[i] = 0 is geen vervanging voor ISSET, omdat hij geen onderscheid kan maken tussen "nul toegewezen" en "nooit toegewezen".
  • Bereik per element. ISSET controleert één index per keer. Nagaan of een array "data bevat" vereist het controleren van de specifieke indices die de code gaat lezen, of het gebruik van LASTSET om het gevulde bereik te vinden.
  • UNSET wist de vlag. Nadat UNSET een element heeft verwijderd, geeft ISSET voor die index opnieuw 0. Code die een index over meerdere bars vasthoudt, moet opnieuw controleren voordat hij leest.
  • Unset, wist een array-element of een volledige array.
  • LastSet, geeft de hoogste toegekende index in een array terug.
  • ArrayMax, grootste waarde die in een array is opgeslagen.
  • ArrayMin, kleinste waarde die in een array is opgeslagen.
  • ArraySort, sorteert de inhoud van een array ter plaatse.
  • ONCE, eenmalige initialisatie van variabelen op de eerste bar.
  • BarIndex, huidig barnummer, een veelgebruikte array-index.