Bli medlem i dag
Instruksjoner/probuilder · probacktest · proorder · proscreener

ArraySort

ArraySort sorterer elementene i et ProBuilder-array i stigende eller synkende rekkefølge, nyttig for å rangere lagrede verdier inne i indikatorer og strategier.

Syntaks

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

Parametere

NavnTypeStandardBeskrivelse
$MyArrayarraypåkrevdArrayvariabelen hvis elementer omorganiseres.
modenøkkelordpåkrevdSorteringsretning, enten ascend (minste først) eller descend (største først).

Slik fungerer det

ArraySort sorterer arrayet på stedet: etter kallet inneholder samme arrayvariabel de samme verdiene i den forespurte rekkefølgen. Ingenting returneres, og den opprinnelige rekkefølgen går tapt, så en kopi må lages først når innsettingsrekkefølgen fortsatt har betydning.

Sortering gjør posisjonstilgang om til rangtilgang. Etter en stigende sortering holder indeks 1 minimumet, midtindeksen holder medianen, og LastSet($array) peker til maksimum. Dette gjør ArraySort til den standard byggesteinen for medianer, persentiler og topp-N-utvalg som de innebygde seriefunksjonene ikke dekker.

Antall utfylte elementer hentes best med LastSet, som returnerer den høyeste tildelte indeksen. Å iterere opp til en hardkodet grense som er større enn det utfylte området, risikerer å berøre utildelte elementer.

Sortering har en reell beregningskostnad. Skript som sorterer et stort array på hver bar gjennom en lang historikk kan bli langsomme. Når det sorterte resultatet bare trengs for visning eller en sluttverdi, pakk arbeidet inn i en IsLastBarUpdate blokk slik at den bare kjører på den siste baren.

Eksempler

Eksempel 1, Sorter og tegn tilfeldige verdier (Indikator)

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

Arrayet fylles med tilfeldige tall, sorteres i synkende rekkefølge, og hver verdi tegnes i diagrammet. Å begrense arbeidet til siste bar holder indikatoren responsiv.

Eksempel 2, Median sluttkurs som handelsfilter (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

Strategien sorterer et vindu på 21 barer med sluttkurser og leser element 11, medianen, som et regimefilter som er mindre følsomt for uteliggere enn et glidende gjennomsnitt.

Eksempel 3, Persentilrangering av gjeldende range (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")

Screeneren rangerer de 50 forrige bar-rangene og markerer instrumenter der gjeldende range overstiger den 45. av 50 sorterte verdier, omtrent den 90. persentilen.

Vanlige feil og fallgruver

  • Sortering er destruktiv. ArraySort omorganiserer arrayet selv. Når den opprinnelige innsettingsrekkefølgen fortsatt trengs, kopier elementene til et annet array før sortering.
  • ascend og descend er nøkkelord. De skrives uten anførselstegn, ikke som strenger. ArraySort($a, "descend") kompilerer ikke.
  • Ikke-tilordnede elementer. Fyll arrayet sammenhengende og bruk LastSet for å finne den faktiske størrelsen. Å løkke forbi det utfylte området leser verdier som ikke er tilordnet, og kan gi kjøretidsfeil.
  • Kostnad på hver bar. Å sortere et stort array på hver bar gjennom en lang historikk bremser kjøringen merkbart. Beskytt sorteringer som kun er for visning med IsLastBarUpdate slik at de kjører én gang på den aktive baren.
  • ArrayMax, største verdi i et array uten sortering.
  • ArrayMin, minste verdi i et array uten sortering.
  • IsSet, tester om et arrayelement er tilordnet.
  • LastSet, høyeste tilordnede indeks, i praksis arrayets størrelse.
  • Unset, tømmer en array eller et enkelt element.
  • Random, genererer pseudotilfeldige verdier, nyttig for å teste arraykode.
  • IsLastBarUpdate, true bare under den siste baroppdateringen, brukt for å begrense tungt arbeid.
  • DrawOnLastBarOnly, begrenser tegneutdata til den nyeste baren.