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.
Syntax
IF (condition) THEN
// statements when the condition is true
ELSE
// statements when the condition is false
ENDIFSå fungerar det
En IF-sats på egen hand kör antingen sitt block eller gör ingenting. Att lägga till ELSE gör den till en tvåvägsgren: exakt ett av de två blocken körs på varje bar, aldrig båda och aldrig inget av dem. Körningen fortsätter sedan efter ENDIF oavsett vilken gren som kördes.
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.
Eftersom en gren alltid körs är ett IF/ELSE-par det idiomatiska sättet att garantera att en variabel får ett värde på varje bar, vilket undviker gamla värden som förs över från tidigare barer.
Exempel
Exempel 1, Klassificera den aktuella baren (Indikator)
// compare the current high with the previous bar's high
IF (High > High[1]) THEN
result = 1
ELSE
result = -1
ENDIF
RETURN resultNär den aktuella högsta överstiger föregående högsta, result är 1, i alla andra fall sätter ELSE-grenen den till -1. Variabeln får garanterat ett nytt värde på varje bar.
Exempel 2, Poängsättning över eller under ett glidande medelvärde (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")Instrument som handlas över 200-periodsmedelvärdet får en procentpoäng, ELSE-grenen nollställer allt annat så att screenervillkoret hålls rent.
Exempel 3, Välja stoppavstånd efter regim (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
ENDIFELSE-grenen ger standardavståndet för stoppen när volatilitetstestet inte uppfylls, så stopDist är definierad innan entrylogiken använder den.
Vanliga fel och fallgropar
- 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.
- Flera ELSE-grenar. Varje IF-sats accepterar högst en ELSE. Ytterligare ömsesidigt uteslutande fall hör till ELSIF-grenar som placeras före ELSE.
- ELSE with its own condition. ELSE takes no condition and no THEN. Writing
ELSE (condition) THENär ett syntaxfel, den villkorliga formen är ELSIF. - Fel grenparning i nästlade block. I nästlade IF-satser binds ELSE till närmaste oavslutade IF. Ett saknat inre ENDIF kopplar tyst ELSE till fel villkor, vilket kompilerar men grenar felaktigt.
Relaterade instruktioner
IF, öppnar det villkorliga blocket som ELSE utökar.ELSIF, villkorliga alternativa grenar som testas före ELSE.ENDIF, avslutar IF/ELSE-blocket.THEN, krävs efter IF- och ELSIF-villkor, aldrig efter ELSE.AND, kombinerar villkor inne i IF-testet.OR, alternativa villkor inuti IF-testet.NOT, negerar ett villkor.