ArraySort
ArraySort ordent de elementen van een ProBuilder-array in oplopende of aflopende volgorde, nuttig voor het rangschikken van opgeslagen waarden in indicatoren en strategieën.
Syntaxis
ArraySort($MyArray, ascend)
ArraySort($MyArray, descend)Parameters
| Naam | Type | Standaard | Beschrijving |
|---|---|---|---|
$MyArray | array | verplicht | De arrayvariabele waarvan de elementen worden herordend. |
mode | sleutelwoord | verplicht | Sorteerrichting, ofwel ascend (kleinste eerst) of descend (grootste eerst). |
Hoe het werkt
ArraySort sorteert de array ter plekke: na de aanroep bevat dezelfde arrayvariabele dezelfde waarden in de gevraagde volgorde. Er wordt niets teruggegeven en de oorspronkelijke ordening is verloren, dus er moet eerst een kopie worden gemaakt wanneer de invoegvolgorde nog van belang is.
Sorteren verandert toegang op positie in toegang op rang. Na een oplopende sortering bevat index 1 het minimum, de middelste index de mediaan, en LastSet($array) wijst naar het maximum. Dat maakt ArraySort de standaardbouwsteen voor medianen, percentielen en top-N-selecties die de ingebouwde reeksfuncties niet dekken.
Het aantal gevulde elementen haal je het best op met LastSet, die de hoogste toegewezen index retourneert. Itereren tot een hard-coded grens die groter is dan het gevulde bereik riskeert dat je niet-toegewezen elementen aanraakt.
Sorteren kost echt rekentijd. Scripts die op elke bar van een lange historie een grote array sorteren kunnen traag worden. Wanneer het gesorteerde resultaat alleen nodig is voor weergave of een eindwaarde, verpak het werk dan in een IsLastBarUpdate blok zodat het alleen op de meest recente bar wordt uitgevoerd.
Voorbeelden
Voorbeeld 1, Willekeurige waarden sorteren en plotten (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 0De array wordt gevuld met willekeurige getallen, in aflopende volgorde gesorteerd, en elke waarde wordt op de grafiek getekend. Door het werk tot de laatste bar te beperken blijft de indicator snel reageren.
Voorbeeld 2, Mediane close als tradefilter (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 2De strategie sorteert een venster van 21 bars met closes en leest element 11, de mediaan, als regimefilter dat minder gevoelig is voor uitschieters dan een moving average.
Voorbeeld 3, Percentielrang van de huidige range (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")De screener rangschikt de ranges van de vorige 50 bars en markeert instrumenten waarvan de huidige range de 45e van 50 gesorteerde waarden overtreft, ongeveer het 90e percentiel.
Veelvoorkomende fouten en valkuilen
- Sorteren is destructief. ArraySort herordent de array zelf. Wanneer de oorspronkelijke invoegorde nog nodig is, kopieer de elementen naar een tweede array voordat je sorteert.
ascendendescendzijn sleutelwoorden. Ze worden kaal geschreven, niet als strings tussen aanhalingstekens.ArraySort($a, "descend")compileert niet.- Niet-toegewezen elementen. Vul de array aaneengesloten en gebruik
LastSetom de werkelijke grootte te vinden. Verder lussen dan het gevulde bereik leest niet-toegekende waarden en kan runtimefouten veroorzaken. - Kosten op elke bar. Een grote array op elke bar van een lange historie sorteren vertraagt de uitvoering merkbaar. Beveilig sorteringen die alleen voor weergave zijn met
IsLastBarUpdatezodat ze één keer op de live bar lopen.
Gerelateerde instructies
ArrayMax, grootste waarde van een array zonder te sorteren.ArrayMin, kleinste waarde van een array zonder te sorteren.IsSet, test of een arrayelement is toegewezen.LastSet, hoogste toegewezen index, in feite de arraygrootte.Unset, wist een array of een enkel element.Random, genereert pseudorandom waarden, nuttig voor het testen van arraycode.IsLastBarUpdate, alleen true tijdens de laatste barupdate, gebruikt om zwaar werk te beperken.DrawOnLastBarOnly, beperkt de tekenuitvoer tot de meest recente bar.