BarsSince
BarsSince zählt in ProBuilder die Anzahl der Bars, die seit der letzten Erfüllung einer Bedingung vergangen sind. Verfolgen Sie, wie lange eine Kreuzung oder ein Signal im Chart zurückliegt.
Syntax
BarsSince(Condition)
BarsSince(Condition, Occurrence)Parameter
| Name | Typ | Standard | Beschreibung |
|---|---|---|---|
Condition | Boolean | erforderlich | Der Ausdruck, dessen jüngste wahre Auswertung gemessen wird. |
Occurrence | Ganzzahl | 0 | Welches Vorkommen gemessen wird. 0 zielt auf das jüngste, 1 auf das davorliegende und so weiter. |
So funktioniert es
BarsSince läuft vom aktuellen Bar aus rückwärts und zählt, wie viele Bars ihn von dem Bar trennen, auf dem die Bedingung letztmals als wahr ausgewertet wurde. Ein Ergebnis von 0 bedeutet, dass die Bedingung auf dem aktuellen Bar wahr ist, 1 bedeutet, dass sie auf dem vorherigen Bar wahr war, und größere Werte zeigen ältere Ereignisse an.
Das optionale zweite Argument wählt frühere Vorkommen aus. BarsSince(cond) und BarsSince(cond, 0) sind gleichwertig und beziehen sich auf das letzte Auftreten; BarsSince(cond, 1) misst den Abstand zum davor liegenden Auftreten. Der Vergleich beider zeigt den Abstand zwischen aufeinanderfolgenden Ereignissen, zum Beispiel die Anzahl der Bars zwischen den letzten beiden Oszillator-Kreuzungen.
Wenn die Bedingung in der ausgewerteten Historie nirgends wahr war, gibt die Funktion -1 zurück. Dieser Sentinel-Wert muss ausdrücklich behandelt werden, weil -1 numerische Vergleiche besteht wie < 10 und kann unbemerkt Aktualitätsfilter erfüllen, die ein echtes Ereignis verlangen sollten.
Typische Anwendungen sind Frischefilter (nur handeln, wenn ein Signal innerhalb der letzten n Bars ausgelöst wurde), Abkühl-Timer (Wiedereinstieg blockieren, bis genügend Bars vergangen sind) und Dauermessungen zwischen Chart-Ereignissen.
Beispiele
Beispiel 1, Abstand zu den letzten zwei RSI-Kreuzungen (Indikator)
// Condition: 14-period RSI crosses above 50
a = RSI[14] CROSSES OVER 50
// Bars since the previous occurrence and the most recent one
testA = BarsSince(a, 1)
testB = BarsSince(a)
RETURN testA AS "previous occurrence", testB AS "last occurrence"Der Indikator zeichnet das Alter in Bars der jüngsten RSI-Kreuzung über 50 und der davorliegenden. Der Abstand zwischen den beiden Linien ist der Abstand zwischen aufeinanderfolgenden Kreuzungen.
Beispiel 2, Abkühlphase beim Einstieg (ProOrder)
DEFPARAM CumulateOrders = false
signal = Average[10](close) CROSSES OVER Average[40](close)
sinceSignal = BarsSince(signal)
// Trade the crossover, but not if another one fired within the last 10 bars
IF signal AND (BarsSince(signal, 1) > 10 OR BarsSince(signal, 1) = -1) THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// Time-based exit once the signal is 20 bars old
IF LONGONMARKET AND sinceSignal >= 20 THEN
SELL AT MARKET
ENDIFBarsSince erfüllt hier zwei Rollen: Vorkommen 1 erzwingt eine Abkühlphase zwischen Einstiegen, und Vorkommen 0 steuert einen zeitbasierten Ausstieg.
Beispiel 3, Scan auf frische breakouts (ProScreener)
// Condition: close breaks above the highest close of the prior 50 bars
breakout = close CROSSES OVER Highest[50](close[1])
age = BarsSince(breakout)
// Keep instruments where the breakout happened within the last 3 bars
SCREENER[age >= 0 AND age <= 3] (age AS "Bars since breakout")Der Screener liefert Instrumente mit einem kürzlichen 50-Bar-Breakout. Der age >= 0 Klausel schließt den Sentinel-Wert -1 für Instrumente aus, die nie ausgelöst haben.
Häufige Fehler und Stolperfallen
- -1 bedeutet nie. Eine Bedingung, die noch nie wahr war, gibt -1 zurück, und das rutscht durch Filter wie
BarsSince(cond) < 5. Schließen Sie den Sentinel-Wert immer ausdrücklich aus, zum Beispiel mitage >= 0. - Die Nummerierung der Vorkommen beginnt bei 0. Das jüngste Vorkommen ist 0, nicht 1. Die Übergabe von 1 misst das zweitjüngste Ereignis, eine häufige Quelle von Fehlern um eins.
- Die Bedingung muss boolesch sein. Einen numerischen Ausdruck zu übergeben ist ungültig. Vergleiche und Crossover-Ausdrücke sind zulässig; rohe Kurse nicht.
- Die Historie begrenzt die Antwort. Es werden nur geladene Bars untersucht. Ein Ereignis, das älter als die geladene Historie ist, wird als nie eingetreten gemeldet, daher können sich Ergebnisse ändern, wenn mehr Daten geladen werden.
Verwandte Befehle
BarIndex, nullbasierte Position des aktuellen Bars in den geladenen Daten.IntradayBarIndex, Bar-Zähler, der an jedem Handelstag zurückgesetzt wird.HighestBars, Offset in Bars des höchsten Werts über eine Periode.LowestBars, Offset in Bars des niedrigsten Werts über eine Periode.CROSSES OVER, wahr auf dem Bar, an dem eine Serie über eine andere steigt.CROSSES UNDER, wahr auf dem Bar, an dem eine Serie unter eine andere fällt.RSI, Momentum Oszillator, der häufig mit BarsSince-Bedingungen kombiniert wird.Average, gleitender Durchschnitt, der in Crossover-Bedingungen verwendet wird.