ONCE
ONCE in ProBuilder führt eine Zuweisung nur auf dem ersten Bar aus, den das Skript verarbeitet, und verhindert, dass Anfangswerte auf jedem späteren Bar überschrieben werden.
Syntax
ONCE variable = expressionSo funktioniert es
Ein ProBuilder-Skript wird auf jeder Bar des Charts von oben nach unten ausgeführt, und Variablen behalten ihre Werte von einer Bar zur nächsten. Eine einfache Zuweisung wie counter = 0 setzt die Variable daher auf jedem Bar wieder auf null zurück. Wird der Zeile ONCE vorangestellt, beschränkt das die Zuweisung auf die erste Auswertung, sodass spätere Bars die Variable unberührt lassen und sie Zustand über den Chart hinweg ansammeln kann.
Der Ausdruck auf der rechten Seite wird mit den auf diesem ersten Bar verfügbaren Daten ausgewertet. Die Historie ist zu diesem Zeitpunkt kurz, daher sind Funktionen, die einen Rückblick brauchen, etwa lowest[10](low), arbeiten mit den Bars, die beim Start des Skripts vorhanden sind.
Der von ONCE gesetzte Wert bleibt bestehen, bis das Skript von Neuem berechnet wird, zum Beispiel nach dem Bearbeiten des Codes, dem Wechsel der Zeiteinheit oder einem Neustart der Plattform. In Handelssystemen ist ONCE der übliche Weg, Zähler, Flags und feste Einstellungen zu definieren, die die Einstiegs- und Ausstiegslogik auf jedem Bar liest.
Beispiele
Beispiel 1, Neue Tiefs gegen eine Anfangsreferenz verfolgen (Indikator)
// capture the 10-bar low a single time when the script starts
ONCE myFirstLowest = lowest[10](low)
IF low < myFirstLowest OR low < recentLow THEN
recentLow = low
ELSE
recentLow = recentLow
ENDIF
RETURN recentLowmyFirstLowest wird nur auf der ersten Bar berechnet und nie aktualisiert. Der Indikator verfolgt danach jedes neue Tief, das nach dieser ersten Referenz entsteht.
Beispiel 2, Feste Strategiekonstanten (ProOrder)
DEFPARAM CumulateOrders = false
// define risk settings a single time
ONCE stopPoints = 40
ONCE targetPoints = 80
IF NOT onmarket AND close CROSSES OVER Average[50](close) THEN
BUY 1 CONTRACT AT MARKET
SET STOP pLOSS stopPoints
SET TARGET pPROFIT targetPoints
ENDIFDie beiden Risikokonstanten werden bei der ersten Auswertung zugewiesen und danach auf jedem Bar wiederverwendet, wodurch die Konfiguration an einer offensichtlichen Stelle oben in der Strategie bleibt.
Beispiel 3, Gewinn seit dem ersten gescannten Bar (ProScreener)
// record the close of the first bar in the scanned history
ONCE startLevel = close
gainPct = (close - startLevel) / startLevel * 100
SCREENER[gainPct > 10] (gainPct AS "Gain %")startLevel friert den Schlusskurs des frühesten verarbeiteten Bars ein. Jeder spätere Bar vergleicht den aktuellen Schlusskurs damit, und der Screener behält Instrumente, die über das gescannte Fenster mehr als 10 Prozent gestiegen sind.
Häufige Fehler und Stolperfallen
- Erwartung eines Resets bei jeder Session oder jedem Tag. ONCE löst bei der ersten Auswertung des Skripts aus und nie wieder bis zu einer vollständigen Neuberechnung. Werte, die täglich zurückgesetzt werden müssen, brauchen explizite Logik, zum Beispiel den Vergleich des aktuellen Datums mit einem gespeicherten.
- Die Daten des ersten Bars sind dünn. Der Ausdruck wird ausgewertet, wenn die Historie am kürzesten ist. Eine Rückblick-Funktion innerhalb von ONCE sieht möglicherweise weniger Bars als angefordert, was den Anfangswert unrepräsentativ machen kann. In Strategien steuert PRELOADBARS, wie viel Historie vor dem Start verfügbar ist.
- ONCE in einer Zeile, die pro Bar laufen sollte. Nur echte Initialisierungen gehören hinter ONCE. Eine Berechnung, die von aktuellen Kursen abhängt, so zu markieren, macht sie nach dem ersten Bar dauerhaft veraltet.
- Redundante Selbstzuweisung anstelle von ONCE. Schreiben
x = xauf jedem Bar, um einen Wert zu erhalten, funktioniert, verschleiert aber die Absicht.ONCE x = startValuemacht die Initialisierung explizit und vermeidet versehentliche Überschreibungen.
Verwandte Befehle
IF, bedingte Logik, die typischerweise mit ONCE initialisierten Zustand verwendet.ELSE, Ausweichzweig innerhalb dieser bedingten Logik.ENDIF, schließt einen IF-Block.BarIndex, Bar-Zähler, nützlich für Logik, die an die ersten Bars gebunden ist.DEFPARAM, Ausführungseinstellungen auf Skriptebene, ebenfalls oben definiert.RETURN, gibt den endgültigen Wert eines Indikators aus.