BarsSince
BarsSince telt het aantal bars dat is verstreken sinds een voorwaarde in ProBuilder voor het laatst waar was. Volg hoe lang geleden een crossover of signaal op de grafiek plaatsvond.
Syntaxis
BarsSince(Condition)
BarsSince(Condition, Occurrence)Parameters
| Naam | Type | Standaard | Beschrijving |
|---|---|---|---|
Condition | boolean | verplicht | De expressie waarvan de meest recente ware evaluatie wordt gemeten. |
Occurrence | geheel getal | 0 | Welk voorval wordt gemeten. 0 richt zich op het meest recente, 1 op het voorval daarvoor, en zo verder. |
Hoe het werkt
BarsSince loopt terug vanaf de huidige bar en telt hoeveel bars die scheiden van de bar waarop de voorwaarde voor het laatst als waar werd geëvalueerd. Een resultaat van 0 betekent dat de voorwaarde waar is op de huidige bar, 1 betekent dat die waar was op de vorige bar, en hogere waarden duiden op oudere gebeurtenissen.
Het optionele tweede argument selecteert eerdere voorkomens. BarsSince(cond) en BarsSince(cond, 0) zijn equivalent en richten zich op het laatste voorkomen; BarsSince(cond, 1) meet de afstand tot het voorval daarvoor. De twee vergelijken legt de tussenruimte tussen opeenvolgende gebeurtenissen bloot, bijvoorbeeld het aantal bars tussen de laatste twee oscillatorkruisingen.
Wanneer de conditie nergens in de geëvalueerde historie waar is geweest, geeft de functie -1. Deze sentinelwaarde moet expliciet worden afgehandeld, omdat -1 numerieke vergelijkingen doorstaat zoals < 10 en kan ongemerkt voldoen aan versheidsfilters die een echte gebeurtenis moesten vereisen.
Typische toepassingen zijn versheidsfilters (alleen handelen wanneer een signaal binnen de laatste n bars is afgegaan), cooldown-timers (opnieuw instappen blokkeren tot er genoeg bars zijn verstreken) en duurmetingen tussen gebeurtenissen op de grafiek.
Voorbeelden
Voorbeeld 1, Afstand tot de laatste twee RSI-kruisingen (Indicator)
// 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"De indicator plot de leeftijd in bars van de laatste RSI-kruising boven 50 en van de kruising daarvoor. Het verschil tussen de twee lijnen is de afstand tussen opeenvolgende kruisingen.
Voorbeeld 2, Cooldown bij instappen (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 heeft hier twee rollen: voorval 1 dwingt een cooldown tussen instappen af, en voorval 0 stuurt een uitstap op basis van tijd.
Voorbeeld 3, Scan op verse 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")De screener geeft instrumenten met een recente 50-bar breakout. De age >= 0 clausule sluit de -1 sentinel uit voor instrumenten die nooit getriggerd zijn.
Veelvoorkomende fouten en valkuilen
- -1 betekent nooit. Een conditie die nooit waar is geweest geeft -1 terug, en die waarde glipt door filters zoals
BarsSince(cond) < 5. Sluit de sentinelwaarde altijd expliciet uit, bijvoorbeeld metage >= 0. - De nummering van voorvallen begint bij 0. Het meest recente voorval is 0, niet 1. Met 1 meet je de op één na meest recente gebeurtenis, een veelvoorkomende bron van off-by-one-fouten.
- De voorwaarde moet booleaans zijn. Een numerieke expressie doorgeven is ongeldig. Vergelijkingen en crossover-expressies komen in aanmerking; ruwe prijzen niet.
- De historie beperkt het antwoord. Alleen geladen bars worden onderzocht. Een gebeurtenis die ouder is dan de geladen historie wordt gerapporteerd als nooit gebeurd, dus resultaten kunnen veranderen wanneer er meer data wordt geladen.
Gerelateerde instructies
BarIndex, nulgebaseerde positie van de huidige bar in de geladen data.IntradayBarIndex, barteller die elke handelsdag wordt gereset.HighestBars, offset in bars van de hoogste waarde over een periode.LowestBars, offset in bars van de laagste waarde over een periode.CROSSES OVER, waar op de bar waar de ene reeks boven de andere beweegt.CROSSES UNDER, waar op de bar waar de ene reeks onder de andere beweegt.RSI, momentum-oscillator die vaak met BarsSince-voorwaarden wordt gecombineerd.Average, moving average die in crossover-voorwaarden wordt gebruikt.