Dokumentation

Block-Referenz

Vollständige Referenz aller 100 Blöcke, die die Engine ausführt: die 98 aus der Palette und zwei zurückgezogene, die erhalten bleiben, damit gespeicherte Graphen weiterhin laden. Jeder Block hat ein streng typisiertes Socket-System: Number, Bar, Boolean, DateTime. Ungültige Verbindungen werden vor der Ausführung abgelehnt.

Mit tunable markierte Blöcke können der PSO-Optimierung ausgesetzt werden. Alle Indikatoren werden ausschließlich auf geschlossenen Bars berechnet, es gibt also keinen Lookahead-Bias.

Blöcke benennen. Rechtsklick auf einen Block auf der Arbeitsfläche öffnet Name this block, Duplicate, Delete und einen Link direkt zum Eintrag dieses Blocks weiter unten. Ohne Namen wird ein Block über die automatische Kennung identifiziert, die er beim Hinzufügen erhalten hat (n3, n7, …). Genau diese Kennung zeigen Optimize und Sensitivity auf ihren Achsen, sodass zwei Blöcke desselben Typs als n3.period und n7.period erscheinen. Mit Namen werden daraus Fast EMA.period und Slow EMA.period. Ein Name ist nur eine Bezeichnung: er ändert kein Ergebnis, zwei Blöcke einer Strategie dürfen nicht denselben Namen tragen, und ein Punkt ist nicht erlaubt, weil die Bezeichnungen name.parameter lauten. Wird der Name geleert, erscheint wieder die automatische Kennung.

Source14 Aggregator12 Indicator41 Gate6 Compare5 Logic4 Math13 Sink4 Notiz1

Source

Rohdaten-Eingaben: Bar-Kurse, Tick-Kurse, Positionszustand, Zeitkonstanten. Source-Blöcke haben keine Eingänge.

Tick Price
Source.Tick.Price
Aktuellste Tick-Bid/Ask/Mid-Kurse aus den Tick-Daten. Nur angeboten, wenn der Graph-Timeframe auf TICKS eingestellt ist. Enthalten die Daten kein Bid/Ask, liefern alle drei Ausgänge den letzten Kurs. Für Bar-basierte Graphs stattdessen Source.Bar.Current verwenden.
bidNumber für SHORT-Einstiege
midNumber für Indikatoren
askNumber für LONG-Einstiege
Current Bar
Source.Bar.Current
Der gerade geschlossene Bar. Die primäre Datenquelle für Bar-basierte Graphs. Nicht verfügbar für Tick-Daten (stattdessen Tick Price → Aggregator verwenden).
barBar geschlossener OHLCV-Bar
Current Time
Source.Time.Now
Ausgemustert, wird in der Palette nicht mehr angeboten. Unix-Millisekunden-Timestamp des Anfangs des aktuellen Bars (Periodenbeginn), bei Tick-Daten des Ticks. Der Satz, der hier stand, beschrieb zwei Dinge, die der Editor nie erlaubt hat: dieser Ausgang ist ein DateTime, Gate.Session nimmt einen Bar, und kein Block im Katalog deklariert überhaupt einen DateTime-Eingang. Die Verbindungsprüfung weist DateTime → Number ab. Für ein Tageszeit-Fenster Gate.Session verwenden: die einzige Uhr im Graphen, die CET/CEST folgt, und deren vier Stunden- und Minutenparameter dem Optimierer übergeben werden können. Der Block bleibt hier und im Katalog, damit ein gespeicherter Graph mit einem solchen Block weiterhin lädt und weiterhin sagt, was er ist.
timeDateTime Unix ms
Constant (Number)
Source.Constant.Number
Eine feste Zahl, die sich bar-zu-bar nicht ändert. Als tunable markieren, um sie der PSO-Optimierung auszusetzen. Der Optimierer durchsucht dann den angegebenen Bereich.
valueNumber
valuenumber Standard 0tunable
Constant (Time)
Source.Constant.DateTime
Ausgemustert, wird in der Palette nicht mehr angeboten. Eine feste Tageszeit in CET (z.B. 09:00), ausgegeben als Minuten seit Mitternacht. Sie hat keinen Abnehmer: kein Block im Katalog deklariert einen DateTime-Eingang, der Vergleich mit Source.Time.Now, für den dieser Block gedacht war, konnte also nie verdrahtet werden, und die beiden liegen ohnehin auf verschiedenen Skalen, der eine ein absoluter Zeitpunkt, der andere eine Tageszeit. Für ein Tageszeit-Fenster Gate.Session verwenden. Der Block bleibt hier und im Katalog, damit ein gespeicherter Graph mit einem solchen Block weiterhin lädt.
valueDateTime
hourinteger 0–23, Standard 9
minuteinteger 0–59, Standard 0
Constant (Boolean)
Source.Constant.Boolean
Ein fester Boolean-Wert (true/false). Nützlich, um einen Gate-Zweig vorübergehend zu deaktivieren, ohne neu zu verdrahten.
valueBoolean
valueboolean Standard true
Bar → Field
Source.Bar.Field
Extrahiert ein einzelnes numerisches Feld aus einem Bar-Objekt. Verwenden, um ein bestimmtes Preisfeld (z.B. close) in einen Math- oder Compare-Block zu führen. timestamp liefert die Epochenzeit des Bars in Millisekunden, und zwar immer den ANFANG seiner Periode: ein M15-Bar mit 09:00 deckt also 09:00 bis 09:15 ab, unabhängig davon, wann sein erster Tick eintraf.
barBar
valueNumber
fieldenum open | high | low | close | volume | bid | ask | timestamp, Standard close
Bars Since Entry
Source.BarsSinceEntry
Anzahl der Graph-Auswertungen seit dem Fill der Position: Basis-Bars bei einem Bar-Graphen (nicht aggregierte Bars), Ticks bei einem TICKS-Graphen. Gibt −1 zurück, wenn keine Position offen ist; 0 auf dem Bar, auf dem der Einstieg ausgeführt wird (der Bar nach dem Signal); 1 auf dem nächsten usw. Mit Compare.GTE für zeitbasierte Ausstiege kombinieren.
valueNumber −1 wenn flat
High Since Entry
Source.HighSinceEntry
Verfolgt das maximale bar.high seit Positionseröffnung. Gibt 0 zurück, wenn keine Position offen ist. Klassische Verwendung: HighSinceEntry − (ATR × mult) → Sink.UpdateStop für einen Trailing-Stop bei Longs, der dem Hoch seit Positionseröffnung folgt. Ein Chandelier-Stop über die letzten N Balken nimmt den kleineren Wert aus diesem und dem Hoch dieser N Balken.
valueNumber 0 wenn flat
Low Since Entry
Source.LowSinceEntry
Verfolgt das minimale bar.low seit Positionseröffnung. Gibt 0 zurück, wenn keine Position offen ist. Spiegelbild von High Since Entry für Short-Positionen: LowSinceEntry + (ATR × mult) → Trailing-Stop.
valueNumber 0 wenn flat
Position Entry Price
Source.PositionEntryPrice
Der Fill-Preis der aktuell offenen Position (bei mehreren offenen der ältesten). Gibt 0 zurück, wenn keine Position offen ist. Verwenden, um Abstand zum Einstieg für Gewinnziel- oder Breakeven-Logik zu berechnen.
valueNumber 0 wenn flat
Position Stop-Loss
Source.PositionStopLoss
Das aktuelle Stop-Loss-Preisniveau der offenen Position (bei mehreren offenen der ältesten). Gibt 0 zurück, wenn keine Position offen ist. Als Untergrenze in Trailing-Logik verwenden: Math.Max(PositionStopLoss, neuerTrail) verhindert, dass der Stop nach hinten wandert.
valueNumber 0 wenn flat
Positions-Anfangsstopdistanz
Source.PositionInitialStopDistance
Der Abstand zwischen Einstiegspreis und dem Stop, mit dem die Position eröffnet wurde, in Preispunkten. Das ist R, das Risiko, nach dem die Position bemessen wurde. Anders als Source.PositionStopLoss wandert dieser Wert nicht mit, wenn der Stop nachgezogen wird, und bleibt damit auch nach einer Stop-Verschiebung als Bezugsgröße brauchbar. Liefert 0, wenn keine Position offen ist, und ebenfalls 0, wenn kein Anfangsstop aufgezeichnet wurde. 0 heißt also unbekannt, nicht risikofrei.
valueNumber 0 wenn flat oder unbekannt
Position PnL (points)
Source.PositionPnLPoints
Unrealisierter P&L in Kurspunkten: close − entry für Longs, entry − close für Shorts. Gibt 0 zurück, wenn keine Position offen ist. Mit Compare.GT kombinieren, um Trailing-Stop-Aktivierung zu gaten (z.B. erst ab +20 Punkten Gewinn).
valueNumber 0 wenn flat

Aggregator

Timeframe-Resampling. Alle Aggregatoren geben ausschließlich den letzten vollständig geschlossenen Bar aus, keinen noch entstehenden Bar, kein Lookahead. Ein Bar bleibt stabil bis der nächste schließt. Der erste Bar nach Datenbeginn kann nur einen Teil seiner Periode abdecken, und die Bar-gespeisten Aggregatoren füllen keine Lücken: eine Periode ohne Basis-Bars erzeugt keinen Bar. Die TickToBar-Aggregatoren setzen das volume eines Bars auf die Anzahl seiner Ticks.

Niveaus halten, Ereignisse feuern einmal. Solange ein Bar der höheren Zeiteinheit noch entsteht, gibt der Aggregator auf jedem Basis-Bar erneut den zuletzt abgeschlossenen aus, und nachgelagerte Blöcke halten ihren Zustand. Für ein Niveau ist genau das erwünscht: eine Indicator.EMA hinter einem Aggregator.M5 liefert über alle fünf M1-Bars denselben Wert. Ein Ereignis ist etwas anderes: ein Candlestick- oder Chartmuster, oder confirmed von Indicator.SwingHigh, ist eine Aussage über genau einen abgeschlossenen Bar. Es wird deshalb nur auf dem einen Basis-Bar gemeldet, der diesen Bar trägt, und liest sich auf dem Rest der Periode als false. Ein Mustervorkommen ist ein Trigger, unabhängig davon, hinter welcher Zeiteinheit es sitzt. ready ist ein Niveau und bleibt dazwischen true.

Ruhige Perioden werden aufgefüllt, lange Lücken nicht vollständig. Kommt über eine oder mehrere ganze Perioden kein Tick (Mittagsflaute, Nacht, Wochenende), gibt ein TickToBar-Aggregator für jede übersprungene Periode einen synthetischen Bar aus: flach auf dem zuletzt gehandelten Preis, Volumen 0, damit nachgelagerte rollende Fenster weiterlaufen statt zu springen. Synthetische Bars sind auf 500 pro Lücke begrenzt: ein Wochenende sind bei Aggregator.TickToBar.M1 rund 2880 übersprungene Minuten, die Reihe macht nach Erreichen der Grenze also einen Zeitsprung. Volumen 0 ist das verlässliche Merkmal, an dem sich ein synthetischer Bar von einem real flach gehandelten unterscheiden lässt. Die Füllung wird auch abgeschnitten, wenn der Handel schneller wieder einsetzt, als sie veröffentlicht werden kann (pro eingehendem Tick verlässt ein Bar den Aggregator), denn ein echter Bar hat immer Vorrang vor übrig gebliebener Füllung. Echte Bars gehen dabei nie verloren, und die Ticks, die während des Auffüllens eintreffen, zählen in dem Bar, zu dem sie gehören.

Wo ein Tag beginnt und warum es darauf mehr als eine Antwort gibt. Das Produkt verwendet bewusst zwei Tagesgrenzen, und sie liegen eine Stunde auseinander:

Ein D1-Bar im Graphen und ein D1-Bar im Chart sind also nicht derselbe Bar, und keiner von beiden beginnt den Tag im Sommer um lokal Mitternacht. Gate.Session ist die Ausnahme: die einzige Uhr im Graphen, die CET/CEST folgt. Innerhalb eines Graphen sind sich ein Session-Fenster und ein Aggregator.D1-Bar ein halbes Jahr lang um eine Stunde uneinig, wann ein Tag beginnt. Beide Regeln bleiben bestehen, statt vereinheitlicht zu werden: eine Änderung würde die Ergebnisse jeder gespeicherten D1-Strategie still verschieben. Dieser Absatz steht hier, damit der Unterschied sichtbar ist, statt entdeckt zu werden.

Mehrere Zeiteinheiten in einem Graph. Ein Graph kann beliebig viele Aggregatoren nebeneinander verwenden, jeder gespeist vom Basis-Bar oder von einem anderen Aggregator (eine Kette), und jeder führt seinen eigenen Zustand: zwei Aggregatoren derselben Periode am selben Eingang veröffentlichen dieselben Bars. Ein Bar der höheren Zeiteinheit wird auf dem Basis-Bar sichtbar, dessen Ende das Ende dieses Bars erreicht. Ein M15-Bar von 10:00 bis 10:15 ist zum ersten Mal in der Entscheidung auf dem M1-Bar 10:14 sichtbar, und ein Einstieg aus dieser Entscheidung wird auf dem nächsten Basis-Bar ausgeführt. Eine Kette Aggregator.M15 → Aggregator.M60 veröffentlicht dieselben Stunden-Bars wie ein direkter Aggregator.M60. Schließt eine Datenlücke zwei Perioden auf einem Basis-Bar, werden beide der Reihe nach veröffentlicht, und ein Indikator hinter dem Aggregator zählt jede davon einmal. Indikatoren hinter einem Aggregator wärmen sich in dessen Bars auf: eine Indicator.EMA mit Periode 3 hinter Aggregator.D1 braucht drei abgeschlossene Tage. Source.BarsSinceEntry zählt Basis-Bars, keine aggregierten.

Die Periode muss zu den Bars passen, die ankommen. Die Periode eines Aggregators muss ein ganzzahliges Vielfaches der Bars sein, die er erhält, aus dem Datensatz oder vom Aggregator davor. Die Engine baut einen Bar der höheren Zeiteinheit aus ganzen Eingangs-Bars, deshalb würde ein Aggregator.M15 auf M10-Bars Bars von 20 und 10 Minuten bauen, und ein Aggregator.M5 auf M15-Bars kann diese nicht teilen und würde jeden M15-Bar unverändert durchreichen. Ein Lauf mit einem solchen Graph wird mit einer Meldung abgelehnt, die den Block nennt. Ein Aggregator, der seinem Eingang entspricht, reicht die Bars unverändert durch und ist erlaubt.

Diagnostic Mode baut seine Bars noch einmal anders. Eine Diagnose aggregiert die Daten auf die gewählte Zeiteinheit, indem sie die Buckets am Session-Open des Datensatzes ausrichtet und jeden Bucket verwirft, der nicht die volle Zahl an Basis-Bars bekommen hat; H4 und D1 lehnt sie ganz ab, weil die tägliche Wartungspause diese dauerhaft unvollständig lässt. Das ist bewusst ein anderer analytischer Blickwinkel (er isoliert die Exit-Mechanik) und bedeutet, dass Diagnose-Zahlen nicht als direkter Zahlenvergleich zu einem Backtest derselben Strategie auf denselben Daten gedacht sind.

Tick→M1 Aggregator
Aggregator.TickToBar.M1
Aggregiert Roh-Tick-Kurse zu 1-Minuten-OHLC-Bars. Source.Tick.Price → mid in price einspeisen, dann Bar-Ausgang an Indikatoren leiten. Nur im Tick-Datenmodus verfügbar.
priceNumber
barBar fertiggestellter M1-Bar
Tick→M5 Aggregator
Aggregator.TickToBar.M5
Aggregiert Roh-Tick-Kurse zu 5-Minuten-OHLC-Bars. Gleiche Semantik wie Tick→M1, jedoch mit 5-Minuten-Granularität.
priceNumber
barBar fertiggestellter M5-Bar
M1 Aggregator
Aggregator.M1
Pass-through für M1-Bars. Ausgang ist identisch mit dem Eingang. Für Graph-Symmetrie beim Mischen von M1- und höheren Timeframe-Aggregatoren im selben Graph.
barBar
M5 Aggregator
Aggregator.M5
Resampled feinere Bars (z.B. M1) auf M5. Ausgang ändert sich nur beim Schluss eines neuen M5-Bars und bleibt während der M5-Periode stabil.
barBar
barBar letzter geschlossener M5-Bar
M15 Aggregator
Aggregator.M15
Resampled feinere Bars auf M15. Für Multi-Timeframe-Setups: z.B. M5-Graph, der Einstiege über M15-EMA-Slope filtert.
barBar
barBar letzter geschlossener M15-Bar
M30 Aggregator
Aggregator.M30
Resampled feinere Bars auf M30. Kein Lookahead: der Ausgang ist beim letzten abgeschlossenen M30-Bar eingefroren.
barBar
barBar letzter geschlossener M30-Bar
M60 (H1) Aggregator
Aggregator.M60
Resampled feinere Bars auf 60-Minuten- (H1-) Bars. Stabil während der Stunde; gibt neuen Bar bei jedem H1-Schluss aus.
barBar
barBar letzter geschlossener H1-Bar
Daily (D1) Aggregator
Aggregator.D1
Resampled Intraday-Bars auf Tagesbars (Tagesgrenze UTC+1 Mitternacht). Gibt den letzten abgeschlossenen Tagesbar aus, der den ganzen Tag stabil bleibt. Mit Indicator.EMA für einen sauberen Tages-Trendfilter verwenden.
barBar
barBar letzter geschlossener Tagesbar
Ticks → M15
Aggregator.TickToBar.M15
Baut M15-Bars direkt aus einem TICKS-Datensatz, genauso wie Aggregator.TickToBar.M1 M1-Bars baut: eine Periode schließt, sobald ein Tick mit Timestamp im nächsten 15-Minuten-Slot eintrifft. Alles dahinter liest also einen ABGESCHLOSSENEN Bar. Nur nutzbar, wenn der Graph-Timeframe TICKS ist.
priceNumber
barBar der letzte ABGESCHLOSSENE M15-Bar
Ticks → M30
Aggregator.TickToBar.M30
Baut M30-Bars direkt aus einem TICKS-Datensatz, genauso wie Aggregator.TickToBar.M1 M1-Bars baut: eine Periode schließt, sobald ein Tick mit Timestamp im nächsten 30-Minuten-Slot eintrifft. Alles dahinter liest also einen ABGESCHLOSSENEN Bar. Nur nutzbar, wenn der Graph-Timeframe TICKS ist.
priceNumber
barBar der letzte ABGESCHLOSSENE M30-Bar
Ticks → H1
Aggregator.TickToBar.H1
Baut H1-Bars direkt aus einem TICKS-Datensatz, genauso wie Aggregator.TickToBar.M1 M1-Bars baut: eine Periode schließt, sobald ein Tick mit Timestamp im nächsten 60-Minuten-Slot eintrifft. Alles dahinter liest also einen ABGESCHLOSSENEN Bar. Nur nutzbar, wenn der Graph-Timeframe TICKS ist.
priceNumber
barBar der letzte ABGESCHLOSSENE H1-Bar
Ticks → D1
Aggregator.TickToBar.D1
Baut D1-Bars direkt aus einem TICKS-Datensatz, genauso wie Aggregator.TickToBar.M1 M1-Bars baut: eine Periode schließt, sobald ein Tick mit Timestamp im nächsten Tag eintrifft (ein Tag läuft 23:00–23:00 UTC, siehe Hinweis oben). Alles dahinter liest also einen ABGESCHLOSSENEN Bar. Nur nutzbar, wenn der Graph-Timeframe TICKS ist.
priceNumber
barBar der letzte ABGESCHLOSSENE D1-Bar

Indicator

Technische Indikatoren, berechnet auf geschlossenen Bars. Solange zu wenig Historie vorliegt, ist ready false und der Wert ein Platzhalter: 0 bei den meisten Blöcken, 50 bei RSI und Stochastic, der Mittelwert des teilweise gefüllten Fensters beim SMA und das Feld des aktuellen Bars bei Highest/Lowest. Auf ready filtern, nicht auf den Wert. Formeln in Standardnotation: N = Periode, t = aktueller Bar.

EMA
Indicator.EMA
Exponential Moving Average. Gewichtet aktuelle Schlusskurse stärker als ältere. Der Glättungsfaktor α bestimmt die Abklingrate.
α = 2 / (N + 1) EMA[t] = close[t] × α + EMA[t-1] × (1 - α) Start: EMA[N-1] = SMA der ersten N Schlusskurse
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
SMA
Indicator.SMA
Simple Moving Average. Arithmetisches Mittel der letzten N Schlusskurse. Jeder Schlusskurs im Fenster hat dasselbe Gewicht, daher reagiert er auf einen neuen Schlusskurs langsamer als eine EMA gleicher Periode. Er ist auch die Mittellinie der Bollinger-Bänder.
SMA[t] = (close[t] + close[t-1] + … + close[t-N+1]) / N Solange weniger als N Closes vorliegen: Mittelwert der bisherigen Closes (ready = false)
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
Median(N)
Indicator.Median
Gleitender Median des gewählten Feldes über die letzten N Bars, das ausreißerresistente Gegenstück zum SMA. Über [98, 100, 101, 102, 150] ist der Median 101, das arithmetische Mittel dagegen 110,2: ein einzelner Ausreißer verschiebt den Mittelwert um neun Punkte, den Median dagegen gar nicht. Ungerades N nimmt den mittleren Wert der sortierten Reihe, gerades N das Mittel der beiden mittleren Werte. Das ist dieselbe Konvention wie numpy und pandas.
Median[t] = middle value of sort(field[t-N+1..t]); even N: mean of the two middle values
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
fieldenum open | high | low | close, Standard close
MAD(N)
Indicator.MAD
Median Absolute Deviation: der Median der absoluten Abstände zum Median desselben N-Bar-Fensters. Das robuste Gegenstück zur Standardabweichung und der Nenner eines ausreißerresistenten Z-Scores (close − Median) / MAD. Über [98, 100, 101, 102, 150] sind die Abweichungen [3, 1, 0, 1, 49] und der MAD ist 1, während die Standardabweichung bei rund 20 liegt. Ein völlig flaches Fenster ergibt MAD = 0, und das ist ein echter Wert, kein undefinierter. Der Block berechnet seinen Median selbst, ein Indicator.Median-Knoten ist nicht nötig.
MAD[t] = Median(|field[i] − Median[t]|) for i in [t-N+1..t]
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
fieldenum open | high | low | close, Standard close
WMA(N)
Indicator.WMA
Linear gewichteter gleitender Durchschnitt des gewählten Feldes über die letzten N Bars: der älteste Wert im Fenster trägt Gewicht 1, der neueste Gewicht N. Derselbe Durchschnitt wie SMA, aber mit etwa halber Verzögerung, weil die jüngsten Bars dominieren. Ein SMA(20) und ein WMA(20) auf derselben Serie drehen an unterschiedlichen Bars, und genau darum wählt man das eine oder das andere. Entspricht exakt TA-Libs WMA. Vor dem vollständigen Fenster wird nichts veröffentlicht: ein gewichteter Durchschnitt über ein teilweise gefülltes Fenster ist ein anderer Durchschnitt, kein aufgewärmter: seine Gewichte wären ebenso falsch wie seine Spanne.
WMA[t] = Σ i · field[t-N+i] / (N · (N+1) / 2), i = 1..N
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
fieldenum open | high | low | close, Standard close
StdDev(N)
Indicator.StdDev
Standardabweichung des gewählten Feldes über die letzten N Bars, als Grundgesamtheit gerechnet, also geteilt durch N, nicht durch N-1. Genau das berechnen die Bollinger Bänder intern bereits, und genau das liefert TA-Libs STDDEV. Die Stichprobenvariante würde StdDev(20) im selben Graphen vom Abstand Mitte-zu-oben eines BollingerBands(20, 1) abweichen lassen. Es ist ein Preis-ABSTAND, kein Preis-Niveau: „2 × StdDev“ ist die Redewendung dafür, und es ist der Nenner eines Z-Scores (close − SMA) / StdDev. Ein völlig flaches Fenster ergibt 0, und das ist ein echter Wert, kein undefinierter; Math.Div verweigert einen Divisor innerhalb von 1e-12 um null, ein darauf gebauter Z-Score kann also kein Inf oder NaN erzeugen.
StdDev[t] = √( Σ (field[i] − mean)² / N ) for i in [t-N+1..t]
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
fieldenum open | high | low | close, Standard close
ATR
Indicator.ATR
Average True Range. Richtungsfreies Volatilitätsmaß. Die True Range erfasst das Maximum aus aktuellem Kerzenkörper, Gap-Up und Gap-Down gegenüber dem vorherigen Schlusskurs. ATR ist der Wilder-geglättete Durchschnitt davon.
TR[t] = max(high[t] − low[t], |high[t] − close[t-1]|, |low[t] − close[t-1]|) ATR[t] = (ATR[t-1] × (N-1) + TR[t]) / N (Wilder-Glättung) Start: ATR[N] = Mittelwert(TR[1..N]) (Bar 0 hat keinen Vorgänger-Close, der erste TR entsteht auf Bar 1, ATR ist nach N+1 Bars bereit)
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–200, Standard 14tunable
RSI
Indicator.RSI
Relative Strength Index (0–100). Misst Momentum durch Vergleich von durchschnittlichen Gewinnen und Verlusten mit Wilder-Glättung. Übliche Referenzwerte sind 30 und 70; der Block gibt die Zahl aus und markiert keinen Wert.
ΔC[t] = close[t] − close[t-1] Gain[t] = max(ΔC, 0), Loss[t] = max(−ΔC, 0) AvgGain / AvgLoss: Wilder-EMA(N) von Gain / Loss RS = AvgGain / AvgLoss RSI = 100 − 100 / (1 + RS) AvgLoss = 0 (auch bei einem völlig flachen Fenster) → RSI = 100 Liefert 50, bis N+1 Closes vorliegen
bar →Bar
value ←Number 0–100
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–100, Standard 14tunable
ADX
Indicator.ADX
Average Directional Index (0–100). Misst die Stärke eines Trends unabhängig von der Richtung. Er ist der geglättete DX, und DX wächst, je weiter +DI und −DI im Verhältnis zu ihrer Summe auseinanderliegen; Werte wie 20 und 25 sind übliche Referenzpunkte, der Block gibt nur die Zahl aus. Die Richtungskomponenten +DI und −DI, aus denen ADX abgeleitet ist, werden als eigene Ausgänge bereitgestellt.
+DM = high[t] − high[t-1] wenn > 0 sonst 0 (und > −DM) −DM = low[t-1] − low[t] wenn > 0 sonst 0 (und > +DM) +DM, −DM, TR mit Wilder-EMA(N) glätten +DI = 100 × Glatt(+DM) / ATR(N) −DI = 100 × Glatt(−DM) / ATR(N) DX = 100 × |+DI − −DI| / (+DI + −DI) ADX = Wilder-EMA(DX, N)
bar →Bar
value ←Number 0–100
plus_di ←Number +DI. Verfügbar nach period+1 Bars, also früher als value, das etwa 2×period Bars braucht
minus_di ←Number −DI. Gleiche Verfügbarkeit wie plus_di
ready ←Boolean true, sobald ADX selbst initialisiert ist; benötigt zusätzlich period DX-Werte, also später als +DI/−DI
periodinteger 2–100, Standard 14tunable
CCI
Indicator.CCI
Commodity Channel Index (Lambert). Misst, wie weit der typische Preis von seinem eigenen gleitenden Durchschnitt entfernt liegt, skaliert mit der mittleren absoluten Abweichung. Schwankt um 0; Werte jenseits von ±100 gelten konventionell als gestreckt. Der Skalierungsterm ist die mittlere absolute Abweichung, nicht die Standardabweichung.
TP = (high + low + close) / 3 SMA = SMA(TP, N) MD = Mittel(|TP[i] − SMA|) über das N-Bar-Fenster CCI = (TP − SMA) / (0.015 × MD)
bar →Bar
value ←Number 0 während der Warmup-Phase und 0, wenn das Fenster vollkommen flach ist (dort ist der Index undefiniert)
ready ←Boolean false, bis period Bars vorliegen
periodinteger 2–200, Standard 20tunable
Ein Nulllinien-Durchgang ist Math.CrossesAbove / Math.CrossesBelow gegen eine konstante 0. Der Crossover zählt erst, wenn dieser Block aufgewärmt ist; sein Wert während der Aufwärmphase wird nie als Durchgang gewertet.
Williams %R
Indicator.Williams
Wo der Close innerhalb der N-Bar-Spanne aus Hoch und Tief liegt, als negativer Prozentwert: −100 am unteren Rand der Spanne, 0 am oberen. Das Gegenstück zum Stochastic %K, exakt verbunden über %R = %K − 100. Konventionell gilt < −80 als weit unten, > −20 als weit oben.
HH = Höchster(high, N), LL = Tiefster(low, N) %R = −100 × (HH − close) / (HH − LL)
bar →Bar
value ←Number −100–0. Liefert den neutralen Mittelwert −50, wenn die N-Bar-Spanne die Breite null hat, denn 0 würde fälschlich als „am oberen Rand geschlossen“ gelesen
ready ←Boolean false, bis period Bars vorliegen
periodinteger 2–200, Standard 14tunable
Parabolic SAR
Indicator.ParabolicSAR
Wilders Stop-and-Reverse-Trailinglevel. Der Ausgang ist ein Preis, kein Oszillatorwert: vergleiche ihn mit dem Close, nicht mit einer Konstanten. Das Level folgt dem Trend und beschleunigt, je weiter dieser läuft; durchbricht der Kurs es, springt es auf die andere Seite des Marktes. Nicht zu verwechseln mit der Exit-Strategie PARABOLIC_SAR, die am Einstieg eines einzelnen Trades verankert ist und nur ausstoppt. Dieser Block läuft durchgehend und dreht.
SAR(t) = SAR(t−1) + AF × (EP − SAR(t−1)) EP = Extrempunkt der laufenden Bewegung (höchstes Hoch im Long) AF startet bei acceleration, erhöht sich bei jedem neuen Extrem um denselben Betrag, begrenzt durch maximum Der SAR ragt nie in die Spanne der letzten beiden Bars hinein. Beim Durchbruch springt er auf den vorherigen EP (nicht auf den aktuellen Kurs), AF wird zurückgesetzt, die Seite dreht.
bar →Bar
value ←Number ein Preisniveau
is_long ←Boolean die aktuell verfolgte Seite; false, solange nicht bereit
ready ←Boolean false, bis zwei Bars vorliegen, denn ein Bar ergibt keine Richtung
accelerationnumber 0.001–0.5, Standard 0.02tunable
maximumnumber 0.01–1.0, Standard 0.2tunable liegt es unter acceleration, wird es auf acceleration angehoben; AF steigt dann nie
Momentum
Indicator.Momentum
Wie weit sich der Kurs über die letzten N Bars bewegt hat, in Preiseinheiten. Positiv heißt: der Close liegt über dem Stand von vor N Bars. Für dieselbe Bewegung als Prozentwert Indicator.ROC nehmen, denn eine feste Momentum-Schwelle bedeutet auf verschiedenen Kursniveaus Verschiedenes.
Momentum = close − close[vor N Bars]
bar →Bar
value ←Number Preiseinheiten, mit Vorzeichen
ready ←Boolean false, bis period+1 Closes vorliegen, denn ein Rückblick über N Bars braucht N+1 Closes
periodinteger 1–200, Standard 10tunable
Ein Nulllinien-Durchgang ist Math.CrossesAbove / Math.CrossesBelow gegen eine konstante 0. Der Crossover zählt erst, wenn dieser Block aufgewärmt ist; sein Wert während der Aufwärmphase wird nie als Durchgang gewertet.
Rate of Change
Indicator.ROC
Dieselbe Bewegung wie Indicator.Momentum, aber als Prozentwert bezogen auf den früheren Kurs. Der Nenner ist der alte Close, nicht der aktuelle. Die Zahl beantwortet also „wie weit ist er von dort gekommen“ und bleibt über Kursniveaus hinweg vergleichbar.
ROC = 100 × (close − close[N]) / close[N]
bar →Bar
value ←Number Prozent, mit Vorzeichen. 0, wenn der Referenz-Close 0 ist
ready ←Boolean false, bis period+1 Closes vorliegen
periodinteger 1–200, Standard 10tunable
Bei einer Reihe, deren Zykluslänge genau period beträgt, ist ROC auf jedem bereiten Bar exakt 0, denn der Rückblick trifft immer dieselbe Phase.
Ein Nulllinien-Durchgang ist Math.CrossesAbove / Math.CrossesBelow gegen eine konstante 0. Der Crossover zählt erst, wenn dieser Block aufgewärmt ist; sein Wert während der Aufwärmphase wird nie als Durchgang gewertet.
VWAP
Indicator.VWAP
Ein Sitzungs-Durchschnitt des Close, täglich um 23:00 UTC zurückgesetzt (Mitternacht bei festem UTC+1, das ganze Jahr). Gewicht ist das volume-Feld des Bars, und die Datensätze dieser Plattform enthalten kein gehandeltes Volumen: bei Bar-Dateien steht darin die Spanne des Bars, bei Bars, die ein Aggregator.TickToBar-Block aus Ticks baut, die Anzahl der Ticks. Es ist also ein spannen- bzw. aktivitätsgewichteter Durchschnitt, kein volumengewichteter. Auf dem ersten Bar einer Sitzung entspricht er dessen Close.
w[i] = volume-Feld von Bar i (1, wenn es 0 ist) VWAP[t] = Σ(close[i] × w[i], i=Sitzungsbeginn..t) / Σ(w[i], i=Sitzungsbeginn..t) Zurücksetzen: täglich um 23:00 UTC (festes UTC+1)
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
Stochastic
Indicator.Stochastic
Stochastik-Oszillator (0–100). %K misst, wo der Schlusskurs innerhalb der jüngsten High-Low-Spanne liegt; %D glättet %K. Übliche Referenzwerte sind 20 und 80; eine %K/%D-Kreuzung ist der Wechsel von %K von einer Seite von %D auf die andere.
%K[t] = 100 × (close[t] − Tiefst(low, k_period)) / (Höchst(high, k_period) − Tiefst(low, k_period)) %D[t] = SMA(%K, d_period)
bar →Bar
k ←Number schnelle Stochastik 0–100
d ←Number Signallinie 0–100
ready ←Boolean false, bis k_period + d_period − 1 Bars vorliegen; k und d erst dann auswerten (beide stehen vorher auf 50; k ist auch bei einer Spanne der Breite null 50)
k_periodinteger 2–100, Standard 14tunable
d_periodinteger 1–50, Standard 3tunable
Bollinger Bands
Indicator.BollingerBands
Volatilitätsbänder: SMA ± σ × Standardabweichung. Ein Schlusskurs am unteren Band liegt σ Standardabweichungen unter der Mittellinie. Enge Bänder bedeuten eine kleine Standardabweichung der jüngsten Schlusskurse.
Middle = SMA(close, N) σ_std = Populations-Standardabweichung von close über N Bars Upper = Middle + sigma × σ_std Lower = Middle − sigma × σ_std
bar →Bar
upper / middle / lower ←Number
ready ←Boolean false, bis period Bars vorliegen; die Bänder erst dann auswerten (alle drei stehen vorher auf 0)
periodinteger 2–500, Standard 20tunable
sigmanumber 0.1–5.0, Standard 2.0tunable
Highest(N)
Indicator.Highest
Rollierendes Maximum eines Bar-Feldes über die letzten N ABGESCHLOSSENEN Bars, ohne den gerade ausgewerteten Bar (der Wert wird gelesen, bevor der aktuelle Bar ins Fenster kommt, denn nur so kann close > Highest(N) überhaupt wahr werden). Für Donchian-artige Ausbruchsniveaus oder Widerstandserkennung.
Highest[t] = max(field[t-1], field[t-2], …, field[t-N]) Solange keine N vorherigen Bars vorliegen: ready = false und value gibt das Feld des aktuellen Bars zurück
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
fieldenum open|high|low|close, Standard high
Lowest(N)
Indicator.Lowest
Rollierendes Minimum eines Bar-Feldes über die letzten N ABGESCHLOSSENEN Bars, ohne den gerade ausgewerteten Bar. Spiegelbild von Highest(N), die untere Linie eines Donchian-Kanals; close < Lowest(N) ist true, wenn der Schlusskurs unter diesem Minimum liegt.
Lowest[t] = min(field[t-1], field[t-2], …, field[t-N]) Solange keine N vorherigen Bars vorliegen: ready = false und value gibt das Feld des aktuellen Bars zurück
bar →Bar
value ←Number
ready ←Boolean false, solange der Indikator noch in der Warmup-Phase ist; value erst auswerten, wenn dies true ist
periodinteger 2–500, Standard 20tunable
fieldenum open|high|low|close, Standard low
Consecutive Up/Down Bars
Indicator.ConsecutiveBars
Zählt die aktuelle Serie aufeinanderfolgender Bars mit steigendem/fallendem Schlusskurs. Der Gegenzähler wird bei einem Richtungswechsel auf 0 zurückgesetzt, und ein unveränderter Close beendet beide Serien. Zum Beispiel ist down_count nach vier fallenden Schlusskursen in Folge 4.
wenn close[t] > close[t-1]: up_count += 1; down_count = 0 wenn close[t] < close[t-1]: down_count += 1; up_count = 0 sonst (Close unverändert): up_count = 0; down_count = 0
bar →Bar
up_count ←Number setzt bei Down-Bar auf 0 zurück
down_count ←Number setzt bei Up-Bar auf 0 zurück
Swing High
Indicator.SwingHigh
Erkennt bestätigte Pivot-Hochs mit einem N-Bar-Fraktal: bar[t].high muss strikt höher sein als jedes andere High von bar[t-N..t+N]; zwei gleich hohe Hochs sind kein Pivot. Da N Bars der rechten Seite abschließen müssen, löst das Signal N Bars nach dem eigentlichen Pivot aus, es gibt also keinen Lookahead-Bias. Der Ausgang price enthält das zuletzt bestätigte Pivot-Hoch; confirmed ist auf dem Bar true, der es bestätigt.
Pivot bei bar[p] wenn: high[p] > high[i] für jedes andere i in [p-N, p+N] Bestätigung bei bar[p+N] (rechte Seite vollständig) price = high[p] (gehalten bis zum nächsten Pivot; 0 bis zum ersten)
bar →Bar
price ←Number letztes bestätigtes Swing-High-Niveau
confirmed ←Boolean nur auf dem Bestätigungs-Bar true
lookbackinteger 1–50, Standard 5tunable
Swing Low
Indicator.SwingLow
Spiegelbild von Swing High für Pivot-Tiefs. Löst N Bars nach dem eigentlichen Tiefpunkt aus, sobald N Bars der rechten Seite das Minimum bestätigt haben. Der Ausgang price enthält das zuletzt bestätigte Pivot-Tief; confirmed ist auf dem Bar true, der es bestätigt.
Pivot bei bar[p] wenn: low[p] < low[i] für jedes andere i in [p-N, p+N] Bestätigung bei bar[p+N] price = low[p] (gehalten bis zum nächsten Pivot; 0 bis zum ersten)
bar →Bar
price ←Number letztes bestätigtes Swing-Low-Niveau
confirmed ←Boolean nur auf dem Bestätigungs-Bar true
lookbackinteger 1–50, Standard 5tunable
MACD
Indicator.MACD
Moving Average Convergence Divergence. Klassischer Momentum-Indikator: Die MACD-Linie misst den Abstand zweier EMAs. Die Signallinie ist eine EMA des MACD. Das Histogramm macht Divergenzen sichtbar.
MACD[t] = EMA(close, fast) − EMA(close, slow) signal[t] = EMA(MACD, signal_period) histogram[t] = MACD[t] − signal[t] Positives Histogramm → aufwärts aufbauendes Momentum Alle drei stehen auf 0, bis slow_period + signal_period − 1 Bars vorliegen (kein ready-Ausgang)
bar →Bar
macd ←Number MACD-Linie
signal ←Number Signallinie
histogram ←Number MACD − Signal
fast_periodinteger 2–200, Standard 12tunable
slow_periodinteger 5–500, Standard 26tunable
signal_periodinteger 2–100, Standard 9tunable
Math.CrossesAbove(macd, signal) für Signallinien-Crossings verwenden, Math.CrossesAbove(histogram, 0) / Math.CrossesBelow(histogram, 0) für einen Vorzeichenwechsel des Histogramms. Keiner der beiden löst aus, bevor MACD aufgewärmt ist, auch ohne eigenen ready-Ausgang.
Efficiency Ratio (ER)
Indicator.EfficiencyRatio
Kaufman Efficiency Ratio. Teilt die Netto-Bewegung der Schlusskurse über N Bars durch die Gesamt-Pfadlänge (die Summe der N absoluten Bar-zu-Bar-Änderungen), begrenzt auf 0..1. 1,0 = der Kurs lief N Bars in eine Richtung ohne Rücksetzer; nahe 0 = die Netto-Bewegung war klein gegenüber dem zurückgelegten Weg. Mit Compare.GT oder Compare.LT auf den Ausgang value lassen sich andere Blöcke daran koppeln; die Schwelle ist ein Parameter des Compare-Blocks.
direction = |close[t] − close[t-N]| noise = Σ |close[i] − close[i-1]| für i = t-N+1 .. t ER[t] = direction / noise (Bereich 0,0–1,0) Gibt 0 zurück bis N+1 Bars verfügbar sind
bar →Bar
value ←Number 0,0–1,0
periodinteger 2–500, Standard 20tunable
Keltner Channel
Indicator.KeltnerChannel
ATR-basierter Umschlag um eine EMA: middle = EMA des Schlusskurses, upper / lower = middle ± mult × ATR. Die Breite folgt der Average True Range, Bollinger Bands dagegen der Standardabweichung des Schlusskurses; ob die Bollinger Bands innerhalb des Kanals liegen, ist eine Bedingung, die sich mit Compare-Blöcken verdrahten lässt.
middle = EMA(close, ema_period) upper = middle + mult × ATR(atr_period) lower = middle − mult × ATR(atr_period)
bar →Bar
upper / middle / lower ←Number
ema_periodinteger 2–500, Standard 20tunable
atr_periodinteger 2–200, Standard 14tunable
multnumber 0.1–10.0, Standard 2.0tunable
Z-Score
Indicator.ZScore
Rollierender statistischer Z-Score von bar.close im Verhältnis zu seinem jüngsten Mittelwert und seiner Standardabweichung. Z = −2 ist ein Schlusskurs zwei Standardabweichungen unter seinem jüngsten Mittelwert; Z = +2 zwei darüber.
mean[t] = SMA(close, N) std[t] = Populations-Standardabweichung von close über N Bars Z[t] = (close[t] − mean[t]) / std[t] Gibt 0 zurück bis N Bars vorhanden. std=0 → Z=0.
bar →Bar
value ←Number typischer Bereich ±1,5 bis ±3,0
periodinteger 2–500, Standard 20tunable
Ein Nulllinien-Durchgang ist Math.CrossesAbove / Math.CrossesBelow gegen eine konstante 0. Z-Score steht in der Aufwärmphase auf 0 und hat keinen ready-Ausgang, der Crossover wartet trotzdem, bis er aufgewärmt ist.
Pivot Points
Indicator.PivotPoints
Klassische Floor-Pivot-Punkte, berechnet aus dem Vortags-H/L/C. Tage werden ganzjährig um 23:00 UTC geschnitten (festes UTC+1, keine Sommerzeit). Alle 7 Niveaus werden einmal täglich aktualisiert und sind intraday stabil. Gibt 0 für alle Ausgänge zurück bis zum ersten Tageswechsel; die ersten Niveaus beruhen auf dem Teil des ersten Tages, den der Lauf gesehen hat. Jeder Tag mit Bars zählt als Tag: eine kurze Sonntagssitzung in den Daten wird also zum „Vortag“ des Montags.
P = (prev_H + prev_L + prev_C) / 3 R1 = 2P − prev_L R2 = P + (prev_H − prev_L) R3 = prev_H + 2 × (P − prev_L) S1 = 2P − prev_H S2 = P − (prev_H − prev_L) S3 = prev_L − 2 × (prev_H − P)
bar →Bar
p ←Number Pivot-Punkt
r1, r2, r3 ←Number Widerstandsniveaus 1–3
s1, s2, s3 ←Number Unterstützungsniveaus 1–3
Support & Resistance
Indicator.SupportResistance
Kombiniertes Strukturniveau-Modell. Kombiniert Pivot-Fraktale, Sitzungshoch/-tief, Vortages-H/L, Overnight-Range, Wochenhochs/-tiefs, Opening Range und runde Zahlen. Ein neues Pivot-Niveau innerhalb von merge_zone_pts um ein bestehendes Pivot-Niveau wird mit ihm zusammengeführt; Sitzungs-, Vortags-, Overnight-, Wochen-, Opening-Range- und Rundzahl-Niveaus werden nicht zusammengeführt. Proximity-Gates verwenden ATR-Vielfache, um die „Touch Zone" zu definieren. Alle Uhrzeiten sind ein festes UTC+1 (keine Sommerzeit), und das Overnight-Fenster öffnet immer um 22:00. Ist atr_value nicht verbunden, wird 1,0 Preiseinheit als ATR verwendet. Ein Pivot-Niveau entfällt, sobald ein Close es um 0,3 × ATR durchbricht.
Niveauquellen: • N-Bar Pivot-Fraktal-Hochs/-Tiefs (pivot_lookback) • Sitzungshoch/-tief (laufender Tag, Zurücksetzen um 23:00 UTC; session_open_hour/_minute legen nur die Opening Range fest) • Vorheriger Kalendertag H/L • Overnight-Range H/L (22:00–overnight_end_hour CET) • Wochen-H/L (Woche ab Montag) • Opening Range H/L (erste or_duration_minutes) • Runde Zahlen (alle round_number_step Punkte) Zusammenführen: ein Pivot-Niveau innerhalb merge_zone_pts um ein Pivot-Niveau → ein Niveau at_support = dist_support ≤ touch_zone_atr_mult × ATR
barBar
atr_valueNumber von Indicator.ATR
support / resistanceNumber nächstes Strukturniveau
dist_support / dist_resistanceNumber Preiseinheiten (Close − Support, Resistance − Close); −1, wenn kein Niveau existiert
at_support / at_resistanceBoolean Proximity-Gate
session_high, session_lowNumber
prev_day_high, prev_day_lowNumber
overnight_high, overnight_lowNumber
weekly_high, weekly_lowNumber
or_high, or_lowNumber Opening Range
or_completeBoolean OR-Fenster geschlossen
pivot_lookbackinteger 3–50, Standard 10tunable
touch_zone_atr_multnumber 0.1–2.0, Standard 0.5tunable
merge_zone_ptsnumber 1–50, Standard 5tunable
round_number_stepnumber 10–1000, Standard 100tunable
session_open_hourinteger 0–23, Standard 8tunable
session_open_minuteinteger 0–59, Standard 0tunable
or_duration_minutesinteger 5–120, Standard 30tunable
overnight_end_hourinteger 0–12, Standard 9tunable
Second Attempt
Indicator.SecondAttempt
Löst is_second_attempt=true auf dem Bar aus, an dem der Kurs das Niveau zum zweiten Mal anfährt (ein Bar innerhalb von 0,5 ATR), nachdem er sich um mindestens pullback_min_atr ATR davon entfernt hat. Dauert eine der beiden Phasen länger als max_bars_between Bars, beginnt die Zählung neu. SupportResistance.support in level einspeisen.
Zustandsmaschine pro Niveau: RUHEND → BERÜHRUNG (das Tief des Bars erreicht Niveau + 0,5 × ATR; bei Resistance das Hoch Niveau − 0,5 × ATR) BERÜHRUNG → PULLBACK (ein Close mehr als pullback_min_atr × ATR entfernt) PULLBACK → BERÜHRUNG (zweiter Anlauf) → is_second_attempt = true (löst einmal aus) attempt_count: 1 ab der ersten Berührung bis zur zweiten, 2 auf dem auslösenden Bar, sonst 0 max_bars_between: setzt Zustand zurück, wenn zu viel Zeit vergeht Verschiebt sich das Niveau um mehr als 0,5 × ATR, beginnt die Zählung neu
bar →Bar
level →Number z.B. SupportResistance.support
atr →Number
is_second_attempt ←Boolean
attempt_count ←Number
is_supportboolean Standard true
pullback_min_atrnumber 0.1–3.0, Standard 0.5tunable
max_bars_betweeninteger 3–100, Standard 20tunable
Break + Retest
Indicator.LevelBreakRetest
Erkennt einen bestätigten Niveaudurchbruch (Schlusskurs N×ATR jenseits des Niveaus) und wartet dann auf einen Retest von der neuen Seite. is_retest_long löst aus, wenn ehemaliger Widerstand zur neuen Unterstützung wird. is_retest_short löst aus, wenn ehemalige Unterstützung zum neuen Widerstand wird. is_breakout bleibt true, während auf den Retest gewartet wird: bis zum Retest, bis max_retest_bars abläuft oder bis ein Close um break_atr_mult × ATR zurück jenseits des Niveaus den Bruch aufhebt. Ein ausgelöster oder abgelaufener Bruch kann in derselben Richtung erst wieder scharf werden, wenn der Kurs innerhalb dieser Schwelle zurück ist. Ein level von 0 gilt als echtes Niveau. Den Eingang absichern, wenn kein Niveau existiert.
Durchbruch bestätigt: close > level + break_atr_mult × ATR (aufwärts) → is_breakout = true, broken_level = level Retest (long): Tief ≤ broken_level + touch_zone_atr_mult × ATR und Close ≥ broken_level → is_retest_long = true (löst einmal aus) Ungültig (long): Close < broken_level − break_atr_mult × ATR Zustand setzt zurück, wenn max_retest_bars überschritten
bar →Bar
level →Number
atr →Number
is_breakout ←Boolean true während Wartezeit auf Retest
is_retest_long ←Boolean einmal auf Long-Retest-Bar
is_retest_short ←Boolean einmal auf Short-Retest-Bar
broken_level ←Number das gebrochene Niveau bis zum Retest-Bar, sonst 0
break_atr_multnumber 0.1–2.0, Standard 0.3tunable
touch_zone_atr_multnumber 0.1–2.0, Standard 0.5tunable
max_retest_barsinteger 3–60, Standard 15tunable
Doji
Indicator.Doji
Ein-Bar-Kerze der Unentschlossenheit: ein Körper, der neben der eigenen Spanne des Bars vernachlässigbar ist. Die Schwelle ist ein Anteil der Spanne, kein Preis. Dieselbe Einstellung bedeutet damit auf EURUSD dasselbe wie auf dem DAX. Ein Bar ohne Spanne (open = high = low = close, wie er in synthetischen und dünnen Daten vorkommt) wird bewusst nicht gemeldet: das sind fehlende Daten, keine Unentschlossenheit.
body = |close − open| range = high − low Doji = range > 0 und body ≤ body_ratio × range
bar →Bar
value ←Boolean true auf einem Bar, dessen Körper höchstens body_ratio seiner Spanne beträgt
ready ←Boolean false, bis der erste Bar vorliegt
body_rationumber 0.001–0.5, Standard 0.1tunable
Hammer / Shooting Star
Indicator.Hammer
Diese Ausgänge benennen eine Form, keine Richtung. Hammer und Hanging Man sind dieselbe Kerze; Inverted Hammer und Shooting Star ebenso. Unterschieden werden sie allein durch den vorangegangenen Trend, den dieser Block nicht sehen kann. Kombiniere ihn mit Gate.TrendGate oder einem EMA-Vergleich, um diesen Kontext zu liefern. Alle drei Schwellen sind Anteile der Bar-Spanne, und da range = body + upper + lower gilt, bilden die Standardwerte 0.6 / 0.3 / 0.1 eine Zerlegung der Spanne statt drei unabhängiger Zahlen. Sie implizieren zugleich die Lehrbuchregel „unterer Schatten mindestens doppelt so lang wie der Körper“, ohne je durch einen Körper zu teilen, der null sein kann.
upper = high − max(open, close) lower = min(open, close) − low hammer = lower ≥ shadow_ratio × range und body ≤ body_ratio × range und upper ≤ opposite_ratio × range shooting_star = dasselbe mit vertauschtem upper und lower
bar →Bar
hammer ←Boolean langer unterer Schatten, kleiner Körper oben (Hammer- / Hanging-Man-Form)
shooting_star ←Boolean langer oberer Schatten, kleiner Körper unten (Inverted-Hammer- / Shooting-Star-Form)
ready ←Boolean false, bis der erste Bar vorliegt
shadow_rationumber 0.3–0.95, Standard 0.6tunable
body_rationumber 0.01–0.6, Standard 0.3tunable
opposite_rationumber 0.0–0.4, Standard 0.1tunable
Engulfing
Indicator.Engulfing
Zwei-Bar-Umkehr: der aktuelle Körper verschlingt den vorherigen, und beide Bars haben entgegengesetzte Farben. Die Schranke am Open ist bewusst inklusiv. In fortlaufenden FX- und CFD-Daten ist open[t] praktisch auf jedem Bar gleich close[t−1]; die strikte Lehrbuchform „eröffnet jenseits des vorherigen Close“ würde ein bullisches Engulfing damit nahezu unauffindbar machen. Die strikte Schranke bleibt dort, wo die eigentliche Aussage des Musters sitzt: am Close. Der vorherige Bar hat durch den Farbtest zwingend einen Körper ungleich null, der klassische Fehlalarm „alles verschlingt einen Doji“ kann also nicht auftreten.
bullish = vorheriger Bar bärisch und aktueller bullisch und open ≤ prev_close und close > prev_open bearish = vorheriger Bar bullisch und aktueller bärisch und open ≥ prev_close und close < prev_open
bar →Bar
bullish ←Boolean Abwärtsbar, gefolgt von einem Aufwärtsbar, der über dessen Open schließt
bearish ←Boolean Aufwärtsbar, gefolgt von einem Abwärtsbar, der unter dessen Open schließt
ready ←Boolean false, bis zwei Bars vorliegen
Harami
Indicator.Harami
Zwei-Bar-Innenmuster: der vorherige Körper verschlingt den aktuellen, Farben entgegengesetzt. Das sind die Engulfing-Ungleichungen mit umgedrehter Close-Schranke, wodurch Harami und Engulfing einander ausschließen: das eine verlangt einen Close jenseits des vorherigen Open, das andere diesseits davon; kein Bar kann beides melden.
bullish = vorheriger Bar bärisch und aktueller bullisch und open ≥ prev_close und close < prev_open bearish = vorheriger Bar bullisch und aktueller bärisch und open ≤ prev_close und close > prev_open
bar →Bar
bullish ←Boolean Abwärtsbar, gefolgt von einem kleinen Aufwärtsbar innerhalb seines Körpers
bearish ←Boolean Aufwärtsbar, gefolgt von einem kleinen Abwärtsbar innerhalb seines Körpers
ready ←Boolean false, bis zwei Bars vorliegen
Piercing Line / Dark Cloud
Indicator.PiercingDarkCloud
Zwei-Bar-Teilumkehr: der aktuelle Bar dreht über ein Eindringniveau innerhalb des vorherigen Körpers hinaus, bleibt aber vor dem vorherigen Open stehen. Ein Close jenseits des vorherigen Open ist ein Engulfing; die beiden Blöcke beanspruchen also nie denselben Bar. Das Lehrbuch verlangt ein Eröffnungs-Gap jenseits des Extrems des Vorbars; das ist aus demselben Grund wie bei Engulfing auf „eröffnet auf oder jenseits des vorherigen Close“ gelockert.
level = prev_close + penetration × (prev_open − prev_close) bullish = Vorbar bärisch und aktueller bullisch und open ≤ prev_close und close > level und close < prev_open bearish = spiegelbildlich
bar →Bar
bullish ←Boolean Piercing Line
bearish ←Boolean Dark Cloud Cover
ready ←Boolean false, bis zwei Bars vorliegen
penetrationnumber 0.1–0.9, Standard 0.5tunable
Morning / Evening Star
Indicator.Star
Drei-Bar-Umkehr: ein gerichteter Bar, ein kleiner „Stern“-Körper, dann ein Bar, der über das Eindringniveau des ersten Körpers zurückerobert. Die Größengrenze des Sterns ist relativ zum Körper des ersten Bars, der Block verhält sich an ruhigen und an heftigen Tagen also gleich. Das Lehrbuch-Gap um den Stern kann in fortlaufenden Daten nicht auftreten; es ist gelockert zu „der Stern reicht mindestens bis zum Close des ersten Bars herunter“ (hinauf beim Evening Star). Das erhält den bedeutungstragenden Teil der Aussage und verwirft den Teil, der nur eine Sitzungsgrenze kodiert.
level = first_close + penetration × (first_open − first_close) bullish = erster Bar bärisch und star_body ≤ star_body_ratio × first_body und min(star_open, star_close) ≤ first_close und dritter Bar bullisch und third_close > level bearish = spiegelbildlich
bar →Bar
bullish ←Boolean Morning Star
bearish ←Boolean Evening Star
ready ←Boolean false, bis drei Bars vorliegen
star_body_rationumber 0.05–1.0, Standard 0.5tunable
penetrationnumber 0.1–0.9, Standard 0.5tunable
Three Soldiers / Crows
Indicator.ThreeSoldiers
Drei aufeinanderfolgende gleichfarbige Bars mit fortlaufend weiterreichenden Closes, von denen jeder innerhalb des Körpers des Vorbars eröffnet. Genau diese letzte Bedingung trennt das Muster von „drei Aufwärtsbars hintereinander“: eine Folge, die von jedem Vorkörper weggapt, ist etwas anderes. Die Schranke ist inklusiv, weil das Open in fortlaufenden Daten exakt auf dem vorherigen Close liegt, also auf der äußeren Kante des Körpers.
bullish = drei bullische Bars und close₁ > close₀ und close₂ > close₁ und open₁ zwischen open₀ und close₀ (inklusiv) und open₂ zwischen open₁ und close₁ (inklusiv) bearish = spiegelbildlich
bar →Bar
bullish ←Boolean Three White Soldiers
bearish ←Boolean Three Black Crows
ready ←Boolean false, bis drei Bars vorliegen
Doppel-Top / -Bottom
Indicator.DoubleTopBottom
Zwei gleich hohe Extrema beiderseits eines Gegen-Schwenkpunkts, abgeschlossen, wenn der Close diesen Gegen-Schwenkpunkt (die Nackenlinie) durchbricht. Aufgebaut auf demselben Schwenkpunkt-Detektor wie Indicator.SwingHigh / SwingLow.

Jede Toleranz ist ein Anteil der Musterhöhe selbst (des Abstands von den Gipfeln hinunter zum Tal dazwischen), nie ein Anteil des Preises und nie ein ATR-Vielfaches. Ein doppelt so hohes Muster darf die doppelte absolute Abweichung zwischen seinen Gipfeln haben, weil es genauso aussieht. Dadurch funktioniert ein Standardwert über Instrumente, Zeiteinheiten und Mustergrößen hinweg. Wer zusätzlich einen Mindest-Größenfilter will, baut ihn aus Indicator.ATR: das ist eine Volatilitätsfrage, keine Formfrage, und sie hier einzubauen würde dem Block eine zweite, verdeckte Zeitskala geben.

Ausgelöst wird auf dem Ausbruchs-Close, nicht beim Abschluss der Form. Der zweite Schwenkpunkt wird erst lookback Bars später bestätigt; dort auszulösen wäre zugleich zu spät und nicht handelbar. Ein Close-basierter Bruch ist außerdem immun gegen den Ein-Docht-Fehlausbruch, gegen den ein High/Low-basierter es nicht ist. Das Muster wird ohne Auslösung verworfen, wenn der Kurs zuerst jenseits der beiden Extrema schließt, wenn das Bestätigungsfenster abläuft oder wenn ein neuer Schwenkpunkt das Skelett verändert.
A, M, B = drei aufeinanderfolgende alternierende Schwenkpunkte height = |Extremum(A, B) − M| Niveau : |A − B| ≤ price_tolerance × height Timing : längerer Schenkel ≤ time_ratio_max × kürzerer Fenster : der Bruch muss innerhalb von confirm_within_ratio × (B.bar − A.bar) Bars nach B liegen (das Produkt wird abgerundet, und ein Bruch auf dem letzten Bar des Fensters zählt noch; B wird erst lookback Bars später bestätigt, ein Produkt unter lookback kann also nie auslösen) Doppel-Top → bearish beim ersten Close unter M Doppel-Bottom → bullish beim ersten Close über M
bar →Bar
bullish ←Boolean Doppel-Bottom: true auf dem Bar, der über der Nackenlinie schließt
bearish ←Boolean Doppel-Top: true auf dem Bar, der unter der Nackenlinie schließt
ready ←Boolean false, bis drei bestätigte Schwenkpunkte vorliegen
lookbackinteger 1–50, Standard 5tunable
price_tolerancenumber 0.01–0.5, Standard 0.1tunable
time_ratio_maxnumber 1.0–10.0, Standard 3.0tunable
confirm_within_rationumber 0.1–5.0, Standard 1.0tunable
Head & Shoulders
Indicator.HeadAndShoulders
Fünf-Schwenkpunkt-Umkehr: zwei annähernd gleich hohe Schultern um einen dominanten Kopf, abgeschlossen, wenn der Close die Nackenlinie durchbricht. Die Nackenlinie wird durch die beiden Täler gelegt und fortgeschrieben, nicht als waagerecht angenommen. Eine geneigte Nackenlinie ist eine benannte Variante des Musters, und neckline_tolerance begrenzt nur, wie steil die Gerade werden darf, bevor die Form überhaupt keine Schulter-Kopf-Schulter-Formation mehr ist. Sie ist genau deshalb lockerer als price_tolerance: eine geneigte Nackenlinie ist normal, unsymmetrische Schultern sind es nicht.

Beachte, dass price_tolerance in beide Richtungen wirkt: die Schultern müssen innerhalb dieser Toleranz beieinanderliegen, und der Kopf muss sich um mehr als sie abheben. Eine Schwelle definiert, was „ununterscheidbar“ heißt; die Schultern müssen es sein, der Kopf darf es nicht.
H₁, T₁, KOPF, T₂, H₂ = fünf alternierende Schwenkpunkte height = KOPF − (T₁ + T₂) / 2 (inverse Formation: gespiegelt; muss > 0 sein) Kopf : KOPF − höhere Schulter > price_tolerance × height (invers: tiefere Schulter − KOPF) Schultern : |H₁ − H₂| ≤ price_tolerance × height Nackenlin.: |T₁ − T₂| ≤ neckline_tolerance × height N(t) = T₁ + (T₂ − T₁) × (t − t₁) / (t₂ − t₁) löst beim ersten Close durch N(t) aus
bar →Bar
bullish ←Boolean inverse Schulter-Kopf-Schulter: true auf dem Bar, der über der Nackenlinie schließt
bearish ←Boolean Schulter-Kopf-Schulter-Top: true auf dem Bar, der unter der Nackenlinie schließt
ready ←Boolean false, bis fünf bestätigte Schwenkpunkte vorliegen
lookbackinteger 1–50, Standard 5tunable
price_tolerancenumber 0.01–0.5, Standard 0.1tunable
neckline_tolerancenumber 0.01–1.0, Standard 0.25tunable
confirm_within_rationumber 0.1–5.0, Standard 1.0tunable
Dreieck
Indicator.Triangle
Vier-Schwenkpunkt-Fortsetzungsformen mit konvergierenden Begrenzungen: aufsteigend (flache Hochs, steigende Tiefs), absteigend (flache Tiefs, fallende Hochs) und symmetrisch (beide konvergierend). Eine Form mit beiden Begrenzungen flach ist eine Range und passt auf keine der drei.

Die Ausbruchsniveaus sind waagerecht: oben das höhere der beiden Hochs, unten das tiefere der beiden Tiefs, beide beim Erkennen der Form festgelegt, nicht die geneigten Trendlinien. Ein symmetrisches Dreieck bricht also erst bei einem Close jenseits seines äußersten Schwenkpunkts aus.

Dies ist der einzige Musterblock mit mehr als zwei Signalausgängen. Die drei Formports sind auf jedem abgeschlossenen Bar true, solange die Form scharf geschaltet ist (hinter einem Aggregator nur bei der Auswertung, die einen Bar abschließt). Ein Graph kann damit auf „ein Dreieck bildet sich“ filtern, getrennt vom Ausbruch, denn ein aufsteigendes Dreieck, das nach unten bricht, ist ein Fehlschlag, auf den man reagieren möchte, und die Richtungsports allein können das nicht ausdrücken. Die Toleranz ist ein Anteil der Spannweite des Dreiecks selbst.
span = höchstes High − tiefstes Low der vier Schwenkpunkte band = price_tolerance × span aufsteigend = |H₂ − H₁| ≤ band und L₂ − L₁ > band absteigend = |L₂ − L₁| ≤ band und H₁ − H₂ > band symmetrisch = H₁ − H₂ > band und L₂ − L₁ > band oben = max(H₁, H₂), unten = min(L₁, L₂) (waagerecht) bullish → Close über oben bearish → Close unter unten Fenster: confirm_within_ratio × (Bar des letzten − Bar des ersten Schwenkpunkts) Bars nach dem letzten Schwenkpunkt
bar →Bar
bullish ←Boolean Close bricht über ein aufsteigendes oder symmetrisches Dreieck aus
bearish ←Boolean Close bricht unter ein absteigendes oder symmetrisches Dreieck aus
ascending ←Boolean true, solange ein aufsteigendes Dreieck erkannt und ungebrochen ist
descending ←Boolean true, solange ein absteigendes Dreieck erkannt und ungebrochen ist
symmetrical ←Boolean true, solange ein symmetrisches Dreieck erkannt und ungebrochen ist
ready ←Boolean false, bis vier bestätigte Schwenkpunkte vorliegen
lookbackinteger 1–50, Standard 5tunable
price_tolerancenumber 0.01–0.5, Standard 0.1tunable
confirm_within_rationumber 0.1–5.0, Standard 1.0tunable
Flagge
Indicator.Flag
Vier-Schwenkpunkt-Fortsetzung: ein kräftiger Impulsschenkel (die Stange), gefolgt von einer flachen Gegenbewegungs-Konsolidierung, abgeschlossen, wenn der Close wieder durch die Stangenspitze bricht. pole_ratio ist die Höhe der Stange als Vielfaches der Höhe der Konsolidierung. Dieses Verhältnis ist die visuelle Definition einer Flagge, und es ist wie jede andere Schwelle hier selbstbezogen. max_retracement begrenzt, wie viel der Stange die Gegenbewegung zurückgeben darf; tiefer als das ist ein Umkehrkandidat, keine Fortsetzung, und beide sollten sich kein Signal teilen.

Der Standard-lookback ist 3 statt 5, weil die Konsolidierung einer Flagge definitionsgemäß kurz ist und ein 5-Bar-Fraktal darin oft keine zwei Schwenkpunkte auflösen kann.
P₀, P₁, P₂, P₃ = vier alternierende Schwenkpunkte (Bullenflagge: Tief, Hoch, Tief, Hoch) pole = P₁ − P₀ flag_range = P₃ − P₂ Stärke : pole ≥ pole_ratio × flag_range Flachheit : P₂ > P₁ − max_retracement × pole Eingrenzung: P₃ ≤ P₁ Hält: P₂ > P₀ löst bullish beim ersten Close über P₁ aus verworfen, wenn zuerst ein Close unter P₂ fällt Fenster: confirm_within_ratio × (P₃.bar − P₁.bar) Bars nach P₃
bar →Bar
bullish ←Boolean Bullenflagge: true auf dem Bar, der über dem Stangenhoch schließt
bearish ←Boolean Bärenflagge: true auf dem Bar, der unter dem Stangentief schließt
ready ←Boolean false, bis vier bestätigte Schwenkpunkte vorliegen
lookbackinteger 1–50, Standard 3tunable
pole_rationumber 1.0–10.0, Standard 2.0tunable
max_retracementnumber 0.05–0.95, Standard 0.5tunable
confirm_within_rationumber 0.1–5.0, Standard 1.0tunable

Gate

Einstiegsfilter und Regime-Klassifikation. Gate-Blöcke steuern, wann Trades erlaubt sind, basierend auf Tageszeit, Trend, Volatilität oder Marktregime. Gate-Ausgänge in Logic.And mit Eintrittsbedingungen verketten. In der Aufwärmphase lassen Trend Gate und Volatility Gate Einstiege zu, HMM Regime und Regime Cluster sperren sie (allow = false), und Regime Filter meldet NEUTRAL.

Session Filter
Gate.Session
True, wenn der Timestamp des eingehenden Bars (der Anfang seiner Periode) innerhalb des konfigurierten CET-Zeitfensters liegt. Mit dem Basis-Bar speisen: hinter einem Aggregator wird der Anfang des letzten abgeschlossenen Bars der höheren Zeiteinheit geprüft. In den Trigger eines Einstiegs verdrahtet, beschränkt er Einstiege auf das konfigurierte Zeitfenster. Das Fenster ist halboffen (start ≤ t < end), und ein Start nach dem Ende bedeutet eine Übernacht-Session. Dies ist die einzige Tagesuhr im Graphen, die CET/CEST folgt: Aggregator.D1, Indicator.VWAP und Indicator.PivotPoints legen ihren Tag ganzjährig auf ein festes UTC+1 (siehe den Hinweis bei den Aggregatoren). Alle vier Stunden- und Minutenparameter können als tunable markiert und von PSO durchsucht werden. So wird ein Session-Start optimiert statt geraten.
bar →Bar
allowed ←Boolean
start_hourinteger 0–23, Standard 7tunable
start_minuteinteger 0–59, Standard 0tunable
end_hourinteger 0–23, Standard 20tunable
end_minuteinteger 0–59, Standard 0tunable
use_cetboolean Standard true false wertet das Fenster in UTC aus
Trend Gate
Gate.TrendGate
Sperrt LONG-Einstiege, solange der ATR-normalisierte EMA-Slope unter dem Schwellenwert (block_long_below_slope) liegt. Der slope-Ausgang ist für weitere Gatings oder Plot verfügbar.
slope[t] = (EMA[t] − EMA[t − slope_lookback]) / ATR[t] (ATR EMA-geglättet, α = 2 / (atr_period + 1)) allow_long = slope[t] ≥ block_long_below_slope
bar →Bar
allow_long ←Boolean
slope ←Number + = Aufwärtstrend, − = Abwärtstrend
ema_periodinteger 5–500, Standard 50tunable
atr_periodinteger 2–200, Standard 14tunable
slope_lookbackinteger 2–200, Standard 12tunable
block_long_below_slopenumber −5.0–5.0, Standard −0.5tunable
Volatility Gate
Gate.VolatilityGate
Sperrt ALLE Einstiege, wenn der ATR-Perzentilrang (rollierendes Ranking) die Schwelle überschreitet. Verhindert Handel bei extremen Volatilitätsspitzen (z.B. Flash Crashes, Makrodatenveröffentlichungen). Der percentile-Ausgang zeigt den rollierenden Rang 0–1.
atr_history = rollierendes Fenster von ATR(atr_period)-Werten percentile[t] = Rang von ATR[t] in atr_history / len(atr_history) (0=kleinstes, 1=größtes) allow_entry = percentile[t] ≤ block_above_percentile Filtert erst nach min(200, percentile_window) ATR-Werten; bis dahin allow_entry = true und percentile = 0 (ATR EMA-geglättet, α = 2 / (atr_period + 1))
bar →Bar
allow_entry ←Boolean
percentile ←Number 0–1 ATR-Rang
atr_periodinteger 2–200, Standard 14tunable
percentile_windowinteger 100–20000, Standard 2000tunable
block_above_percentilenumber 0.0–1.0, Standard 0.80tunable
Regime Filter
Gate.RegimeFilter
Klassifiziert den Markt in vier sich gegenseitig ausschließende Regime anhand eines Mehr-Signal-Modells. Jedes Regime ist als Boolean-Ausgang verfügbar, damit unterschiedliche Strategie-Logik ans passende Regime geknüpft werden kann.
Verwendete Eingaben: slope = Änderung der langsamen EMA in % pro Bar über ema_slope_lookback separation = |EMA(fast) − EMA(slow)| / EMA(slow), in % ATR-Perzentil (rollierend) range_compression = (Hoch − Tief der letzten bo_lookback_bars) / (ATR × √bo_lookback_bars) Regime: TRENDING = |slope| ≥ min_slope UND sep ≥ min_sep UND ATR / 100-Bar-Mittelwert ≥ min_atr_ratio_for_trending MEAN_REVERTING = |slope| ≤ max_slope UND atr_pct ≤ max_pct BREAKOUT = range_compression ≤ bo_min_range_compression UND ATR / 100-Bar-Mittelwert ≥ min_atr_ratio_for_breakout NEUTRAL = keines der obigen Treffen mehrere zu → TRENDING, dann BREAKOUT, dann MEAN_REVERTING Nach jedem Wechsel wird das Regime mindestens min_bars_in_regime Bars gehalten, danach wechselt es auf dem ersten Bar, der anders klassifiziert NEUTRAL bis max(ema_slow_period, atr_period) + 10 Bars
bar →Bar
is_trending ←Boolean
is_mean_reverting ←Boolean
is_breakout ←Boolean
is_neutral ←Boolean
ema_fast_periodinteger 2–200, Standard 20tunable
ema_slow_periodinteger 5–500, Standard 50tunable
atr_periodinteger 2–200, Standard 14tunable
ema_slope_lookbackinteger 2–200, Standard 10tunable
min_bars_in_regimeinteger 1–200, Standard 10tunable
trending_min_ema_slopenumber 0–5, Standard 0.0081tunable
trending_min_ema_separationnumber 0–5, Standard 0.0254tunable
mr_max_ema_slopenumber 0–5, Standard 0.0017tunable
mr_max_atr_percentilenumber 0–1, Standard 0.4tunable
bo_min_range_compressionnumber 0–5, Standard 0.5tunable
bo_lookback_barsinteger 2–200, Standard 20tunable
min_atr_ratio_for_trendingnumber 0–3, Standard 0.79tunable
min_atr_ratio_for_breakoutnumber 0–3, Standard 0.64tunable
HMM Regime
Gate.HMMRegime
Ein Hidden-Markov-Modell mit n_states Zuständen (2–5, Standard 3) und Gauß-Emissionen über Log-Rendite und rollierende Volatilität je Bar. Innerhalb eines Walk-Forward-Laufs wird das Modell für jeden Block auf dessen In-Sample-Fenster gefittet und auf die Bars dieses Blocks mit dem Vorwärts-Filter angewendet, Bar für Bar: jede Wahrscheinlichkeit nutzt nur die Bars bis zum aktuellen, nie spätere. Der nächste Block fittet komplett neu. Die Zustände sind nach aufsteigendem gefitteten Volatilitäts-Mittelwert nummeriert, p_state_0 ist also nach jedem Refit der Zustand mit der niedrigsten Volatilität. Die Wahrscheinlichkeits-Ausgänge ab der eigenen Zustandsanzahl liefern 0, und ein übergebenes Modell muss dieselbe Zustandsanzahl haben. Nutzbar in Walk-Forward-Läufen sowie in einem Backtest mit In-Sample-Split (das Modell wird auf dem In-Sample-Teil gefittet) oder einem, dem das Modell des Walk-Forward-Blocks übergeben wird (Block-Detail). Ein Backtest ohne beides lehnt den Graphen ab, ebenso Optimize und der Parameter-Sweep. Solange ready false ist, ist allow false, most_likely_state −1 und jede Wahrscheinlichkeit 1/n_states (die gleichverteilte Anfangsannahme, keine Posterior-Wahrscheinlichkeit), ein Compare auf eine Wahrscheinlichkeit oder ein Größer-/Kleiner-Compare auf most_likely_state kann auf diesen Bars also greifen: mit ready absichern.
observation[t] = ( ln(close[t] / close[t-1]), Standardabweichung der letzten vol_lookback Log-Renditen ) Fit (je Walk-Forward-Block, nur In-Sample-Fenster): Baum-Welch, n_restarts geseedete Starts, höchste Log-Likelihood gewinnt Inferenz (jeder Bar, festes Modell): p[t] = normalise( (p[t-1] · A) ⊙ N(observation[t] | Zustand) ) allow = p_state_<gate_state>[t] ≥ min_probability
bar →Bar
allow ←Boolean false, solange nicht bereit
ready ←Boolean
p_state_0 ←Number Zustand mit niedrigster Volatilität; 1/n_states, solange nicht bereit
p_state_1 ←Number 1/n_states, solange nicht bereit
p_state_2 ←Number 0 bei n_states = 2; 1/n_states, solange nicht bereit
p_state_3 ←Number 0 bei n_states ≤ 3; 1/n_states, solange nicht bereit
p_state_4 ←Number 0 bei n_states ≤ 4; 1/n_states, solange nicht bereit
most_likely_state ←Number 0–(n_states−1); −1, solange nicht bereit
n_statesinteger 2–5, Standard 3
vol_lookbackinteger 2–500, Standard 10
use_volumeboolean Standard false. Nimmt das Volumen des Bars relativ zu seinem gleitenden Mittel als Beobachtung hinzu
use_rangeboolean Standard false. Nimmt die Spanne des Bars, (High − Low) / Close, als Beobachtung hinzu
n_restartsinteger 1–50, Standard 5
max_iterationsinteger 10–2000, Standard 200
seedinteger Standard 42
gate_stateinteger 0–(n_states−1), Standard 0
min_probabilitynumber 0.0–1.0, Standard 0.50
Regime-Cluster
Gate.RegimeCluster
Findet Marktregime empirisch statt über feste Schwellen. Jeder Bar wird durch drei Merkmale beschrieben: realisierte Volatilität (ATR geteilt durch Close), Trendstärke (ADX über adx_period) und die Lag-1-Autokorrelation der Log-Renditen, die Mean-Reversion- von Momentum-Charakter trennt. Kein Volumen: die Bar-Datensätze führen keines zuverlässig. Innerhalb eines Walk-Forward-Laufs wird der Block für jeden Block per k-Means auf dessen In-Sample-Fenster gefittet; die Anzahl der Cluster wird automatisch per Silhouetten-Score im festen Bereich 2–6 gewählt, wobei nur Aufteilungen zählen, deren kleinster Cluster mindestens 5 % des Fensters umfasst, denn eine Handvoll Übergangsbars nach einem Regimewechsel ist kein eigenes Regime. Erfüllt keine Cluster-Anzahl diese Regel, wird die ausgewogenste Aufteilung behalten und in der Walk-Forward-Übersicht markiert. Jedes Merkmal wird danach gewichtet, wie deutlich seine Werte in Gruppen zerfallen, über das hinaus, was reines Rauschen zeigen würde; ein Merkmal, das nur Rauschen ist, lenkt die Cluster also nicht. Die Gewichte stehen je Block in der Walk-Forward-Übersicht. Jeder Bar wird anschließend anhand nur ihrer eigenen Merkmale dem nächsten Cluster zugeordnet, kausal per Konstruktion. Der nächste Block fittet komplett neu. Die Cluster sind nach aufsteigendem Volatilitäts-Zentroid nummeriert, Cluster 0 ist also nach jedem Refit der ruhigste Cluster. Nur Cluster 0 behält diese Bedeutung über Blöcke hinweg: die Anzahl wird für jeden Block neu gewählt, Cluster 2 im einen Block muss also nicht dasselbe Regime sein wie Cluster 2 im nächsten. Die is_cluster_k-Ausgänge ab der gefundenen Anzahl liefern false. Ein Cluster wird ausschließlich über seine gemessenen Merkmals-Mittelwerte beschrieben (mittlere Volatilität, mittlere Trendstärke, mittlere Autokorrelation seiner Bars); nichts bewertet einen Cluster gegen einen anderen. Nutzbar in Walk-Forward-Läufen sowie in einem Backtest mit In-Sample-Split (gefittet auf dem In-Sample-Teil) oder einem, dem das Modell des Walk-Forward-Blocks übergeben wird (Block-Detail). Ein Backtest ohne beides lehnt den Graphen ab, ebenso Optimize und der Parameter-Sweep, und ebenso ein gate_cluster, den der Fit nicht gefunden hat: der Lauf wird abgelehnt statt stillschweigend nie freizugeben. Solange ready false ist, sind allow und jedes is_cluster_k false, cluster ist −1 und die Merkmals-Ausgänge liefern 0: mit ready absichern.
feature[t] = ( ATR(atr_period)[t] / close[t], ADX(adx_period)[t], Lag-1-Autokorrelation der letzten autocorr_lookback Log-Renditen ) Fit (je Walk-Forward-Block, nur In-Sample-Fenster): jedes Merkmal mit Mittelwert und Standardabweichung des Fensters standardisieren jedes Merkmal nach seiner Gruppierung über gaußsches Rauschen gleicher Größe hinaus gewichten für k in 2..6: gewichtetes k-Means (n_restarts k-Means++-Starts, geringste Trägheit gewinnt) zulässige k: jeder Cluster umfasst mindestens 5 % des Fensters das zulässige k mit dem höchsten Silhouetten-Score behalten (bei Gleichstand das kleinere) Cluster nach aufsteigendem Volatilitäts-Zentroid nummerieren Inferenz (jeder Bar, festes Modell): cluster[t] = nächster Zentroid des standardisierten feature[t], dieselben Gewichte allow = cluster[t] == gate_cluster
bar →Bar
allow ←Boolean cluster == gate_cluster; false, solange nicht bereit
ready ←Boolean Merkmale warm und ein gefittetes Modell hat einen Bar zugeordnet
cluster ←Number 0–(n_clusters−1), 0 = niedrigste Volatilität; −1, solange nicht bereit
n_clusters ←Number die vom Fit gewählte Anzahl, 2–6; 0 ohne Modell
is_cluster_0 ←Boolean der Cluster mit der niedrigsten Volatilität; false, solange nicht bereit
is_cluster_1 ←Boolean false, solange nicht bereit
is_cluster_2 ←Boolean false, wenn der Fit weniger als 3 Cluster fand
is_cluster_3 ←Boolean false, wenn der Fit weniger als 4 Cluster fand
is_cluster_4 ←Boolean false, wenn der Fit weniger als 5 Cluster fand
is_cluster_5 ←Boolean false, wenn der Fit weniger als 6 Cluster fand
volatility ←Number ATR / Close; 0 während der Aufwärmphase
trend_strength ←Number ADX, 0–100; 0 während der Aufwärmphase
autocorrelation ←Number −1..1, negativ = Mean-Reversion, positiv = Momentum; 0 während der Aufwärmphase
atr_periodinteger 2–200, Standard 14
adx_periodinteger 2–200, Standard 14
autocorr_lookbackinteger 5–500, Standard 20
gate_clusterinteger 0–5, Standard 0; muss unter der gefundenen Cluster-Anzahl liegen
n_restartsinteger 1–50, Standard 5
max_iterationsinteger 10–1000, Standard 100
seedinteger Standard 42

Compare

Numerische Vergleichsoperatoren. Zwei Number-Eingänge → ein Boolean-Ausgang. Alle Blöcke haben Eingänge a und b (Number) und Ausgang value (Boolean).

BlockTypLogikHinweise
a > bCompare.GTtrue wenn a > bstreng, keine Toleranz
a ≥ bCompare.GTEtrue wenn a ≥ b
a < bCompare.LTtrue wenn a < bstreng
a ≤ bCompare.LTEtrue wenn a ≤ b
a ≈ bCompare.EQ|a − b| ≤ εParameter epsilon, Standard 1e-9

Logic

Boolesche Logikgatter zum Kombinieren von Bedingungen. AND/OR/NOT haben keine Parameter. IF-THEN-ELSE überbrückt Boolean-Bedingungen zu numerischen Werten.

BlockTypEingängeAusgangLogik
ANDLogic.Anda, b (Boolean)Booleana UND b
ORLogic.Ora, b (Boolean)Booleana ODER b
NOTLogic.Nota (Boolean)BooleanNICHT a
IF-THEN-ELSELogic.IfThenElsecondition (Bool), value_if_true, value_if_false (Number)Number, Ausgang resultcondition ? a : b

Logic.And zum Kombinieren von Gate-Bedingungen (Session AND Regime AND Eintrittssignal) verwenden. Logic.IfThenElse zum Auswählen zwischen zwei Stop-Distanzen basierend auf einer Bedingung oder zum Implementieren einer Breakeven-Schutzlogik.

Math

Arithmetische Operationen auf Number-Streams. Die meisten haben zwei Number-Eingänge und einen Number-Ausgang. Kreuzungsblöcke geben Boolean aus. Rolling-Blöcke arbeiten über ein Historiefenster.

BlockTypFormel / Hinweise
a + bMath.Addvalue = a + b
a − bMath.Subvalue = a − b. Anwendung: HighSinceEntry − ATR×mult für Trailing
a × bMath.Mulvalue = a × b. Anwendung: ATR × Konstante für dynamisches Stop-Sizing
a ÷ bMath.Divvalue = a / b. Gibt 0 zurück wenn |b| ≤ 1e-12 (verhindert NaN-Propagation)
|a|Math.AbsBetrag von a. Einzelner Eingang.
min(a,b)Math.Minvalue = min(a, b)
max(a,b)Math.Maxvalue = max(a, b). Anwendung: max(PositionStopLoss, neuerTrail) = Stop nur enger ziehen
a crosses above bMath.CrossesAbovetrue nur auf dem Bar, wo a von ≤ b nach > b wechselt (prev_a ≤ prev_b UND a > b)
a crosses below bMath.CrossesBelowtrue nur auf dem Bar, wo a von ≥ b nach < b wechselt. Beide Blöcke lösen nur zwischen zwei Werten aus, für die jeder vorgeschaltete Block mit Aufwärmphase (Indikatoren, Math.Lag, Gates, auch über andere Math-Blöcke hinweg) bereit war; ein Wert aus der Aufwärmphase wird so nie als Crossing gewertet. Eine Konstante hat keine Aufwärmphase, ein Crossover gegen 0 ist daher ein gewöhnlicher Crossover. Eine 0, die direkt aus einem Ausgang kommt, bei dem 0 „kein Level“ bedeutet (Swing-Preis vor dem ersten Swing, nicht vorhandener Support oder Widerstand, broken_level ohne aktiven Ausbruch), zählt als kein Wert.
Rolling SMAMath.RollingSMASMA eines Upstream-Number-Streams über param period (2–1000, Standard 20)tunable. Eingang: value. z.B. SMA(ATR, 50). Ausgänge value (Number) und ready (Boolean, false bis das Fenster gefüllt ist); bis dahin ist value der Mittelwert der bisherigen Werte.
Lag(N)Math.LagGibt den Upstream-Wert von N Bars zuvor zurück (param period 1–500, Standard 1). Gibt 0 zurück bis N+1 Werte gesehen wurden. Eingang/Ausgang: Number Ausgänge value (Number) und ready (Boolean, false bis N+1 Werte vorliegen).
LagBar(N)Math.LagBarGibt den Upstream-Bar von N abgeschlossenen Higher-Timeframe-Bars zuvor zurück. Rückt nur vor, wenn sich bar.timestamp ändert, und zählt damit abgeschlossene Bars jedes beliebigen Aggregators (D1, M60, M30, M15, M5, M1) unabhängig vom Basis-Timeframe des Graphen. Ein Aggregator gibt bereits den letzten abgeschlossenen Bar aus: Aggregator.D1 → Bar.Field(high) ist das gestrige Hoch, Aggregator.D1 → LagBar(1) → Bar.Field(high) das vorgestrige, und LagBar(N) liegt N abgeschlossene Tage vor dem zuletzt abgeschlossenen. Gibt keinen Bar zurück bis N+1 verschiedene Bars gesehen wurden.
Eigene FormelMath.FormulaEine eigene Berechnung über Eingänge, die am Block deklariert werden: jeder Eingang hat einen Namen und einen Typ (Number oder Boolean, höchstens 16), der eine Ausgang ebenso, und die Formel wird über die Eingangsnamen geschrieben. Operatoren: + - * / % ^ (^ ist die Potenz, rechtsassoziativ und bindet stärker als ein Vorzeichen: -2^2 ist −4), Vergleiche < <= > >= == != (nicht verkettet; == auf Zahlen ist exakt), and or not (auch && || !) und eine Bedingung c ? a : b oder if(c, a, b). Funktionen: abs sqrt floor ceil round sign exp log min max pow clamp (round rundet halbe Werte von null weg, log ist der natürliche Logarithmus, clamp(x, lo, hi) = min(max(x, lo), hi)). Mehr gibt es nicht: keine Schleifen, keinen Text, keine anderen Namen als die Eingänge. Die Formel wird beim Speichern des Graphen und erneut beim Start eines Laufs geprüft; eine Formel, die sich nicht übersetzen lässt, lehnt den Graphen ab, und jeder deklarierte Eingang muss verbunden sein. Zustandslos: gleiche Eingänge ergeben immer denselben Wert. Ein Ergebnis, das keine endliche Zahl ist (Division durch null, Wurzel aus einer negativen Zahl, log von null), gibt auf diesem Bar keinen Wert aus statt 0; b == 0 ? 0 : a / b ist die Absicherung, und ? :, if, and, or werten nur die Seite aus, die sie brauchen. Beispiel: Eingänge high, low, close; Formel (high - low) / close * 100 ergibt die Spanne des Bars in Prozent.

Math.CrossesAbove / Math.CrossesBelow geben Boolean aus. Math.LagBar nimmt einen Bar-Eingang und gibt einen Bar aus. Alle anderen Math-Blöcke geben Number aus. Rolling SMA und Lag nehmen einen einzelnen Number-Eingang namens value; alle anderen nehmen a (und b wo zutreffend).

Sink

Ausgabe-Blöcke, die mit dem Positions-Manager interagieren. Sinks haben keine Ausgänge; sie lösen Seiteneffekte aus (Positionen öffnen, schließen, Stops verschieben).

Entry LONG
Sink.Entry.Long
Öffnet eine LONG-Position, wenn trigger true ist und die Positionslimits der Strategie noch eine LONG-Position zulassen. Beim Standard „eine Position gleichzeitig“ heißt das: keine Position offen, kein Fill ausstehend und auf diesem Bar kein anderer Einstieg ausgelöst; lösen LONG und SHORT gleichzeitig aus, wird nur der in Graph-Reihenfolge erste genommen. In den Graph-Einstellungen lassen sich bis zu 8 offene Positionen je Richtung erlauben, und LONG und SHORT gleichzeitig (Hedging); jeder Einstieg öffnet dann eine eigene Position mit eigenem Stop und Ziel, und ein ausstehender Fill zählt wie eine offene Position gegen das Limit. Jeder Einstieg ist eine Market-Order und wird zur Eröffnung des nächsten Bars ausgeführt, zuzüglich Spread und Slippage. SL- und TP-Abstände werden beim Auslösen erfasst und ab dem tatsächlichen Fill-Preis gemessen. stop_loss_distance ist Pflicht: ohne einen Wert über 0 löst der Einstieg nie aus.
triggerBoolean Einstieg bei true, solange die Positionslimits es zulassen (Standard: wenn flat)
stop_loss_distanceNumber Pflicht, > 0: Punkte unter Fill-Preis
take_profit_distanceNumber optional: Punkte über Fill-Preis; ein negativer Wert blockiert den Einstieg
reasonstring Standard "graph_long". Die Beschriftung, die dieser Einstieg an seinem Trade festhält; sie steht in der Trade-Liste neben dem Exit-Grund (Klartext, höchstens 64 Zeichen, Steuerzeichen werden entfernt); sie ändert den Fill nie
sizenumber Standard 1.0. Positionsgröße in Einheiten; muss größer als 0 sein
Entry SHORT
Sink.Entry.Short
Öffnet eine SHORT-Position nach denselben Regeln wie Entry LONG: zur Eröffnung des nächsten Bars, nur solange die Positionslimits noch eine SHORT-Position zulassen (standardmäßig: nur ohne offene Position) und nur mit einem stop_loss_distance über 0. SL- und TP-Abstände werden für die SHORT-Richtung automatisch angepasst.
triggerBoolean Einstieg bei true, solange die Positionslimits es zulassen (Standard: wenn flat)
stop_loss_distanceNumber Pflicht, > 0: Punkte über Fill-Preis
take_profit_distanceNumber optional: Punkte unter Fill-Preis; ein negativer Wert blockiert den Einstieg
reasonstring Standard "graph_short". Die Beschriftung, die dieser Einstieg an seinem Trade festhält; sie steht in der Trade-Liste neben dem Exit-Grund (Klartext, höchstens 64 Zeichen, Steuerzeichen werden entfernt); sie ändert den Fill nie
sizenumber Standard 1.0. Positionsgröße in Einheiten; muss größer als 0 sein
Exit
Sink.Exit
Schließt offene Position(en), wenn trigger true ist. target ist Pflicht und legt fest, welche: all, oldest, newest oder by_id. Es gibt keinen Standardwert: ein Graph ohne target lädt nicht, denn „die Position schließen" ist mehrdeutig, sobald zwei offen sind. side_filter schränkt die Kandidaten zuerst ein: target=oldest mit side_filter=SHORT schließt also die älteste Short-Position. Ein Exit wird zum Schluss des auslösenden Bars ausgeführt, abzüglich Spread und Slippage, anders als ein Einstieg, der zur Eröffnung des nächsten Bars ausgeführt wird.
triggerBoolean
position_idNumber optional, nur bei target=by_id nötig; benennt die zu schließende Position
targetenum all | oldest | newest | by_id; kein Standardwert, muss gesetzt werden
side_filterenum ANY | LONG | SHORT, Standard ANY
reasonstring Standard "graph_exit". Eine Beschriftung am Trade; ein Graph-Exit wird immer wie ein Market-Exit ausgeführt, egal wie er heißt
fractionnumber Standard 1. Der Anteil jeder gewählten Position, der geschlossen wird. 1 schließt sie ganz; 0,5 schließt die Hälfte und lässt den Rest mit unverändertem Stop-Loss und Take-Profit offen. Der Anteil bezieht sich auf die aktuelle Positionsgröße, zwei Exits mit 0,5 lassen also ein Viertel übrig. Jeder geschlossene Anteil erscheint als eigener Trade mit eigenem P&L.tunable
min_remaining_sizenumber Standard 0. Würde eine Teilschließung weniger als diese Größe übrig lassen, wird stattdessen die ganze Position geschlossen. Gedacht für die kleinste Position, die man tatsächlich halten kann (etwa ein Mindest-Lot). 0 schließt den Rest nie vorzeitig.tunable
Update Stop-Loss
Sink.UpdateStop
Verschiebt den Stop offener Position(en) auf den absoluten Preis value, wenn trigger true ist. Zieht den Stop nur enger und weitet ihn niemals aus (hebt Stop bei Longs, senkt bei Shorts). Verhindert, dass Trailing-Stop-Logik den Stop versehentlich vom Trade wegbewegt. side_filter schränkt die Positionen zuerst ein; target wählt dann, welche den neuen Stop bekommen: standardmäßig alle, oder nur die älteste, die neueste oder die über position_id benannte, wie bei Exit.
Für LONG: neuer Stop nur angewendet wenn value > aktueller Stop und value < Close Für SHORT: neuer Stop nur angewendet wenn value < aktueller Stop und value > Close Gilt für die offenen Positionen, die side_filter durchlässt und target auswählt Typisches Muster: HighSinceEntry → Sub(ATR×mult) → Max(PositionStopLoss, …) → UpdateStop
triggerBoolean löst nur aus, wenn Position offen
valueNumber neues absolutes Stop-Preisniveau
position_idNumber optional, nur bei target=by_id nötig; benennt die Position, deren Stop verschoben wird
targetenum all | oldest | newest | by_id, Standard all
side_filterenum ANY | LONG | SHORT, Standard ANY

Note

Eine Notiz auf der Arbeitsfläche. Ohne Sockets, mit einem einzigen Parameter (dem Text), und die Engine wertet sie nicht aus: eine Strategie rechnet mit und ohne Notiz genau dieselben Trades.

Notiz
Note.Text
Freier Text auf der Arbeitsfläche, um eine Strategie für den nächsten Leser zu erklären, auch für dich selbst. Keine Eingänge, keine Ausgänge, einziger Parameter ist der Text selbst: die Engine überspringt den Knoten vollständig, der Text kann also alles sagen, ohne ein Ergebnis zu verändern. Dafür gedacht, wo ein Blockname (Rechtsklick → Diesen Block benennen) zu kurz ist.
texttext Standard leer. Der Block wird nicht ausgewertet