Iscriviti ora
Istruzioni/probuilder · probacktest · proorder · proscreener

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.

Sintassi

probuilder
IF (condition) THEN
  // statements when the condition is true
ELSE
  // statements when the condition is false
ENDIF

Come funziona

Un'istruzione IF da sola esegue il suo blocco oppure non fa nulla. Aggiungendo ELSE diventa una diramazione a due vie: esattamente uno dei due blocchi viene eseguito su ogni bar, mai entrambi e mai nessuno dei due. L'esecuzione prosegue poi dopo ENDIF indipendentemente da quale ramo è stato eseguito.

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.

Poiché un ramo viene sempre eseguito, una coppia IF/ELSE è il modo idiomatico per garantire che una variabile riceva un valore su ogni bar, evitando valori obsoleti trascinati dalle bar precedenti.

Esempi

Esempio 1, Classificare la bar corrente (Indicatore)

probuilder
// compare the current high with the previous bar's high
IF (High > High[1]) THEN
  result = 1
ELSE
  result = -1
ENDIF
RETURN result

Quando il massimo corrente supera il massimo precedente, result è 1, in ogni altro caso il ramo ELSE lo imposta a -1. Alla variabile è garantito un valore nuovo su ogni bar.

Esempio 2, Punteggio sopra o sotto una media mobile (ProScreener)

probuilder
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")

Gli strumenti che quotano sopra la media a 200 periodi ricevono un punteggio percentuale, il ramo ELSE azzera tutto il resto così la condizione dello screener resta pulita.

Esempio 3, Scegliere la distanza dello stop in base al regime (ProOrder)

probuilder
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
ENDIF

Il ramo ELSE fornisce la distanza di stop predefinita ogni volta che il test di volatilità non è superato, quindi stopDist sia definito prima che la logica di ingresso lo utilizzi.

Errori e insidie comuni

  • 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.
  • Più rami ELSE. Ogni istruzione IF accetta al massimo un ELSE. Ulteriori casi mutuamente esclusivi vanno inseriti in rami ELSIF posti prima dell'ELSE.
  • ELSE with its own condition. ELSE takes no condition and no THEN. Writing ELSE (condition) THEN è un errore di sintassi, la forma condizionale è ELSIF.
  • Abbinamento errato dei rami nei blocchi annidati. Nelle istruzioni IF annidate, ELSE si lega all'IF non chiuso più vicino. L'omissione di un ENDIF interno collega silenziosamente l'ELSE alla condizione sbagliata, il che compila ma dirama in modo errato.
  • IF, apre il blocco condizionale che ELSE estende.
  • ELSIF, rami alternativi condizionali testati prima di ELSE.
  • ENDIF, chiude il blocco IF/ELSE.
  • THEN, obbligatorio dopo le condizioni IF ed ELSIF, mai dopo ELSE.
  • AND, combina condizioni all'interno del test IF.
  • OR, condizioni alternative all'interno del test IF.
  • NOT, nega una condizione.