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
ArraySort($MyArray, ascend)
ArraySort($MyArray, descend)Parametrar
| Namn | Typ | Standard | Beskrivning |
|---|---|---|---|
$MyArray | array | obligatorisk | Arrayvariabeln vars element ordnas om. |
mode | nyckelord | obligatorisk | Sorteringsriktning, 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)
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 0Arrayen 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)
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 2Strategin 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)
// 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.
ascendochdescendär nyckelord. De skrivs rena, inte som citerade strängar.ArraySort($a, "descend")kompilerar inte.- Otilldelade element. Fyll arrayen sammanhängande och använd
LastSetfö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
IsLastBarUpdateså att de körs en gång på den pågående baren.
Relaterade instruktioner
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.