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
ArraySort($MyArray, ascend)
ArraySort($MyArray, descend)Parámetros
| Nombre | Tipo | Por defecto | Descripción |
|---|---|---|---|
$MyArray | array | obligatorio | La variable de array cuyos elementos se reordenan. |
mode | palabra clave | obligatorio | Direcció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)
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 0El 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)
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 2La 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)
// 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.
ascendydescendson 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
LastSetpara 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
IsLastBarUpdateasí se ejecutan una vez en el bar en vivo.
Instrucciones relacionadas
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.