WEND
WEND segna la fine di un ciclo WHILE in ProBuilder. Quando l'esecuzione raggiunge WEND, la condizione del ciclo viene valutata di nuovo per decidere se ripetere o uscire.
Sintassi
WHILE condition DO
// statements repeated while the condition is true
WENDCome funziona
WEND non è un'istruzione indipendente. Esiste solo come terminatore di un blocco WHILE, nello stesso modo in cui NEXT termina un blocco FOR ed ENDIF termina un blocco IF. Tutto ciò che si trova tra l'intestazione WHILE e WEND costituisce il corpo del ciclo.
Quando l'esecuzione raggiunge WEND, il controllo torna alla riga WHILE e la condizione viene verificata di nuovo. Un risultato vero esegue il corpo un'altra volta, un risultato falso trasferisce l'esecuzione alla prima istruzione dopo WEND. La condizione viene quindi verificata una volta per passaggio, sempre all'inizio, mai a WEND stesso, quindi un ciclo WHILE non può comportarsi come un ciclo do-while che garantisce almeno un passaggio.
Uno script con un WHILE senza il WEND corrispondente non compila. Nei cicli annidati, ogni WEND chiude il WHILE non chiuso più vicino sopra di esso.
Esempi
Esempio 1, Chiudere un ciclo di conteggio (Indicatore)
i = 0
Count = 0
WHILE i <> 11 DO
// each pass advances the counter by one
i = i + 1
Count = Count + 1
WEND
RETURN CountOgni volta che l'esecuzione raggiunge WEND, la condizione i <> 11 viene testata di nuovo. Dopo 11 passaggi il test fallisce, il ciclo termina su WEND e l'indicatore restituisce 11.
Esempio 2, Bar dall'ultima chiusura al ribasso (ProScreener)
n = 0
// step backward until a bar closed below its open
WHILE close[n] >= open[n] AND n < 50 DO
n = n + 1
WEND
SCREENER[n >= 5] (n AS "Bars since down close")WEND riporta il controllo alla condizione dopo ogni passo indietro. Lo screener elenca gli strumenti i cui ultimi 5 o più bar hanno chiuso tutti pari o sopra la loro apertura.
Esempio 3, Avvicinare a passi un livello trailing al prezzo (ProOrder)
DEFPARAM CumulateOrders = false
IF NOT onmarket AND close CROSSES OVER Average[20](close) THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// raise the stop level in fixed steps while it lags the market
step = AverageTrueRange[14](close)
stopLevel = positionprice - 2 * step
WHILE stopLevel + 3 * step < close DO
stopLevel = stopLevel + step
WEND
IF onmarket THEN
SELL AT stopLevel STOP
ENDIFIl ciclo alza il livello di stop un passo alla volta. Ogni passaggio termina a WEND, dove il controllo della distanza decide se è necessario un altro passo.
Errori e insidie comuni
- WEND mancante. Ogni WHILE richiede esattamente un WEND. Il compilatore segnala spesso il problema alla fine dello script anziché sul ciclo non chiuso, quindi conta le coppie WHILE e WEND quando la posizione dell'errore sembra sbagliata.
- Confondere WEND con ENDIF o NEXT. Ogni tipo di blocco ha il proprio terminatore. Chiudere un WHILE con ENDIF, o un IF con WEND, è un errore di sintassi anche quando l'indentazione sembra coerente.
- Aspettarsi un test in fondo al ciclo. La condizione viene valutata alla riga WHILE, non a WEND. Il codice che si basa sull'esecuzione del corpo almeno una volta deve assicurarsi che la condizione sia vera prima dell'inizio del ciclo.
- Istruzioni dopo WEND nel ciclo previsto. Si ripetono solo le righe tra WHILE e WEND. Un'istruzione posta per errore dopo WEND viene eseguita una volta per bar anziché una volta per passaggio.