Bli medlem idag
Instruktioner/probuilder · probacktest · proorder · proscreener

ArraySort

ArraySort ordnar elementen i en ProBuilder-array i stigande eller fallande ordning, användbart för att rangordna lagrade värden inuti indikatorer och strategier.

Syntax

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

Parametrar

NamnTypStandardBeskrivning
$MyArrayarrayobligatoriskArrayvariabeln vars element ordnas om.
modenyckelordobligatoriskSorteringsriktning, antingen ascend (minsta först) eller descend (störst först).

Så fungerar det

ArraySort sorterar arrayen på plats: efter anropet innehåller samma arrayvariabel samma värden i den begärda ordningen. Inget returneras och den ursprungliga ordningen går förlorad, så en kopia måste göras först när insättningsordningen fortfarande har betydelse.

Sortering förvandlar positionsåtkomst till rangåtkomst. Efter en stigande sortering innehåller index 1 minimum, mittenindexet innehåller medianen och LastSet($array) pekar på maximum. Det gör ArraySort till standardbyggstenen för medianer, percentiler och top-N-urval som de inbyggda seriefunktionerna inte täcker.

Antalet fyllda element hämtas bäst med LastSet, som returnerar det högsta tilldelade indexet. Att iterera upp till en hårdkodad gräns som är större än det fyllda intervallet riskerar att röra otilldelade element.

Sortering har en verklig beräkningskostnad. Skript som sorterar en stor array på varje bar i en lång historik kan bli långsamma. När det sorterade resultatet bara behövs för visning eller en slutlig avläsning, lägg arbetet i ett IsLastBarUpdate block så att den bara körs på den senaste baren.

Exempel

Exempel 1, Sortera och rita slumpmässiga värden (Indicator)

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

Arrayen fylls med slumptal, sorteras i fallande ordning och varje värde ritas ut i diagrammet. Att begränsa arbetet till den sista baren håller indikatorn responsiv.

Exempel 2, Medianstängning 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

Strategin sorterar ett fönster på 21 barer med stängningskurser och läser element 11, medianen, som ett regimfilter som är mindre känsligt för extremvärden än ett glidande medelvärde.

Exempel 3, Percentilrang för det aktuella intervallet (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")

Screenern rangordnar de föregående 50 barernas range och flaggar instrument vars aktuella range överstiger det 45:e av 50 sorterade värden, ungefär 90:e percentilen.

Vanliga fel och fallgropar

  • Sortering är destruktiv. ArraySort omordnar arrayen själv. När den ursprungliga insättningsordningen fortfarande behövs, kopiera elementen till en andra array innan sorteringen.
  • ascend och descend är nyckelord. De skrivs rena, inte som citerade strängar. ArraySort($a, "descend") kompilerar inte.
  • Otilldelade element. Fyll arrayen sammanhängande och använd LastSet för att hitta dess verkliga storlek. Att loopa förbi det ifyllda intervallet läser otilldelade värden och kan orsaka körningsfel.
  • Kostnad på varje bar. Att sortera en stor array på varje bar i en lång historik gör körningen märkbart långsammare. Skydda sorteringar som bara är för visning med IsLastBarUpdate så att de körs en gång på den pågående baren.
  • ArrayMax, största värdet i en array utan sortering.
  • ArrayMin, minsta värdet i en array utan sortering.
  • IsSet, testar om ett arrayelement har tilldelats.
  • LastSet, högsta tilldelade index, i praktiken arrayens storlek.
  • Unset, rensar en array eller ett enskilt element.
  • Random, genererar pseudoslumpmässiga värden, användbart för att testa arraykod.
  • IsLastBarUpdate, true endast under den sista baruppdateringen, används för att begränsa tungt arbete.
  • DrawOnLastBarOnly, begränsar ritutdata till den senaste baren.