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, , 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.
Source
Rohdaten-Eingaben: Bar-Kurse, Tick-Kurse, Positionszustand, Zeitkonstanten. Source-Blöcke haben keine Eingänge.
Source.Bar.Current verwenden.Gate.Session nimmt einen , 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.number Standard 0tunableSource.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.integer 0–23, Standard 9integer 0–59, Standard 0boolean Standard truetimestamp 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.enum open | high | low | close | volume | bid | ask | timestamp, Standard closeCompare.GTE für zeitbasierte Ausstiege kombinieren.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.LowSinceEntry + (ATR × mult) → Trailing-Stop.Math.Max(PositionStopLoss, neuerTrail) verhindert, dass der Stop nach hinten wandert.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.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).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:
- Das UTC-Raster, 00:00 UTC. Ein selbst konvertierter Datensatz, die Bars, die der
Chart zeichnet, und die eigene Tick→Bar-Schleife der Engine bucketen alle nach
floor(t / Periode). Das ist Absicht: nur so zeigen Chart, konvertierte Datei und ein Backtest darauf denselben Bar, und es ist allein aus einem Timestamp reproduzierbar, ohne Zeitzonendatenbank. - Ein festes UTC+1, 23:00→23:00 UTC. Die Graph-Blöcke
Aggregator.D1undAggregator.TickToBar.D1legen den Tag so, ebenso der tägliche Reset vonIndicator.VWAPundIndicator.PivotPoints. Das ist Mitternacht in dem Markt, für den diese Plattform gebaut wurde, aber es ist eine feste Stunde über das ganze Jahr: im Winter beginnt der Tag um Mitternacht Berliner Zeit, im Sommer um 01:00.
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.
Source.Tick.Price → mid in price einspeisen, dann Bar-Ausgang an Indikatoren leiten. Nur im Tick-Datenmodus verfügbar.Indicator.EMA für einen sauberen Tages-Trendfilter verwenden.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.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.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.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.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.
value erst auswerten, wenn dies true istinteger 2–500, Standard 20tunablevalue erst auswerten, wenn dies true istinteger 2–500, Standard 20tunablevalue erst auswerten, wenn dies true istinteger 2–500, Standard 20tunableenum open | high | low | close, Standard closevalue erst auswerten, wenn dies true istinteger 2–500, Standard 20tunableenum open | high | low | close, Standard closevalue erst auswerten, wenn dies true istinteger 2–500, Standard 20tunableenum open | high | low | close, Standard closevalue erst auswerten, wenn dies true istinteger 2–500, Standard 20tunableenum open | high | low | close, Standard closevalue erst auswerten, wenn dies true istinteger 2–200, Standard 14tunablevalue erst auswerten, wenn dies true istinteger 2–100, Standard 14tunableperiod+1 Bars, also früher als value, das etwa 2×period Bars brauchtperiod DX-Werte, also später als +DI/−DIinteger 2–100, Standard 14tunableperiod Bars vorliegeninteger 2–200, Standard 20tunableMath.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.period Bars vorliegeninteger 2–200, Standard 14tunablePARABOLIC_SAR, die am Einstieg eines einzelnen Trades verankert ist und nur ausstoppt. Dieser Block läuft durchgehend und dreht.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.number 0.001–0.5, Standard 0.02tunablenumber 0.01–1.0, Standard 0.2tunable liegt es unter acceleration, wird es auf acceleration angehoben; AF steigt dann nieIndicator.ROC nehmen, denn eine feste Momentum-Schwelle bedeutet auf verschiedenen Kursniveaus Verschiedenes.period+1 Closes vorliegen, denn ein Rückblick über N Bars braucht N+1 Closesinteger 1–200, Standard 10tunableMath.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.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.period+1 Closes vorliegeninteger 1–200, Standard 10tunableperiod beträgt, ist ROC auf jedem bereiten Bar exakt 0, denn der Rückblick trifft immer dieselbe Phase.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.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.value erst auswerten, wenn dies true istk und d erst dann auswerten (beide stehen vorher auf 50; k ist auch bei einer Spanne der Breite null 50)integer 2–100, Standard 14tunableinteger 1–50, Standard 3tunableperiod Bars vorliegen; die Bänder erst dann auswerten (alle drei stehen vorher auf 0)integer 2–500, Standard 20tunablenumber 0.1–5.0, Standard 2.0tunableclose > Highest(N) überhaupt wahr werden). Für Donchian-artige Ausbruchsniveaus oder Widerstandserkennung.value erst auswerten, wenn dies true istinteger 2–500, Standard 20tunableenum open|high|low|close, Standard highclose < Lowest(N) ist true, wenn der Schlusskurs unter diesem Minimum liegt.value erst auswerten, wenn dies true istinteger 2–500, Standard 20tunableenum open|high|low|close, Standard lowinteger 1–50, Standard 5tunableinteger 1–50, Standard 5tunableinteger 2–200, Standard 12tunableinteger 5–500, Standard 26tunableinteger 2–100, Standard 9tunableMath.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.Compare.GT oder Compare.LT auf den Ausgang value lassen sich andere Blöcke daran koppeln; die Schwelle ist ein Parameter des Compare-Blocks.integer 2–500, Standard 20tunablemult × 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.integer 2–500, Standard 20tunableinteger 2–200, Standard 14tunablenumber 0.1–10.0, Standard 2.0tunableinteger 2–500, Standard 20tunableMath.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.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.integer 3–50, Standard 10tunablenumber 0.1–2.0, Standard 0.5tunablenumber 1–50, Standard 5tunablenumber 10–1000, Standard 100tunableinteger 0–23, Standard 8tunableinteger 0–59, Standard 0tunableinteger 5–120, Standard 30tunableinteger 0–12, Standard 9tunablepullback_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.boolean Standard truenumber 0.1–3.0, Standard 0.5tunableinteger 3–100, Standard 20tunablemax_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.number 0.1–2.0, Standard 0.3tunablenumber 0.1–2.0, Standard 0.5tunableinteger 3–60, Standard 15tunablebody_ratio seiner Spanne beträgtnumber 0.001–0.5, Standard 0.1tunableGate.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.number 0.3–0.95, Standard 0.6tunablenumber 0.01–0.6, Standard 0.3tunablenumber 0.0–0.4, Standard 0.1tunableopen[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.number 0.1–0.9, Standard 0.5tunablenumber 0.05–1.0, Standard 0.5tunablenumber 0.1–0.9, Standard 0.5tunableIndicator.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.integer 1–50, Standard 5tunablenumber 0.01–0.5, Standard 0.1tunablenumber 1.0–10.0, Standard 3.0tunablenumber 0.1–5.0, Standard 1.0tunableneckline_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.integer 1–50, Standard 5tunablenumber 0.01–0.5, Standard 0.1tunablenumber 0.01–1.0, Standard 0.25tunablenumber 0.1–5.0, Standard 1.0tunableDie 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.
integer 1–50, Standard 5tunablenumber 0.01–0.5, Standard 0.1tunablenumber 0.1–5.0, Standard 1.0tunablepole_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.integer 1–50, Standard 3tunablenumber 1.0–10.0, Standard 2.0tunablenumber 0.05–0.95, Standard 0.5tunablenumber 0.1–5.0, Standard 1.0tunableGate
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.
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.integer 0–23, Standard 7tunableinteger 0–59, Standard 0tunableinteger 0–23, Standard 20tunableinteger 0–59, Standard 0tunableboolean Standard true false wertet das Fenster in UTC ausblock_long_below_slope) liegt. Der slope-Ausgang ist für weitere Gatings oder Plot verfügbar.integer 5–500, Standard 50tunableinteger 2–200, Standard 14tunableinteger 2–200, Standard 12tunablenumber −5.0–5.0, Standard −0.5tunableinteger 2–200, Standard 14tunableinteger 100–20000, Standard 2000tunablenumber 0.0–1.0, Standard 0.80tunableinteger 2–200, Standard 20tunableinteger 5–500, Standard 50tunableinteger 2–200, Standard 14tunableinteger 2–200, Standard 10tunableinteger 1–200, Standard 10tunablenumber 0–5, Standard 0.0081tunablenumber 0–5, Standard 0.0254tunablenumber 0–5, Standard 0.0017tunablenumber 0–1, Standard 0.4tunablenumber 0–5, Standard 0.5tunableinteger 2–200, Standard 20tunablenumber 0–3, Standard 0.79tunablenumber 0–3, Standard 0.64tunableinteger 2–5, Standard 3integer 2–500, Standard 10boolean Standard false. Nimmt das Volumen des Bars relativ zu seinem gleitenden Mittel als Beobachtung hinzuboolean Standard false. Nimmt die Spanne des Bars, (High − Low) / Close, als Beobachtung hinzuinteger 1–50, Standard 5integer 10–2000, Standard 200integer Standard 42integer 0–(n_states−1), Standard 0number 0.0–1.0, Standard 0.50adx_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.integer 2–200, Standard 14integer 2–200, Standard 14integer 5–500, Standard 20integer 0–5, Standard 0; muss unter der gefundenen Cluster-Anzahl liegeninteger 1–50, Standard 5integer 10–1000, Standard 100integer Standard 42Compare
Numerische Vergleichsoperatoren. Zwei Number-Eingänge → ein Boolean-Ausgang. Alle Blöcke haben Eingänge a und b (Number) und Ausgang value (Boolean).
| Block | Typ | Logik | Hinweise |
|---|---|---|---|
| a > b | Compare.GT | true wenn a > b | streng, keine Toleranz |
| a ≥ b | Compare.GTE | true wenn a ≥ b | |
| a < b | Compare.LT | true wenn a < b | streng |
| a ≤ b | Compare.LTE | true wenn a ≤ b | |
| a ≈ b | Compare.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.
| Block | Typ | Eingänge | Ausgang | Logik |
|---|---|---|---|---|
| AND | Logic.And | a, b (Boolean) | Boolean | a UND b |
| OR | Logic.Or | a, b (Boolean) | Boolean | a ODER b |
| NOT | Logic.Not | a (Boolean) | Boolean | NICHT a |
| IF-THEN-ELSE | Logic.IfThenElse | condition (Bool), value_if_true, value_if_false (Number) | Number, Ausgang result | condition ? 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.
| Block | Typ | Formel / Hinweise |
|---|---|---|
| a + b | Math.Add | value = a + b |
| a − b | Math.Sub | value = a − b. Anwendung: HighSinceEntry − ATR×mult für Trailing |
| a × b | Math.Mul | value = a × b. Anwendung: ATR × Konstante für dynamisches Stop-Sizing |
| a ÷ b | Math.Div | value = a / b. Gibt 0 zurück wenn |b| ≤ 1e-12 (verhindert NaN-Propagation) |
| |a| | Math.Abs | Betrag von a. Einzelner Eingang. |
| min(a,b) | Math.Min | value = min(a, b) |
| max(a,b) | Math.Max | value = max(a, b). Anwendung: max(PositionStopLoss, neuerTrail) = Stop nur enger ziehen |
| a crosses above b | Math.CrossesAbove | true nur auf dem Bar, wo a von ≤ b nach > b wechselt (prev_a ≤ prev_b UND a > b) |
| a crosses below b | Math.CrossesBelow | true 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 SMA | Math.RollingSMA | SMA 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.Lag | Gibt 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.LagBar | Gibt den Upstream- 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 Formel | Math.Formula | Eine 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 -Eingang und gibt einen 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).
string 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 nienumber Standard 1.0. Positionsgröße in Einheiten; muss größer als 0 seinstring 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 nienumber Standard 1.0. Positionsgröße in Einheiten; muss größer als 0 seinall, 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.target=by_id nötig; benennt die zu schließende Positionenum all | oldest | newest | by_id; kein Standardwert, muss gesetzt werdenenum ANY | LONG | SHORT, Standard ANYstring Standard "graph_exit". Eine Beschriftung am Trade; ein Graph-Exit wird immer wie ein Market-Exit ausgeführt, egal wie er heißtnumber 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.tunablenumber 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.tunabletarget=by_id nötig; benennt die Position, deren Stop verschoben wirdenum all | oldest | newest | by_id, Standard allenum ANY | LONG | SHORT, Standard ANYNote
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.
text Standard leer. Der Block wird nicht ausgewertet