Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03653.jsonl.gz/411

Um Regeln mit dem im letzten Artikel beschriebenen Editor erstellen zu können ist es nötig, ein Objektmodel zu bauen. In diesem Objektmodel müssen alle Informationen wie Indikatorberechnungen und aktuelle Kurse sowie statistische Auswertungen als Properties, Methoden oder Static Method Extensions zur Verfügung stehen. Sobald dieses Model steht kann der Editor verwendet werden um die Regeln zu definieren.
Die Definition ist kinderleicht und wird durch intellisense unterstützt. Man hat sämtliche Klassen des .NET Frameworks und fast alle C# Bordmittel zur Verfügung. Allerdings empfiehlt es sich, Berechnungen und komplexe Ausdrücke nicht im Editor zu schreiben sondern – wie im Bild – sich auf die Abfrage von Properties und den Aufruf von simplen Funktionen zu beschränken.
Der Hintergrund dieser Empfehlung ist schlicht und ergreifend die Performance. Jeder Ausdruck wird im Regelfile (XML-Syntax) hinterlegt und zur Laufzeit via Reflection ausgeführt. Komplexe Ausdrücke führen dazu, dass viele Reflection Calls im Hintergrund aufgerufen werden müssen. Gerade für ein Handelssystem im Realtimebereich ist die Performance immens wichtig.
Sind die Regeln definiert können diese mit dem Regeleditor versioniert abgelegt werden. Dies ist ein geniales Feature wenn man bedenkt, dass man bei der Entwicklung eines Algorithmus viele Varianten durchprobieren muss und viele nicht zielführend sind.
Auf dieser Ebene des Editors wird die Version und der Typ auf den die Regeln angewendet werden sollen festgelegt. Solch ein Regelwerk ist selbstverständlich auch in anderen Bereichen wie z.B. einem Billingsystem sehr hilfreich.
Nachdem das Regelwerk erstellt ist fehlt nur noch die Routine zur Ausführung dessen. Auch dies ist ganz einfach:
public void ExecuteRuleset(string rulesetPath, T objectModel) where T : class { using (XmlReader xmlReader = XmlReader.Create(new StreamReader(rulesetPath))) { var serializer = new WorkflowMarkupSerializer(); var ruleDefinitions = serializer.Deserialize(xmlReader) as RuleDefinitions; if (ruleDefinitions != null) { var ruleset = ruleDefinitions.RuleSets.FirstOrDefault(); if (ruleset != null) { var validation = new RuleValidation(typeof(T), null); if (ruleset.Validate(validation)) { ruleset.Execute(new RuleExecution(validation, objectModel)); } } } } }
Mit dieser Methode kann ein Regelwerk geladen, validiert und ausgeführt werden. Die Leistungsfähigkeit dieser Technologie ist gigantisch wenn man sie mit Sachverstand einsetzt. Sie ermöglicht einem
eine Felxibilität, von der man vor einigen Jahren noch geträumt bzw. für teures Geld von Firmen, die sich auf diesen Bereich spezialisiert haben, hätte einkaufen müssen.