Come trovare il valore più vicino nell'array pinescript?

Sep 29 2020

In pine script, ho un array chiamato livelli. Lì, aggiungo diversi valori e lo risolvo. Ora voglio trovare il valore più vicino da quell'array al prezzo corrente. Come lo faccio?

levels = array.new_float(size = 3, initial_value = na)

// push all value into array
array.push(levels, valOne) 
array.push(levels, valTwo) 
array.push(levels, valThree) 
.......

// sort the array
array.sort(levels, order.ascending)

// get s r value
supportForLong = array.min(levels) // I want to find the closest value in level and not min
resistanceForLong = array.max(levels)


plot(supportForLong, color = black)
plot(resistanceForLong, color = black)
// clear all element for next iteration
array.clear()

Risposte

2 PineCoders-LucF Sep 30 2020 at 02:51

Versione 1

Al momento non esiste una funzione di matrice per eseguire ciò, ma possiamo creare una funzione personalizzata per farlo. Restituisce l'indice della prima occorrenza del valore nell'array, a partire dall'inizio dell'array:

arrayFind(_id, _val) =>
    int _return = na
    for _i = 0 to array.size(_id) - 1
        if array.get(_id, _i) == _val
            _return := _i
            break
    _return

Potresti usarlo in questo modo:

plot(arrayFind(levels, close))

Versione 2

Non sono troppo sicuro di cosa stessi pensando lì, ma:

  1. La mia risposta non è funzionalmente corretta in quanto non soddisfa le tue esigenze. Trova un valore solo se quel valore esatto è nell'array, mentre hai chiesto l'indice del valore più vicino nell'array.
  2. Le funzioni array esistenti ci consentono già di trovare l'indice della prima o dell'ultima occorrenza di un valore in un array: array.indexof()e array.lastindexof(). Quindi potresti usare il built-in array.indexof(levels, close)invece di arrayFind(levels, close).

La risposta corretta alla tua domanda sarebbe:

arrayIndexOfClosest(_id, _val) =>
    size = array.size(_id)
    int _return = na
    if size != 0
        delta = abs(array.get(_id, 0) - _val)
        _return := 0
        for _i = 1 to size - 1
            thisDelta = abs(array.get(_id, _i) - _val)
            if thisDelta < delta
                delta := thisDelta
                _return := _i
    _return

Ciò restituirebbe l'indice della corrispondenza più vicina di un valore in un array.