Únete hoy
Instrucciones/probuilder · probacktest · proorder · proscreener

ArraySort

ArraySort ordena los elementos de un array de ProBuilder en orden ascendente o descendente, útil para clasificar valores almacenados dentro de indicadores y estrategias.

Sintaxis

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

Parámetros

NombreTipoPor defectoDescripción
$MyArrayarrayobligatorioLa variable de array cuyos elementos se reordenan.
modepalabra claveobligatorioDirección de ordenación, ya sea ascend (el menor primero) o descend (el mayor primero).

Cómo funciona

ArraySort ordena el array en el sitio: después de la llamada, la misma variable de array contiene los mismos valores en el orden solicitado. No devuelve nada y el orden original se pierde, por lo que hay que hacer una copia antes cuando el orden de inserción todavía importa.

Ordenar convierte el acceso por posición en acceso por rango. Tras una ordenación ascendente, el índice 1 contiene el mínimo, el índice central contiene la mediana y LastSet($array) apunta al máximo. Esto convierte a ArraySort en el bloque estándar para medianas, percentiles y selecciones top-N que las funciones de series integradas no cubren.

El número de elementos llenados se obtiene mejor con LastSet, que devuelve el índice asignado más alto. Iterar hasta un límite fijado en el código mayor que el rango poblado expone a tocar elementos sin asignar.

Ordenar tiene un coste computacional real. Los scripts que ordenan un array grande en cada bar de un histórico largo pueden volverse lentos. Cuando el resultado ordenado solo se necesita para mostrarlo o para una lectura final, envuelve el trabajo en un IsLastBarUpdate para que solo se ejecute en el bar más reciente.

Ejemplos

Ejemplo 1, Ordenar y trazar valores aleatorios (Indicador)

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

El array se rellena con números aleatorios, se ordena en orden descendente y cada valor se dibuja en el gráfico. Limitar el trabajo al último bar mantiene el indicador ágil.

Ejemplo 2, Cierre mediano como filtro de operaciones (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 estrategia ordena una ventana de 21 bars de cierres y lee el elemento 11, la mediana, como filtro de régimen menos sensible a los valores atípicos que una media móvil.

Ejemplo 3, Rango percentil del rango actual (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")

El screener clasifica los rangos de los 50 bars anteriores y marca los instrumentos cuyo rango actual supera el 45.º de 50 valores ordenados, aproximadamente el percentil 90.

Errores y trampas habituales

  • La ordenación es destructiva. ArraySort reordena el propio array. Cuando todavía se necesita el orden de inserción original, copia los elementos en un segundo array antes de ordenarlo.
  • ascend y descend son palabras clave. Se escriben sin más, no como cadenas entre comillas. ArraySort($a, "descend") no compila.
  • Elementos sin asignar. Rellena el array de forma contigua y usa LastSet para conocer su tamaño real. Iterar más allá del rango relleno lee valores sin asignar y puede provocar errores de ejecución.
  • Coste en cada bar. Ordenar un array grande en cada bar de un historial largo ralentiza la ejecución de forma notable. Protege las ordenaciones solo de visualización con IsLastBarUpdate así se ejecutan una vez en el bar en vivo.
  • ArrayMax, el valor más grande de un array sin ordenarlo.
  • ArrayMin, el valor más pequeño de un array sin ordenarlo.
  • IsSet, comprueba si un elemento del array ha sido asignado.
  • LastSet, el índice asignado más alto, en la práctica el tamaño del array.
  • Unset, borra un array o un solo elemento.
  • Random, genera valores pseudoaleatorios, útil para probar código de arrays.
  • IsLastBarUpdate, verdadero solo durante la actualización final de la bar, usado para limitar el trabajo pesado.
  • DrawOnLastBarOnly, restringe la salida de dibujo a la bar más reciente.