Iscriviti ora
Istruzioni/probuilder · probacktest · proorder · proscreener

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

probuilder
ArraySort($MyArray, ascend)
ArraySort($MyArray, descend)

Parametri

NomeTipoPredefinitoDescrizione
$MyArrayarrayobbligatorioLa variabile array i cui elementi vengono riordinati.
modeparola chiaveobbligatorioDirezione 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)

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

L'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)

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

La 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)

probuilder
// 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.
  • ascend e descend sono 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 LastSet per 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 IsLastBarUpdate così vengono eseguiti una volta sulla bar in corso.
  • 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.