ELSE
ELSE in ProBuilder runs an alternative block of code when the preceding IF condition is false. Each IF statement accepts a single ELSE branch before ENDIF.
Syntaxis
IF (condition) THEN
// statements when the condition is true
ELSE
// statements when the condition is false
ENDIFHoe het werkt
Een IF-statement op zichzelf voert zijn blok uit of doet niets. Met ELSE erbij wordt het een tweezijdige vertakking: precies één van de twee blokken wordt op elke bar uitgevoerd, nooit beide en nooit geen van beide. De uitvoering gaat daarna verder na ENDIF, ongeacht welke tak is uitgevoerd.
ELSE cannot stand alone. It must appear inside an IF block, after the THEN block and any ELSIF branches, and before ENDIF. Each IF statement accepts at most one ELSE, and it must be the final branch. When several conditions need to be tested in order, chain them with ELSIF and reserve ELSE for the case where none of them matched.
Omdat er altijd één tak wordt uitgevoerd, is een IF/ELSE-paar de idiomatische manier om te garanderen dat een variabele op elke bar een waarde krijgt, waardoor verouderde waarden uit eerdere bars niet blijven hangen.
Voorbeelden
Voorbeeld 1, De huidige bar classificeren (Indicator)
// compare the current high with the previous bar's high
IF (High > High[1]) THEN
result = 1
ELSE
result = -1
ENDIF
RETURN resultWanneer de huidige high hoger is dan de vorige high, result is 1, in alle andere gevallen zet de ELSE-tak hem op -1. De variabele krijgt gegarandeerd op elke bar een nieuwe waarde.
Voorbeeld 2, Scoren boven of onder een bewegend gemiddelde (ProScreener)
ma = Average[200](close)
// score the instrument by its position relative to the average
IF close > ma THEN
score = (close - ma) / ma * 100
ELSE
score = 0
ENDIF
SCREENER[score > 5] (score AS "Percent above MA")Instrumenten die boven het 200-periode gemiddelde handelen krijgen een procentuele score, de ELSE-tak zet al het andere op nul zodat de screenervoorwaarde schoon blijft.
Voorbeeld 3, Een stopafstand kiezen per regime (ProOrder)
DEFPARAM CumulateOrders = false
atr = AverageTrueRange[14](close)
// widen the stop in volatile conditions, tighten it otherwise
IF atr > Average[100](atr) THEN
stopDist = 3 * atr
ELSE
stopDist = 1.5 * atr
ENDIF
IF close CROSSES OVER Average[50](close) AND NOT onmarket THEN
BUY 1 CONTRACT AT MARKET
SET STOP pLOSS stopDist
ENDIFDe ELSE-tak levert de standaard stopafstand wanneer de volatiliteitstest niet slaagt, zodat stopDist is gedefinieerd voordat de instaplogica hem gebruikt.
Veelvoorkomende fouten en valkuilen
- ELSE without a matching IF. ELSE is only valid between an IF ... THEN block and its ENDIF. A stray ELSE, or one separated from its IF by a misplaced ENDIF, fails to compile.
- Meerdere ELSE-takken. Elk IF-statement accepteert maximaal één ELSE. Extra onderling uitsluitende gevallen horen in ELSIF-takken die vóór de ELSE staan.
- ELSE with its own condition. ELSE takes no condition and no THEN. Writing
ELSE (condition) THENis een syntaxfout, de conditionele vorm is ELSIF. - Verkeerde koppeling van takken in geneste blokken. In geneste IF-statements bindt ELSE aan de dichtstbijzijnde niet-gesloten IF. Een ontbrekende binnenste ENDIF koppelt de ELSE stilzwijgend aan de verkeerde voorwaarde, wat wel compileert maar verkeerd vertakt.
Gerelateerde instructies
IF, opent het voorwaardelijke blok dat ELSE uitbreidt.ELSIF, voorwaardelijke alternatieve takken die vóór ELSE worden getest.ENDIF, sluit het IF/ELSE-blok.THEN, vereist na IF- en ELSIF-voorwaarden, nooit na ELSE.AND, combineert voorwaarden binnen de IF-test.OR, alternatieve voorwaarden binnen de IF-test.NOT, ontkent een voorwaarde.