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
ISSET($MyArray[index])Parameters
| Naam | Type | Standaard | Beschrijving |
|---|---|---|---|
| $MyArray | array | verplicht | De array waarvan het element wordt getest. Arraynamen beginnen met $. |
| index | geheel getal | verplicht | De elementpositie die moet worden gecontroleerd. |
Formule
ISSET($a[i]) = 1 if element i of $a has been assigned
= 0 otherwiseHoe 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)
// 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)
// 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)
// 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
ENDIFVoordat 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] = 0is 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.
Gerelateerde instructies
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.