Rejoignez-nous
Instructions/probuilder · probacktest · proorder · proscreener

ArraySort

ArraySort ordonne les éléments d'un tableau ProBuilder par ordre croissant ou décroissant, utile pour classer des valeurs stockées dans les indicateurs et les stratégies.

Syntaxe

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

Paramètres

NomTypePar défautDescription
$MyArraytableaurequisLa variable de tableau dont les éléments sont réordonnés.
modemot-clérequisSens du tri, soit ascend (le plus petit d'abord) ou descend (le plus grand d'abord).

Comment ça marche

ArraySort trie le tableau sur place : après l'appel, la même variable de tableau contient les mêmes valeurs dans l'ordre demandé. Rien n'est renvoyé et l'ordre d'origine est perdu, il faut donc faire une copie au préalable lorsque l'ordre d'insertion importe encore.

Le tri transforme l'accès par position en accès par rang. Après un tri croissant, l'indice 1 contient le minimum, l'indice médian contient la médiane, et LastSet($array) pointe vers le maximum. ArraySort est de ce fait la brique standard pour les médianes, les percentiles et les sélections des N premiers que les fonctions de série intégrées ne couvrent pas.

Le nombre d'éléments remplis s'obtient au mieux avec LastSet, qui renvoie l'indice assigné le plus élevé. Itérer jusqu'à une borne codée en dur supérieure à la plage remplie risque de toucher des éléments non assignés.

Le tri a un coût de calcul réel. Les scripts qui trient un grand tableau sur chaque bar d'un long historique peuvent devenir lents. Lorsque le résultat trié n'est nécessaire que pour l'affichage ou une lecture finale, enveloppez le travail dans un IsLastBarUpdate bloc afin qu'il ne s'exécute que sur le bar le plus récent.

Exemples

Exemple 1, Trier et tracer des valeurs aléatoires (Indicateur)

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

Le tableau est rempli de nombres aléatoires, trié par ordre décroissant, et chaque valeur est tracée sur le graphique. Limiter le travail au dernier bar maintient l'indicateur réactif.

Exemple 2, Clôture médiane comme filtre de trade (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

La stratégie trie une fenêtre de 21 bars de clôtures et lit l'élément 11, la médiane, comme filtre de régime moins sensible aux valeurs aberrantes qu'une moyenne mobile.

Exemple 3, Rang centile de l'amplitude actuelle (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")

Le screener classe les amplitudes des 50 bars précédents et signale les instruments dont l'amplitude actuelle dépasse la 45e des 50 valeurs triées, soit environ le 90e centile.

Erreurs et pièges courants

  • Le tri est destructif. ArraySort réordonne le tableau lui-même. Lorsque l'ordre d'insertion d'origine est encore nécessaire, copiez les éléments dans un second tableau avant de trier.
  • ascend et descend sont des mots-clés. Ils s'écrivent tels quels, sans guillemets. ArraySort($a, "descend") ne compile pas.
  • Éléments non assignés. Remplissez le tableau de façon contiguë et utilisez LastSet pour connaître sa taille réelle. Boucler au-delà de la plage remplie lit des valeurs non affectées et peut provoquer des erreurs d'exécution.
  • Coût sur chaque bar. Trier un grand tableau à chaque barre sur un historique long ralentit sensiblement l'exécution. Protégez les tris purement destinés à l'affichage avec IsLastBarUpdate pour qu'ils s'exécutent une fois sur la bar en cours.
  • ArrayMax, la plus grande valeur d'un tableau sans tri.
  • ArrayMin, la plus petite valeur d'un tableau sans tri.
  • IsSet, teste si un élément du tableau a été assigné.
  • LastSet, l'indice assigné le plus élevé, en pratique la taille du tableau.
  • Unset, efface un tableau ou un seul élément.
  • Random, génère des valeurs pseudo-aléatoires, utile pour tester du code de tableau.
  • IsLastBarUpdate, vrai uniquement lors de la mise à jour de la dernière bar, utilisé pour limiter les traitements lourds.
  • DrawOnLastBarOnly, restreint la sortie graphique à la bar la plus récente.