Jetzt beitreten
Befehle/probuilder · probacktest · proorder · proscreener

ArraySort

ArraySort ordnet die Elemente eines ProBuilder-Arrays in aufsteigender oder absteigender Reihenfolge, nützlich für die Rangfolge gespeicherter Werte in Indikatoren und Strategien.

Syntax

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

Parameter

NameTypStandardBeschreibung
$MyArrayArrayerforderlichDie Array-Variable, deren Elemente neu geordnet werden.
modeSchlüsselworterforderlichSortierrichtung, entweder ascend (kleinster zuerst) oder descend (größte zuerst).

So funktioniert es

ArraySort sortiert das Array direkt an seinem Platz: Nach dem Aufruf enthält dieselbe Array-Variable dieselben Werte in der gewünschten Reihenfolge. Es wird nichts zurückgegeben und die ursprüngliche Reihenfolge ist verloren, daher muss zuerst eine Kopie angelegt werden, wenn die Einfügereihenfolge noch wichtig ist.

Sortieren verwandelt positionsbasierten Zugriff in rangbasierten Zugriff. Nach einer aufsteigenden Sortierung enthält Index 1 das Minimum, der mittlere Index den Median, und LastSet($array) zeigt auf das Maximum. Das macht ArraySort zum Standardbaustein für Mediane, Perzentile und Top-N-Auswahlen, die die eingebauten Serienfunktionen nicht abdecken.

Die Anzahl der befüllten Elemente erhält man am besten mit LastSet, das den höchsten zugewiesenen Index zurückgibt. Eine Iteration bis zu einer fest codierten Grenze oberhalb des belegten Bereichs riskiert den Zugriff auf nicht zugewiesene Elemente.

Sortieren hat echte Rechenkosten. Skripte, die auf jedem Bar einer langen Historie ein großes Array sortieren, können langsam werden. Wenn das sortierte Ergebnis nur für die Anzeige oder einen Endwert gebraucht wird, kapseln Sie die Arbeit in ein IsLastBarUpdate Block, damit er nur auf dem letzten Bar ausgeführt wird.

Beispiele

Beispiel 1, Zufallswerte sortieren und zeichnen (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

Das Array wird mit Zufallszahlen gefüllt, absteigend sortiert, und jeder Wert wird im Chart gezeichnet. Die Beschränkung der Arbeit auf den letzten Bar hält den Indikator reaktionsschnell.

Beispiel 2, Median-Close als Trade-Filter (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

Die Strategie sortiert ein Fenster von 21 Bars mit Schlusskursen und liest Element 11, den Median, als Regimefilter, der weniger empfindlich gegenüber Ausreißern ist als ein gleitender Durchschnitt.

Beispiel 3, Perzentilrang der aktuellen 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")

Der Screener sortiert die vorherigen 50 Bar-Ranges und markiert Instrumente, deren aktuelle Range den 45. von 50 sortierten Werten übersteigt, also etwa das 90. Perzentil.

Häufige Fehler und Stolperfallen

  • Sortieren ist destruktiv. ArraySort ordnet das Array selbst um. Wenn die ursprüngliche Einfügereihenfolge noch benötigt wird, kopieren Sie die Elemente vor dem Sortieren in ein zweites Array.
  • ascend und descend sind Schlüsselwörter. Sie werden direkt geschrieben, nicht als Strings in Anführungszeichen. ArraySort($a, "descend") lässt sich nicht kompilieren.
  • Nicht zugewiesene Elemente. Füllen Sie das Array lückenlos und verwenden Sie LastSet um seine wahre Größe zu ermitteln. Eine Schleife über den belegten Bereich hinaus liest nicht zugewiesene Werte und kann Laufzeitfehler verursachen.
  • Kosten auf jedem Bar. Das Sortieren eines großen Arrays auf jedem Bar einer langen Historie bremst die Ausführung merklich. Schützen Sie reine Anzeige-Sortierungen mit IsLastBarUpdate sodass sie einmal auf dem Live-Bar laufen.
  • ArrayMax, größter Wert eines Arrays ohne Sortieren.
  • ArrayMin, kleinster Wert eines Arrays ohne Sortieren.
  • IsSet, prüft, ob ein Array-Element zugewiesen wurde.
  • LastSet, höchster zugewiesener Index, praktisch die Array-Größe.
  • Unset, löscht ein Array oder ein einzelnes Element.
  • Random, erzeugt Pseudozufallswerte, nützlich zum Testen von Array-Code.
  • IsLastBarUpdate, nur während der letzten Bar-Aktualisierung true, wird verwendet, um aufwendige Arbeit zu begrenzen.
  • DrawOnLastBarOnly, beschränkt die Zeichenausgabe auf den letzten Bar.