Wie finde ich den nächsten Wert im Pinescript-Array?
Sep 29 2020
In Pine Script habe ich ein Array namens Levels. Dort füge ich mehrere Werte hinzu und sortiere sie aus. Jetzt möchte ich den Wert finden, der dem aktuellen Preis am nächsten kommt. Wie mache ich das?
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()
Antworten
2 PineCoders-LucF Sep 30 2020 at 02:51
Version 1
Es gibt derzeit keine Array-Funktion, um dies zu erreichen, aber wir können eine benutzerdefinierte Funktion erstellen, um dies zu tun. Es gibt den Index des ersten Auftretens des Werts im Array ab dem Anfang des Arrays zurück:
arrayFind(_id, _val) =>
int _return = na
for _i = 0 to array.size(_id) - 1
if array.get(_id, _i) == _val
_return := _i
break
_return
Sie könnten es so verwenden:
plot(arrayFind(levels, close))
Version 2
Ich bin mir nicht sicher, was ich dort dachte, aber:
- Meine Antwort ist funktional nicht korrekt, da sie Ihren Anforderungen nicht entspricht. Es wird nur dann ein Wert gefunden, wenn sich dieser genaue Wert im Array befindet, während Sie nach dem Index des nächsten Werts im Array gefragt haben.
- Mit vorhandenen Array-Funktionen können wir bereits den Index des ersten oder letzten Auftretens eines Werts in einem Array ermitteln: array.indexof()und array.lastindexof(). Sie können also
array.indexof(levels, close)stattdessen die integrierte Funktion verwendenarrayFind(levels, close).
Die richtige Antwort auf Ihre Frage wäre:
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
Dies würde den Index der engsten Übereinstimmung eines Werts in einem Array zurückgeben.