ArraySort
ArraySort ordina gli elementi di un array ProBuilder in ordine crescente o decrescente, utile per classificare i valori memorizzati all'interno di indicatori e strategie.
Sintassi
ArraySort($MyArray, ascend)
ArraySort($MyArray, descend)Parametri
| Nome | Tipo | Predefinito | Descrizione |
|---|---|---|---|
$MyArray | array | obbligatorio | La variabile array i cui elementi vengono riordinati. |
mode | parola chiave | obbligatorio | Direzione di ordinamento, o ascend (prima la più piccola) o descend (dal più grande). |
Come funziona
ArraySort ordina l'array sul posto: dopo la chiamata, la stessa variabile array contiene gli stessi valori nell'ordine richiesto. Non viene restituito nulla e l'ordinamento originale va perduto, quindi occorre prima fare una copia quando l'ordine di inserimento è ancora importante.
L'ordinamento trasforma l'accesso posizionale in accesso per rango. Dopo un ordinamento crescente, l'indice 1 contiene il minimo, l'indice centrale contiene la mediana e LastSet($array) punta al massimo. Questo rende ArraySort il mattone standard per mediane, percentili e selezioni top-N che le funzioni di serie integrate non coprono.
Il numero di elementi popolati si ottiene al meglio con LastSet, che restituisce l'indice assegnato più alto. Iterare fino a un limite scritto a codice più grande dell'intervallo popolato rischia di toccare elementi non assegnati.
L'ordinamento ha un costo computazionale reale. Gli script che ordinano un array di grandi dimensioni su ogni bar di uno storico lungo possono diventare lenti. Quando il risultato ordinato serve solo per la visualizzazione o per una lettura finale, racchiudi il lavoro in un IsLastBarUpdate blocco così da eseguirsi solo sulla bar più recente.
Esempi
Esempio 1, Ordinare e tracciare valori casuali (Indicatore)
DEFPARAM DrawOnLastBarOnly = true
IF IsLastBarUpdate THEN
// Fill an array with 100 random values
FOR i = 1 TO 100 DO
$a[i] = Random(0, 1000)
NEXT
// Order the values from largest to smallest
ArraySort($a, descend)
// Print each sorted value on the chart
FOR i = 1 TO LastSet($a) DO
DRAWTEXT($a[i], barindex, i, sansserif, standard, 14)
NEXT
ENDIF
RETURN 0L'array viene popolato con numeri casuali, ordinato in ordine decrescente, e ogni valore viene disegnato sul grafico. Limitare il lavoro all'ultima bar mantiene l'indicatore reattivo.
Esempio 2, Chiusura mediana come filtro per le operazioni (ProOrder)
DEFPARAM CumulateOrders = false
// Copy the last 21 closes into an array
FOR i = 0 TO 20 DO
$window[i + 1] = close[i]
NEXT
// Sort ascending, then read the middle element as the median
ArraySort($window, ascend)
medianClose = $window[11]
// Only take long entries while price holds above its median
IF close > medianClose AND Average[10](close) CROSSES OVER Average[40](close) THEN
BUY 1 CONTRACT AT MARKET
ENDIF
SET STOP %LOSS 2La strategia ordina una finestra di 21 bar di chiusure e legge l'elemento 11, la mediana, come filtro di regime meno sensibile ai valori anomali rispetto a una media mobile.
Esempio 3, Rango percentile del range corrente (ProScreener)
// Store the bar ranges of the previous 50 bars
FOR i = 1 TO 50 DO
$ranges[i] = high[i] - low[i]
NEXT
// Sort ascending so high indices hold the widest ranges
ArraySort($ranges, ascend)
// Keep instruments whose current range beats the 90th percentile
threshold = $ranges[45]
SCREENER[(high - low) > threshold] ((high - low) AS "Bar range")Lo screener classifica i range delle 50 bar precedenti e segnala gli strumenti il cui range corrente supera il 45° dei 50 valori ordinati, circa il 90° percentile.
Errori e insidie comuni
- L'ordinamento è distruttivo. ArraySort riordina l'array stesso. Quando serve ancora l'ordine di inserimento originale, copia gli elementi in un secondo array prima di ordinarli.
ascendedescendsono parole chiave. Si scrivono nude, non come stringhe tra virgolette.ArraySort($a, "descend")non compila.- Elementi non assegnati. Popola l'array in modo contiguo e usa
LastSetper trovarne la dimensione reale. Ciclare oltre l'intervallo popolato legge valori non assegnati e può causare errori di runtime. - Costo su ogni bar. Ordinare un array grande su ogni bar di una storia lunga rallenta l'esecuzione in modo sensibile. Proteggi gli ordinamenti di sola visualizzazione con
IsLastBarUpdatecosì vengono eseguiti una volta sulla bar in corso.
Istruzioni correlate
ArrayMax, il valore più grande di un array senza ordinamento.ArrayMin, il valore più piccolo di un array senza ordinamento.IsSet, verifica se un elemento dell'array è stato assegnato.LastSet, l'indice assegnato più alto, di fatto la dimensione dell'array.Unset, svuota un array o un singolo elemento.Random, genera valori pseudo-casuali, utile per testare il codice degli array.IsLastBarUpdate, vero solo durante l'aggiornamento finale della bar, usato per limitare il lavoro pesante.DrawOnLastBarOnly, limita l'output di disegno alla bar più recente.