6.2 KiB
Architekturkonzept: Hybrid Projectional Financial Editor
1. Motivation und Zielsetzung
Entwicklung einer Entwicklungsumgebung für Finanzanalysen (Backtesting, Indikatoren), die die Vorteile zweier Welten vereint:
- Visuelle Programmierung (Blöcke): Für die grobe Architektur, den Datenfluss und die Übersichtlichkeit. Vermeidet Syntaxfehler bei komplexen Verschachtelungen.
- Textuelle Programmierung (S-Expressions): Für mathematische Formeln und Detail-Logik. Ermöglicht schnelle Eingabe und präzises Editieren für Experten.
Das System verhält sich reaktiv (wie "Strudel" für Musik): Änderungen am Code oder an Parametern führen sofort zur Neuberechnung und Aktualisierung der Charts ("Live Coding").
2. Kern-Architektur (MVC)
Die Anwendung folgt strikt dem Model-View-Controller Muster, um Rendering von Logik zu trennen.
Model (Der AST & Environment)
- Immutable AST: Der Abstract Syntax Tree besteht aus unveränderlichen Interfaces (
IAstNode). Jede Änderung erzeugt einen neuen Teilbaum. - Environment (
TAstEnvironment): Hält den Laufzeit-Zustand (Variablen, definierte Makros) und führt den Code aus. - Domain: Spezialisierte Datentypen für Finanzen (
ISeriesfür Zeitreihen,TDecimalfür Währung).
View (TWorkspace & TEditorFrame)
- Aufgabe: Rein visuelle Darstellung. Kennt keine Logik, nur
TControl-Hierarchien. - Rendering: Zeichnet Blöcke, Verbindungen und visuelle Container.
- Input: Leitet Maus- und Tastatur-Events (Drag & Drop) an den Controller weiter.
Controller (TAstEditorController)
- Aufgabe: Das "Gehirn". Synchronisiert AST und View.
- Zustandsverwaltung: Hält den aktuellen validen AST (
FCurrentAst). - Undo/Redo: Speichert Snapshots des ASTs auf einem Stack (Memento Pattern).
- Reaktivität: Feuert
OnChangebei jeder Modifikation, um die Ausführungspipeline anzustoßen.
3. Der Hybride Editor-Ansatz
Das System entscheidet dynamisch, wie ein AST-Knoten dargestellt wird ("Smart Nodes").
A. Die Makro-Ebene (Visuell)
Strukturelle Elemente werden als grafische Blöcke dargestellt:
- Control Flow:
If,Loop,Block(do...end). - Definitionen:
VarDecl,MacroDef. - High-Level Funktionen:
LoadCSV,Chart,Strategy.
Vorteil: Der Benutzer erkennt die Topologie der Strategie auf einen Blick ("Code Folding" durch Visualisierung).
B. Die Mikro-Ebene (Textuell / S-Expressions)
Mathematische Ausdrücke und Parameter werden als Text (Lisp-artige Syntax) dargestellt und editiert.
- Beispiel: Statt eines Baums aus 5 Boxen sieht der User ein Label:
(> Close (SMA Close 20)).
C. Drill-Down Editing (In-Place)
Der innovative Kern des Editors. Wenn ein User einen Knoten bearbeitet (Doppelklick), öffnet sich ein Texteditor über dem Knoten.
- Shallow Printing: Der Editor zeigt nicht den gesamten tiefen Baum als Text, sondern nutzt Platzhalter (
#ID) für komplexe Unter-Knoten.- AST:
If(Condition, ThenBlock, ElseBlock) - Text:
(if #1 #2 #3)
- AST:
- Kontext: Der Controller speichert in einem
TEditContext, welcher AST-Knoten hinter#1steckt. - Navigation: Der User kann
#1mit dem Cursor ansteuern und per Shortcut (z.B.Ctrl+Space) "in-place" expandieren.- Text wird zu:
(if (> Close #4) #2 #3)
- Text wird zu:
- Commit: Beim Bestätigen (Enter) wird der Text geparst (
TAstParser). Die Platzhalter werden durch die originalen, unveränderten AST-Knoten aus dem Kontext ersetzt.
Vorteil: Maximale Effizienz. Man editiert nur das, was man ändern will. Der Rest des Baumes bleibt vor versehentlichen Syntaxfehlern geschützt.
4. Reaktivität & Live Coding
Das System kompiliert und führt den Code permanent aus, nicht erst auf Knopfdruck.
Reactive Pipeline
- Änderung: User zieht einen Block oder ändert eine Zahl.
- Controller: Baut neuen AST ->
OnChange. - Runner: Führt
FEnv.Run(NewAst)aus. - UI Update: Charts und Indikatoren werden neu gezeichnet.
Number Scrubbing
Benutzer können Zahlenwerte (Konstanten) mit der Maus "ziehen" (drücken + ziehen).
- Der Controller aktualisiert den AST "live" (hochfrequent).
- Der Chart verändert sich flüssig während der Mausbewegung.
- Ermöglicht intuitives Finden von Parametern (z.B. "Welche SMA-Länge passt visuell am besten?").
Code as UI (Widgets)
Der Code kann UI-Elemente zurückgeben, die im REPL-Output gerendert werden.
var len := Slider("Period", 10, 200)erzeugt einen Schieberegler.- Bewegt man den Regler, wird das Skript mit dem neuen Wert für
lenerneut ausgeführt.
5. Technische Komponenten (Zusammenfassung)
| Komponente | Verantwortung |
|---|---|
TAstPrettyPrinter |
Wandelt AST-Knoten in S-Expressions ((func arg1 arg2)). Unterstützt "Shallow Printing" mit Platzhaltern. |
TAstParser |
Wandelt S-Expressions zurück in AST-Knoten. Löst Platzhalter (#ID) über den TEditContext auf. |
TEditContext |
Hält die Referenzen zwischen Text-Tokens (#1) und echten IAstNode-Instanzen während des Editierens. |
TRtlRegistry |
Registriert Finanzfunktionen (SMA, RSI) und UI-Widgets (Slider, Chart). |
TAstEditorController |
Orchestriert Edit-Vorgänge. Führt "Path Copying" durch, um den immutablen Baum nach einem Text-Edit zu aktualisieren. |
6. User Workflow Beispiel
- Struktur bauen: User zieht
LoadCSV,VarDecl(für SMA) undChartals Blöcke in den Workspace. - Logik verfeinern: User doppelklickt auf den Parameter des SMA.
- Text Edit: Ein kleines Popup erscheint. User tippt
(* 20 2). - Commit: Aus dem Text wird ein Multiplikations-Knoten. Der Block zeigt nun
40(oder die Formel). - Analyse: Der Chart zeigt sofort den SMA(40).
- Tuning: User klickt auf die
20im Text/Label, zieht die Maus nach rechts. Die Zahl steigt auf25. Der Chart aktualisiert sich in Echtzeit. - Refactoring: User merkt, er braucht Logik. Er klickt auf den SMA-Block und drückt
Ctrl+Space(Wrap in...). WähltIf.- Der SMA ist nun das "Then"-Kind eines neuen If-Blocks.
- Die Struktur wurde geändert, ohne Text kopieren zu müssen.