Pine Script: Bar Close vs. Intrabar: Repainting, Alarme und calc_on_every_tick
3 Min. Lesezeit · Aktualisiert
Ein Pine Script, das in der Historie sauber aussieht, kann live Signale auslösen, die später verschwinden. Fast jeder Fall läuft auf eine Frage hinaus: Arbeitet das Skript auf dem geschlossenen Balken oder auf dem Balken, der sich noch bildet?
Dieser Leitfaden behandelt jede Einstellung, die das steuert, und was ich für Level-Alarme verwende.
Historische Balken und der Echtzeit-Balken
In der Historie führt Pine dein Skript einmal pro Balken aus, an dessen Schluss. Auf dem Live-Balken läuft es bei jedem Kursupdate erneut. Eine Bedingung wie close > level kann um 10:01 wahr sein, um 10:03 falsch und um 10:04 wieder wahr. Die Historie behält nur die letzte Antwort. Diese Lücke nennen Trader Repainting.
barstate.isconfirmed
barstate.isconfirmed ist nur beim letzten Update eines Balkens wahr, wenn er schließt. Fügst du es einer Bedingung hinzu, verhält sich der Live-Balken wie die Historie:
crossUp = ta.crossover(close, level) and barstate.isconfirmed
plotshape(crossUp, style=shape.triangleup, location=location.belowbar)
alertcondition(crossUp, "Close above level")
Der Preis dafür ist die Geschwindigkeit. Du bekommst das Signal erst zum Balkenschluss, auf einer langsamen Zeitebene einen ganzen Balken später.
Alarmhäufigkeit
Wenn du einen Alarm erstellst, fragt TradingView, wie oft er auslösen darf:
- Once Per Bar Close: löst nur aus, wenn der Balken mit erfüllter Bedingung schließt. Das entspricht dem Backtest.
- Once Per Bar: löst das erste Mal aus, wenn die Bedingung im Balken wahr wird, auch wenn der Balken anders schließt.
- Once Per Minute und Only Once: Begrenzungen dafür, wie oft er auslöst.
Für Level-Alarme nutze ich Once Per Bar Close auf einem 1- oder 5-Minuten-Chart. Ein Docht durch ein Level, der wieder innerhalb schließt, löst nicht aus, was die meisten Fehlausbrüche herausfiltert.
Strategien: calc_on_every_tick und process_orders_on_close
Eine Strategie läuft standardmäßig am Balkenschluss, sowohl in der Historie als auch auf Live-Balken. Zwei Einstellungen ändern das:
calc_on_every_tick=truelässt die Strategie bei jedem Live-Update laufen. Die Historie kann das nicht, daher weichen Live-Trades vom Backtest ab.process_orders_on_close=truefüllt Orders zum Schluss des Signalbalkens. Standardmäßig werden sie zur Eröffnung des nächsten Balkens gefüllt. Es passt zu einem schlussbasierten Ausstieg, kann aber Einstiege schönen.
Lass beides aus, bis die Strategie am Balkenschluss funktioniert. Der Leitfaden Indikator vs. Strategie behandelt die übrigen Annahmen des Strategy Testers.
Bar Magnifier
In der Historie kennt eine Strategie nur Eröffnung, Hoch, Tief und Schluss jedes Balkens. Liegen Stop und Ziel beide in einem Balken, muss sie raten, was zuerst getroffen wurde. use_bar_magnifier=true nutzt Daten einer niedrigeren Zeitebene, um das zu klären, in bezahlten TradingView-Plänen. Schalte es ein, bevor du einem engen Stop und Ziel vertraust.
request.security und höhere Zeitebenen
Ein Tageshoch in einen 5-Minuten-Chart zu holen ist eine häufige Quelle von Repainting. In der Historie ist der Tagesbalken bereits abgeschlossen, das Skript sieht also ab dem ersten Balken des Tages das endgültige Hoch. Live bewegt sich das Hoch weiter. Frage den vorherigen, abgeschlossenen Wert ab:
prevHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
Das [1] mit lookahead_on liefert das gestrige Hoch auf jedem Balken von heute, in der Historie und live gleichermaßen.
Eine Checkliste
- Signale nutzen
barstate.isconfirmedoder der Alarm steht auf Once Per Bar Close. - Werte höherer Zeitebenen nutzen
[1]mitlookahead_on. - Die Strategie läuft am Balkenschluss, mit
calc_on_every_tickaus. - Bar Magnifier ist an, wenn Stops und Ziele nah beieinander liegen.
- Du vergleichst eine Woche Live-Alarme mit dem Backtest, bevor du damit handelst.
Levels, die sich nicht bewegen
Meine Handelsplan-Levels stehen vor der Sitzung fest und bleiben den ganzen Tag unverändert, ein Skript, das sie zeichnet, hat also nichts zu repainten. Der Leitfaden zu Pine-Script-Levels zeigt, wie du sie auf TradingView einzeichnest.
FAQ
Was ist der Unterschied zwischen Bar Close und Intrabar in Pine Script?
Bar Close heißt, das Skript handelt einmal, wenn der Balken abgeschlossen ist. Intrabar heißt, es handelt bei jedem Kursupdate im Balken, sodass ein Signal erscheinen und vor dem Schluss wieder verschwinden kann.
Wie verhindere ich, dass ein Pine-Script-Alarm repaintet?
Stelle den Alarm auf Once Per Bar Close oder füge der Bedingung barstate.isconfirmed hinzu. Für Daten höherer Zeitebenen nutze den Wert des vorherigen Balkens mit lookahead_on.
Nutzt ein Strategie-Backtest Intrabar-Preise?
Nur für Ausführungen innerhalb eines Balkens, und nur mit eingeschaltetem Bar Magnifier. Signale in der Historie werden am Schluss jedes Balkens berechnet.
Quellen
- TradingView Pine Script User Manual: Ausführungsmodell, Repainting, Alarme
- TradingView Help Center: Bar Magnifier
Nur zu Bildungszwecken. Keine Anlageberatung.