Thursday, 14 September 2017

Design Muster Handelssystem


Ich bin dabei, eine Handelsanwendung zu entwerfen, die eine Markets API verwendet, um Aufträge auf dem Markt zu platzieren. Dies ist nicht eine komplexe Hochleistungs-algorithmische Handelsanwendung der Art, die in Investmentbanken gefunden wird. Dies ist nur eine kleine persönliche Bewerbung, die vielleicht zwei - oder dreimal am Tag je nach Marktbedingungsstrategie handeln wird. Die Anwendung wird (grob) der folgenden Module umfassen: Strategien - Die eigentlichen Trading-Algorithmen Analytics - Die Klassen für die Analyse der Live-Preise Amp-Aufträge Auf dem Markt zu produzieren Buysell-Signale Dienstleistungen - Die Klassen verwendet, um eine Verbindung zum Markt zu erhalten, abrufen Marktinformationen und Ort Buysell Bestellungen. Bisher ist alles, was für die Applikation erforderlich ist, im Internet verfügbar: Apache CXF für die Erstellung der Java-Klassen für den Zugriff auf die Märkte Web Services. Apache Mathe für die Durchführung der Preisanalytik Wikipedia für die verschiedenen Design-Muster i. e. Factory, SubjectObserver, State, etc. Wo bin ich wirklich stecken aber ist mit den Algorithmen. Ive beschlossen, das Staatsmuster zu verwenden, um in logische Gruppierungen zu partitionieren, die verschiedenen Logikstücke, die durchgeführt werden sollten, wenn bestimmte Marktbedingungen erfüllt sind. Das Problem ist, dass ich anfange zu sehen, dass es sehr wahrscheinlich ist, dass jede staatliche Klasse wird eine Explosion von if else Aussagen enthalten: Ich kann nicht helfen, aber fühlen Im fehlt etwas hier und dass es muss einige Framework oder Design-Muster Ich weiß nicht, welche Ermöglicht es dem Entwickler, alle Eingänge und Ausgänge eines gegebenen Geschäftskontexts in eine endliche Anzahl von Geschäftsaktionen einzugeben, die auf den Geschäftsregeln festgelegt sind. I. e. Anstatt die Algorithmen zu kodieren, ich hoffe, dass es möglich sein sollte, die Anwendung zu einem Regelprozessor irgendwelcher Art zu machen. Leider weiß ich nicht, wo ich anfangen soll. Ich hoffe Ive erklärte mein Dilema deutlich genug, wenn du mir gern etwas klären willst, lass es mich wissen. Vielen Dank gefragt 8. Oktober 09 bei 22: 48Messaging Patterns 187 Integrationsmuster in der Praxis 187 Fallstudie: Bond Trading System (von Jonathan Simon) Es ist leicht, sich von einer großen Sammlung von Mustern oder einer Mustersprache zu distanzieren. Muster sind die Abstraktion einer Idee in einer wiederverwendbaren Form. Oft ist die sehr generische Natur der Muster, die sie so nützlich macht, sie auch schwer zu begreifen. Manchmal ist das Beste, um zu helfen, Muster zu verstehen, ein echtes Weltbeispiel. Nicht ein konstruiertes Szenario dessen, was passieren könnte, aber was tatsächlich passiert und was passieren wird. Dieses Kapitel verwendet Muster, um Probleme mit einem Entdeckungsprozess zu lösen. Das System, das wir diskutieren werden, ist ein Bond-Handelssystem, mit dem ich seit zwei Jahren von der Erstausbildung über die Produktion gearbeitet habe. Wir werden Szenarien und Probleme erforschen, die aufgetreten sind und wie man sie mit Mustern lösen kann. Hierbei handelt es sich um den Entscheidungsprozess der Auswahl eines Musters, sowie die Kombination und Anpassung der Muster an die Bedürfnisse des Systems. Und dies geschieht unter Berücksichtigung der Kräfte, die in realen Systemen, einschließlich Geschäftsanforderungen, Kundenentscheidungen, architektonischen und technischen Anforderungen, sowie Legacy-System-Integration angetroffen werden. Die Absicht dieses Ansatzes ist es, ein klareres Verständnis der Muster selbst durch praktische Anwendung zu ermöglichen. Aufbau eines Systems Eine große Wall Street Investment Bank setzt sich dafür ein, ein Anleihe-Preissystem aufzubauen, um den Workflow ihres Bond-Trading-Desk zu rationalisieren. Derzeit müssen Anleihehändler die Preise für eine Vielzahl von Anleihen an verschiedene Handelsplätze senden, jeweils mit eigener Benutzeroberfläche. Das Ziel für das System ist es, die Minutien der Preisgestaltung alle ihre Anleihen in Kombination mit fortschrittlichen analytischen Funktionalität, die für den Rentenmarkt in einer einzigen gekapselten Benutzeroberfläche. Dies bedeutet Integration und Kommunikation mit mehreren Komponenten über verschiedene Kommunikationsprotokolle. Der High-Level-Flow des Systems sieht so aus: Zuerst kommen Marktdaten ins System. Marktdaten sind Daten über den Preis und andere Eigenschaften der Anleihe, die vertreten, was die Leute bereit sind, die Anleihe für den freien Markt zu kaufen und zu verkaufen. Die Marktdaten werden sofort an die Analytik-Engine gesendet, die die Daten verändert. Analytics bezieht sich auf mathematische Funktionen für Finanzanwendungen, die die Preise und andere Attribute von Anleihen verändern. Dies sind generische Funktionen, die Eingabevariablen verwenden, um die Ergebnisse der Funktion an eine bestimmte Bindung anzupassen. Die Client-Anwendung, die auf jedem Trader-Desktop ausgeführt wird, konfiguriert die Analytics-Engine auf einer pro Trader-Basis und steuert die Besonderheiten der Analytics für jede Bindung, die der Händler pricing ist. Sobald die Analytik auf die Marktdaten angewendet wird, werden die geänderten Daten an verschiedene Handelsplätze verschickt, in denen Händler anderer Firmen die Anleihen kaufen oder verkaufen können. Architektur mit Patterns Mit diesem Überblick über den Workflow des Systems können wir uns einige der architektonischen Probleme, die wir während des Designprozesses antreffen, ansprechen. Lass uns einen Blick darauf werfen, was wir bis heute wissen Händler benötigen eine sehr ansprechende Anwendung auf Windows NT und Solaris Workstations. Deshalb haben wir uns entschlossen, die Client-Applikation als Java-Dick-Client zu implementieren, und zwar aufgrund der Plattformunabhängigkeit und der Fähigkeit, schnell auf Benutzereingaben und Marktdaten zu reagieren. Auf der Serverseite erben wir Legacy-C-Komponenten, die unser System nutzen wird. Die Marktdatenkomponenten kommunizieren mit der TIBCO Information Bus (TIB) Messaging-Infrastruktur. Wir erben die folgenden Komponenten: Marktdaten Price Feed Server. Veröffentlicht eingehende Marktdaten an die TIB. Analytics Engine Führt Analysen zu eingehenden Marktdaten durch und überträgt die geänderten Marktdaten an die TIB. Beitragsserver. Führt alle Kommunikation mit Handelsplätzen durch. Die Handelsplätze sind Drittanbieterkomponenten, die nicht von der Bank kontrolliert werden. Legacy Market Data Subsystem Legacy Contribution Subsystem Wir müssen entscheiden, wie die einzelnen Subsysteme (Java dick Client, Marktdaten und Beitrag) kommunizieren werden. Wir könnten den dicken Client direkt mit den Legacy-Servern kommunizieren, aber das würde zu viel Geschäftslogik auf dem Client erfordern. Stattdessen bauen Sie ein Paar Java-Gateways, um mit den Legacy-Servern zu kommunizieren. Das Pricing Gateway für Marktdaten ein Contribution Gateway für das Versenden von Preisen an Handelsplätze. Dies wird eine gute Kapselung der Geschäftslogik in Bezug auf diese Bereiche zu erreichen. Die aktuellen Komponenten im System sind nachfolgend dargestellt. Die Verbindungen markiert als. Dass wir uns noch nicht sicher sind, wie einige der Komponenten kommunizieren werden. Das System und seine Komponenten Die erste Kommunikationsfrage ist, wie man den Java-dicken Client und die beiden Java-Server-Komponenten integriert, um Daten auszutauschen. Schauen wir uns die vier in diesem Buch vorgeschlagenen Integrationsstile an: File Transfer. Gemeinsame Datenbank. Remote-Prozedur Aufruf. Und Messaging. Wir können Shared Database sofort ausschließen, weil wir eine Ebene der Abstraktion zwischen dem Client und der Datenbank erstellen möchten und nicht möchten, dass der Datenbankzugriffscode im Client vorliegt. File Transfer kann gleichermaßen ausgeschlossen werden, da eine minimale Latenzzeit erforderlich ist, um sicherzustellen, dass aktuelle Preise an die Handelsplätze versandt werden. Damit haben wir die Wahl zwischen Remote Procedure Invocation oder Messaging. Die Java-Plattform bietet eine integrierte Unterstützung sowohl für Remote Procedure Invocation als auch für Messaging. Die RPC-Stil-Integration kann mit Remote Method Invocation (RMI), CORBA oder Enterprise Java Beans (EJB) erreicht werden. Der Java Messaging Service (JMS) ist die gemeinsame API für die Integration von Messaging-Stil. So sind beide Integrationsstile in Java einfach zu implementieren. Also, was wird besser für dieses Projekt, Remote Procedure Invocation oder Messaging. Es gibt nur eine Instanz des Pricing Gateway und eine Instanz des Contribution Gateway im System, aber meist viele Thick Clients verbinden sich gleichzeitig mit diesen Services (eine für jeden Bond-Trader, der zu einem bestimmten Zeitpunkt eingeloggt ist). Darüber hinaus möchte die Bank dies ein generisches Preissystem sein, das in anderen Anwendungen genutzt werden kann. So neben einer unbekannten Anzahl von Think Clients, kann es eine unbekannte Anzahl von anderen Anwendungen mit den Preisdaten, die aus den Gateways kommen. Ein Thick Client (oder eine andere Anwendung, die die Preisdaten verwendet) kann ziemlich einfach RPC verwenden, um Anrufe an die Gateways zu tätigen, um Preisdaten zu erhalten und die Verarbeitung aufzurufen. Allerdings werden die Preisdaten ständig veröffentlicht werden, und bestimmte Kunden sind nur an bestimmten Daten interessiert, so dass die relevanten Daten an die richtigen Kunden in einer fristgerechten Weise könnte schwierig sein. Die Clients könnten die Gateways abfragen, aber das wird eine Menge Overhead schaffen. Es wäre besser für die Gateways, die Daten den Kunden zur Verfügung zu stellen, sobald sie verfügbar sind. Dies erfordert jedoch, dass jedes Gateway beherrscht, welche Clients derzeit aktiv sind und welche wollen, welche Daten dann verfügbar sind, wenn ein neues Datenstück verfügbar wird (was mehrmals pro Sekunde passieren wird), muss das Gateway machen Ein RPC an jeden interessierten Client, um die Daten an den Client weiterzugeben. Idealerweise sollten alle Clients gleichzeitig benachrichtigt werden, so dass jeder RPC in seinem eigenen gleichzeitigen Thread gemacht werden muss. Das kann funktionieren, wird aber sehr schnell sehr kompliziert. Messaging vereinfacht dieses Problem erheblich. Mit Messaging. Wir können separate Kanäle für die verschiedenen Arten von Preisdaten definieren. Dann, wenn ein Gateway bekommt ein neues Stück von Daten, wird es eine Nachricht, die diese Daten, um die Publish-Abonnement-Kanal für diesen Datentyp. Mittlerweile werden alle Kunden, die sich für eine bestimmte Art von Daten interessieren, auf den Kanal für diesen Typ hören. Auf diese Weise können die Gateways problemlos neue Daten an wen, was interessiert ist, aussenden, ohne dass man wissen muss, wie viele Höreranwendungen es gibt oder was sie sind. Die Klienten müssen noch in der Lage sein, Verhalten in den Gateways auch aufzurufen. Da es immer nur zwei Gateways gibt und der Client vermutlich blockieren kann, während die Methode synchron aufgerufen wird, können diese Client-to-Gateway-Aufrufe einfach mit RPC implementiert werden. Da wir aber bereits Messaging für Gateway-to-Client-Kommunikation verwenden, sind die Meldungen wohl genauso gut, um auch die Client-to-Gateway-Kommunikation zu implementieren. Daher wird die gesamte Kommunikation zwischen den Gateways und den Clients durch Messaging durchgeführt. Da alle Komponenten in Java geschrieben sind, bietet JMS eine einfache Wahl für das Messaging-System. Dies schafft effektiv einen Message Bus oder eine Architektur, die es ermöglicht, dass zukünftige Systeme mit dem aktuellen System mit wenig oder gar keiner Änderung der Messaging-Infrastruktur integrieren können. Auf diese Weise kann die Geschäftsfunktionalität der Anwendung leicht von anderen Anwendungen genutzt werden, die die Bank entwickelt. Java-Komponenten Die Kommunikation mit JMS JMS ist einfach eine Spezifikation und wir müssen uns für ein JMS-kompatibles Messaging-System entscheiden. Wir haben beschlossen, IBM MQSeries JMS zu verwenden, weil die Bank ein IBM-Shop ist, mit WebSphere-Anwendungsservern und vielen anderen IBM-Produkten. Als Ergebnis werden wir MQSeries verwenden, da wir bereits eine Support-Infrastruktur und eine Website-Lizenz des Produkts haben. Die nächste Frage ist, wie man das MQSeries Messaging System mit dem eigenständigen C Contribution Server und den TIBCO basierten Market Data und Analytics Engine Servern verbindet. Wir brauchen einen Weg für die MQSeries-Konsumenten, um Zugang zu den TIB-Nachrichten zu haben. Aber wie könnten wir das Message Translator-Muster verwenden, um TIB-Nachrichten in MQSeries-Nachrichten zu übersetzen. Obwohl der C-Client für MQSeries als Message Translator dient. Es würde die Unabhängigkeit des JMS-Servers beeinträchtigen. Und obwohl TIBCO eine Java API hat, haben der Kunden Architekt und Manager es abgelehnt. Infolgedessen muss der Message Translator-Ansatz aufgegeben werden. Die Brücke vom TIB-Server zum MQSeries-Server erfordert die Kommunikation zwischen C und Java. Wir könnten CORBA verwenden, aber dann was ist mit dem Messaging Ein genauerer Blick auf das Message Translator-Muster zeigt, dass es mit dem Channel-Adapter in seiner Verwendung von Kommunikationsprotokollen verwandt ist. Das Herz eines Channel-Adapters besteht darin, Nicht-Messaging-Systeme mit Messaging-Systemen zu verbinden. Ein Paar Kanaladapter, die zwei Messaging-Systeme miteinander verbinden, ist eine Messaging Bridge. Der Zweck einer Messaging Bridge ist es, Nachrichten von einem Messaging-System zu einem anderen zu übertragen. Das ist genau das, was wir mit der zusätzlichen Komplexität der intra-language Java to C Kommunikation machen. Wir können die Cross Language Messaging Bridge mit einer Kombination aus Channel Adapter s und CORBA implementieren. Wir bauen zwei leichte Channel-Adapter-Server, eine in C, die die Kommunikation mit dem TIB verwaltet, und eine in Java, die die Kommunikation mit JMS verwaltet. Diese beiden Kanaladapter. Die Message Endpoint s selbst sind, kommunizieren miteinander über CORBA. Wie unsere Wahl für MQSeries, werden wir CORBA anstatt JNI verwenden, da es ein Firmenstandard ist. Die Messaging-Brücke implementiert die effektiv simulierte Nachrichtenübersetzung zwischen scheinbar inkompatiblen Messaging-Systemen und verschiedenen Sprachen. Meldungs-Übersetzer mit Kanaladaptern Das nächste Diagramm zeigt das aktuelle Systemdesign einschließlich der Gateways und anderer Komponenten. Dies ist ein gutes Beispiel für Musteranwendung. Wir kombinierten zwei Kanaladapter s mit einem Nicht-Messaging-Protokoll, um das Message Translator-Muster zu implementieren, wobei wir effektiv ein Muster verwenden, um ein anderes Muster zu implementieren. Darüber hinaus haben wir den Channel-Adapter-Kontext geändert, um zwei Messaging-Systeme mit einem Nicht-Messaging-Cross-Language-Übersetzungsprotokoll zu verknüpfen, anstatt ein Messaging-System mit einem Nicht-Messaging-System zu verbinden. Das aktuelle System mit den Kanaladaptern Strukturieren von Kanälen Ein Schlüssel zum Arbeiten mit Mustern ist nicht nur zu wissen, wann man welches Muster benutzt, sondern auch, wie man es am effektivsten benutzt. Jede Musterimplementierung muss die Besonderheiten der Technologieplattform sowie andere Designkriterien berücksichtigen. In diesem Abschnitt wird der gleiche Entdeckungsprozess angewendet, um die effizienteste Nutzung des Publish-Abonnementkanals im Rahmen des Marktdatenservers, der mit der Analytics-Engine kommuniziert, zu finden. Echtzeit-Marktdaten entstehen mit Marktdaten-Feed, einem C-Server, der Marktdaten auf der TIB überträgt. Der Marktdaten-Feed verwendet einen separaten Publish-Abonnement-Kanal für jede Bindung, für die er die Preise veröffentlicht. Das mag ein wenig extrem sein, da jede neue Bindung ihren eigenen neuen Kanal braucht. Aber das ist nicht so schwer, da man eigentlich keine Kanäle in TIBCO schaffen muss. Vielmehr werden die Kanäle durch einen hierarchischen Satz von Themennamen bezeichnet, der als Themen bezeichnet wird. Der TIBCO-Server filtert dann einen einzelnen Nachrichtenfluss nach Thema und sendet jedes einzelne Subjekt einem einzelnen virtuellen Kanal. Das Ergebnis davon ist ein sehr leichter Nachrichtenkanal. Wir könnten ein System erstellen, das auf einigen Kanälen veröffentlicht wird und Abonnenten nur auf die Preise hören können, die sie interessieren. Dies würde es den Teilnehmern ermöglichen, einen Message Filter oder Selective Consumer zu verwenden, um den gesamten Datenfluss für interessante Anleihekurse zu filtern und zu entscheiden, ob jede Nachricht Sollte verarbeitet werden, wie es empfangen wird. Angesichts der Tatsache, dass die Marktdaten auf Bond-dedizierten Kanälen veröffentlicht werden, können sich Abonnenten für Updates auf einer Reihe von Anleihen registrieren. Dies ermöglicht es den Teilnehmern, durch selektives Abonnieren von Kanälen zu filtern, und nur Empfangen von Nachrichten von Interesse zu erhalten, anstatt zu entscheiden, nachdem die Nachricht empfangen wurde. Es ist wichtig zu beachten, dass die Verwendung von mehreren Kanälen zu vermeiden Filterung ist eine nicht standardisierte Verwendung von Messaging-Kanäle. Im Kontext der TIBCO-Technologie entscheiden wir aber grundsätzlich, ob wir die in TIBCO eingebauten Kanalfilterung implementieren oder eigene nutzen oder anstatt, wie man so viele Kanäle einsetzt. Die nächste Komponente, die wir entwerfen müssen, ist die Analytik-Engine, ein weiterer CTIB-Server, der die Marktdaten modifiziert und an die TIB weiterverbreitet. Obwohl es außerhalb des Geltungsbereichs unserer JavaJMS-Entwicklung liegt, arbeiten wir eng mit dem C-Team zusammen, um es zu entwerfen, da wir die Analytics-Motoren primärer Kunde sind. Das Problem besteht darin, die Kanalstruktur zu finden, die die neu modifizierten Marktdaten am effizientesten wiedergibt. Da wir bereits einen dedizierten Message Channel pro Anleihe haben, der aus dem Marktdatenpreis-Feed geerbt wird, wäre es logisch, die Marktdaten zu modifizieren und die modifizierten Marktdaten auf dem Bond-dedizierten Message Channel zu übertragen. Aber das wird nicht funktionieren, da die Analytics, die die Anleihenpreise ändern, traderspezifisch sind. Wenn wir die geänderten Daten auf dem Bond Message Channel erneut senden. Wir werden die Datenintegrität zerstören, indem wir generische Marktdaten mit traderspezifischen Daten ersetzen. Auf der anderen Seite könnten wir einen anderen Nachrichtentyp für traderspezifische Marktdaten haben, die wir auf demselben Kanal veröffentlichen, so dass die Teilnehmer entscheiden können, welche Nachricht sie interessieren, um die Datenintegrität zu zerstören. Aber dann müssen die Kunden ihre eigenen Filter implementieren, um Nachrichten für andere Händler zu trennen. Darüber hinaus gibt es eine erhebliche Zunahme der Nachrichten, die von den Abonnenten empfangen werden, die eine unnötige Belastung auf sie setzen. Es gibt zwei Möglichkeiten: Ein Kanal pro Trader: Jeder Trader hat einen benannten Kanal für die modifizierten Marktdaten. Auf diese Weise bleiben die ursprünglichen Marktdaten intakt und jede Händleranwendung kann ihre spezifischen Trader anhören. Message Channel für die geänderten Preisaktualisierungen. Ein Kanal pro Trader pro Bond: Erstellen Sie eine Message Channel per-Trader per-bond nur für die modifizierten Marktdaten dieser Anleihe. Zum Beispiel würden die Marktdaten für Bond-ABC auf Channel Bond ABC veröffentlicht, während die modifizierten Marktdaten für Trader A auf Message Channel Trader A, Bond ABC, modifizierte Marktdaten für Trader B auf Trader B, Bond ABC und bald. Ein Kanal pro Trader Ein Kanal pro Bond pro Trader Es gibt Vor - und Nachteile für jeden Ansatz. Der per-bond-Ansatz nutzt zum Beispiel viel mehr Message Channel. Im Worst-Case-Szenario wird die Anzahl der Message Channel die Anzahl der Anleihen insgesamt multipliziert mit der Anzahl der Trader. Wir können Obergrenzen auf die Anzahl der Kanäle setzen, die erstellt werden, da wir wissen, dass es nur etwa 20 Händler gibt und sie nie mehr als ein paar hundert Anleihen bezahlen. Dies stellt die obere Grenze unter die 10.000-Strecke, die nicht so außergewöhnlich ist, verglichen mit dem fast 100.000 Message Channel der Marktdaten-Preis-Feed verwendet wird. Auch da wir mit dem TIB und Message Channel sind ziemlich billig, die Anzahl der Message Channel s ist kein schweres Problem. Auf der anderen Seite könnte die schiere Anzahl von Message Channel s aus einer Managementperspektive ein Problem sein. Jedes Mal, wenn eine Bindung hinzugefügt wird, muss ein Kanal für jeden Händler gepflegt werden. Dies könnte in einem sehr dynamischen System schwerwiegend sein. Unser System ist jedoch im Wesentlichen statisch. Es hat auch eine Infrastruktur für die automatische Verwaltung von Message Channel s. Dies kombiniert mit der ererbten Architektur einer Legacy-Komponente mit einem ähnlichen Ansatz minimiert den Nachteil. Dies ist nicht zu sagen, wir sollten eine unnötig übermäßige Anzahl von Message Channel s machen. Vielmehr können wir einen architektonischen Ansatz implementieren, der eine große Anzahl von Message Channel s verwendet, wenn es einen Grund gibt. Und es gibt einen Grund in diesem Fall, der auf den Ort der Logik kommt. Wenn wir den pro Trader-Ansatz implementieren, benötigt die Analytics Engine Logik, um Eingangs - und Ausgangskanäle zu gruppieren. Dies liegt daran, dass die Eingangskanäle der Analytics Engine pro Bond liegen und der Output Message Channel s pro Trader sein würde, so dass die Analytics Engine alle Analytics-Eingaben von Mehrfachanleihen für einen bestimmten Trader an einen traderspezifischen Output Message Channel weiterleiten muss. Damit wird die Analytics-Engine effektiv in einen Content-Based Router umgewandelt, um eine benutzerdefinierte Routing-Logik für unsere Anwendung zu implementieren. Nach der Message Bus-Struktur ist die Analytics Engine ein generischer Server, der von mehreren anderen Systemen in der. Also wollen wir es nicht mit systemspezifischer Funktionalität bewältigen. Auf der anderen Seite arbeitet der per-bond-Ansatz, da die Idee eines Händlers, der die analytische Ausgabe von Anleihepreisen besitzt, eine von der Gesellschaft akzeptierte Praxis ist. Der per-bond-Ansatz hält die Message Channel-Trennung des Marktdaten-Feeds intakt und fügt noch mehrere Message Channel s hinzu. Bevor wir den Kunden erreichen, wollen wir einen Content-Based Router, um diese Kanäle zu einer überschaubaren Anzahl von Kanälen zu kombinieren. Wir wollen nicht, dass die Client-Anwendung auf dem Trader-Desktop läuft auf Tausende oder Zehntausende von Message Channel s zu hören. Nun wird die Frage, wo der Content-Based Router gesetzt werden soll. Wir könnten einfach den CTIB Channel Adapter alle Nachrichten an das Pricing Gateway auf einem einzigen Message Channel weiterleiten. Das ist aus zwei Gründen schlecht, wir würden die Geschäftslogik zwischen C und Java aufteilen, und wir würden den Vorteil des separaten Message Channel s auf der TIB-Seite verlieren, so dass wir später nicht mehr im Datenfluss filtern können. Wenn wir unsere Java-Komponenten betrachten, können wir sie entweder im Pricing Gateway platzieren oder eine Zwischenkomponente zwischen dem Pricing Gateway und dem Client erstellen. In der Theorie, wenn wir die Bond-basierte Trennung von Message Channel s bis hin zum Client beharrten, würde das Pricing Gateway die Preisinformationen mit der gleichen Kanalstruktur wie die Pricing Gateway und Analytics Engine erneut übertragen. Dies bedeutet eine Vervielfältigung aller Bond-dedizierten TIB-Kanäle in JMS. Auch wenn wir eine Zwischenkomponente zwischen dem Pricing Gateway und dem Client erstellen, muss das Pricing Gateway noch alle Kanäle in JMS duplizieren. Auf der anderen Seite ermöglicht es uns, die Logik direkt im Pricing Gateway zu implementieren, um zu vermeiden, dass wir die große Anzahl von Kanälen in JMS verweigern, um uns eine viel kleinere Anzahl von Kanälen in der Reihenfolge von einem pro Händler zu erstellen. Der Pricing Gateway registriert sich über den CTIB Channel Adapter als Verbraucher für jede Bindung jedes Traders im System. Dann wird das Pricing Gateway jedem einzelnen Client nur die Nachrichten zu diesem bestimmten Händler weiterleiten. Auf diese Weise verwenden wir nur eine kleine Anzahl von Message Channels am JMS-Ende und maximieren den Nutzen der Trennung am TIB-Ende. Der komplette Marktdatenfluss zum Client Die Message Channel Layout Diskussion ist ein gutes Beispiel dafür, wie Integrationsmuster wichtig sind. Das Ziel hier war, um herauszufinden, wie man effektiv die Message Channel s verwenden. Saying Sie verwenden ein Muster ist nicht genug. Sie müssen herausfinden, wie Sie es am besten umsetzen und in Ihr System integrieren, um die Probleme zu lösen. Darüber hinaus zeigt dieses Beispiel Geschäftskräfte in Aktion. Wenn wir die Geschäftslogik in einer unserer Komponenten implementieren könnten, könnten wir mit dem pro Trader-Ansatz gegangen sein und einen insgesamt einfacheren Ansatz mit vielen weniger Kanälen implementiert haben. Auswählen eines Nachrichtenkanals Nun, da wir die Mechanismen der Kommunikation zwischen den JavaJMS-Komponenten und den C-TIBCO-Komponenten kennen und wir einige Message Channel-Strukturierungen gesehen haben, müssen wir entscheiden, welche Art von JMS Message Channel s die Java-Komponenten verwenden sollten, um zu kommunizieren . Bevor wir zwischen den verschiedenen Meldungskanälen, die in JMS verfügbar sind, wählen können, schauen wir uns den High-Level-Nachrichtenfluss des Systems an. Wir haben zwei Gateways (Pricing and Contribution), die mit dem Kunden kommunizieren. Die Marktdaten fließen dem Kunden aus dem Pricing Gateway zu, der es an das Contribution Gateway sendet. Die Client-Anwendung sendet eine Nachricht an das Pricing Gateway, um die Analysen zu ändern, die auf jede Bindung angewendet werden. Der Contribution Gateway sendet auch Nachrichten an die Client-Anwendung, die den Status der Preisaktualisierungen an die verschiedenen Handelsplätze weiterleitet. Der Systemnachrichtenfluss Die JMS-Spezifikation beschreibt zwei Message-Channel-Typen, Point-to-Point-Kanal (JMS-Warteschlange) und Publish-Subscribe Channel (JMS Topic). Erinnern Sie sich, dass der Fall für die Verwendung von publish-subscribe ist, dass alle interessierten Verbraucher eine Nachricht erhalten, während der Fall für die Verwendung von Punkt-zu-Punkt ist, um sicherzustellen, dass nur ein berechtigter Verbraucher erhält eine bestimmte Nachricht. Viele Systeme würden einfach Nachrichten an alle Client-Anwendungen senden, so dass jede einzelne Client-Anwendung für sich selbst entscheiden, ob eine bestimmte Nachricht verarbeitet werden soll oder nicht. Dies wird nicht für unsere Anwendung funktionieren, da es eine große Anzahl von Marktdatennachrichten gibt, die an jede Clientanwendung gesendet werden. Wenn wir Marktdaten-Updates an uninteressierte Händler weitergeben, werden wir unnötigerweise Client-Prozessor-Zyklen verschwenden, die entscheiden, ob ein Marktdaten-Update verarbeitet werden soll oder nicht. Point-to-Point-Kanal stet zunächst wie eine gute Wahl, da die Clients Nachrichten an eindeutige Server senden und umgekehrt. Aber es war eine geschäftliche Anforderung, dass Händler gleichzeitig bei mehreren Maschinen angemeldet werden können. Wenn wir einen Händler an zwei Workstations gleichzeitig angemeldet und eine Punkt-zu-Punkt-Preisaktualisierung gesendet wird, wird nur eine der beiden Client-Applikationen die Nachricht erhalten. Dies liegt daran, dass nur ein Verbraucher auf einem Point-to-Point-Kanal eine bestimmte Nachricht erhalten kann. Beachten Sie, dass nur die erste von jeder Gruppe von Trader-Client-Anwendungen die Nachricht erhält. Point-to-Point-Messaging für Preisaktualisierungen Wir könnten dies mit dem Empfängerlistenmuster lösen, das Nachrichten in eine Liste der beabsichtigten Empfänger veröffentlicht und garantiert, dass nur Clients in der Empfängerliste Nachrichten empfangen. Mit diesem Muster kann das System Empfängerlisten mit allen Client-Anwendungsinstanzen erstellen, die sich auf jeden Händler beziehen. Das Senden einer Nachricht, die sich auf einen bestimmten Händler bezieht, würde die Nachricht an jede Anwendung in der Empfängerliste senden. Dies garantiert, dass alle Client-Anwendungsinstanzen, die sich auf einen bestimmten Händler beziehen, die Nachricht erhalten würden. Der Nachteil dieses Ansatzes ist, dass es eine ganze Reihe von Implementierungslogik erfordert, um die Empfänger zu verwalten und Nachrichten zu versenden. Empfängerliste für Preisaktualisierungen Auch wenn Punkt-zu-Punkt zur Arbeit gemacht werden könnte, sehen wir, ob es einen besseren Weg gibt. Mit dem Publish-Subscribe Channel s kann das System Nachrichten auf traderspezifischen Kanälen anstelle von Client-Applikationsspezifischen Kanälen senden. Auf diese Weise würden alle Clientanwendungen, die Nachrichten für einen einzelnen Händler verarbeiten, die Nachricht empfangen und verarbeiten. Veröffentlichen-Abonnieren von Messaging für Preisaktualisierungen Der Nachteil der Verwendung von Publish-Subscribe Channel s ist, dass eine eindeutige Nachrichtenverarbeitung mit den Serverkomponenten nicht gewährleistet ist. Es wäre möglich, dass mehrere Instanzen einer Serverkomponente instanziiert werden und jede Instanz die gleiche Nachricht verarbeitet und eventuell ungültige Preise aussendet. Beim Abrufen des Systemnachrichtenflusses ist nur eine einzige Kommunikationsrichtung mit jedem Nachrichtenkanal zufriedenstellend. Server-to-Client-Kommunikation mit publish-subscribe ist zufriedenstellend, während Client-to-Server-Kommunikation nicht und Client-Server-Kommunikation mit Punkt-zu-Punkt ist zufriedenstellend, während Server-Client nicht ist. Da es nicht nötig ist, denselben Message Channel in beide Richtungen zu verwenden, können wir jedem Message Channel nur eine Richtung verwenden. Client-to-Server-Kommunikation wird mit Punkt-zu-Punkt implementiert, während die Server-zu-Client-Kommunikation mit publish-subscribe implementiert wird. Mit dieser Kombination von Message Channel s profitiert das System von der direkten Kommunikation mit den Serverkomponenten über Punkt-zu-Punkt-Messaging und die Multicast-Art von publish-abonnieren ohne einen der Nachteile. Nachrichtenfluss mit Kanaltypen Problem Lösung mit Patterns Patterns sind Werkzeuge und Sammlungen von Patterns sind Toolboxes. Sie helfen, Probleme zu lösen. Manche denken, dass Muster nur während des Designs nützlich sind. Nach der Toolbox-Analogie, ist dies wie sagen, dass Werkzeuge sind nur nützlich, wenn Sie ein Haus bauen, nicht, wenn Sie es beheben. Die Tatsache ist, dass Muster ein nützliches Werkzeug während eines Projektes sind, wenn es gut angewendet wird. In den folgenden Abschnitten werden wir den gleichen Mustererforschungsprozess verwenden, den wir im vorigen Abschnitt verwendet haben, um Probleme in unserem jetzt arbeitenden System zu lösen. Blinkende Marktdatenaktualisierungen Händler wollen, dass Tabellenzellen blinken, wenn neue Marktdaten für eine Anleihe empfangen werden, was eindeutig Änderungen anzeigt. Der Java-Client empfängt Nachrichten mit neuen Daten, die eine Client-Daten-Cache-Aktualisierung auslösen und schließlich in der Tabelle blinken. Das Problem ist, dass Updates ziemlich häufig kommen. Der GUI-Thread-Stack wird überladen und schließlich das Einfrieren des Clients, da er nicht auf Benutzerinteraktion reagieren kann. Wir gehen davon aus, dass das Blinken optimiert ist und sich auf den Datenfluss von Nachrichten durch den Aktualisierungsprozess konzentriert. Eine Prüfung der Leistungsdaten zeigt, dass die Client-Anwendung mehrere Updates eine Sekunde empfängt, einige Updates weniger als eine Millisekunde auseinander liegen. Zwei Muster, die scheinen, wie sie helfen könnten, verlangsamen den Nachrichtenfluss sind Aggregator und Message Filter. Ein erster Gedanke besteht darin, einen Nachrichtenfilter zu implementieren, um die Geschwindigkeit des Nachrichtenflusses zu steuern, indem er die Aktualisierungen, die nach der Referenznachricht eine kleine Zeitspanne erhalten haben, auslöst. Als Beispiel können wir sagen, dass wir Nachrichten innerhalb von 5 Millisekunden voneinander ignorieren werden. Der Nachrichtenfilter könnte die Zeit der letzten akzeptablen Nachricht zwischenspeichern und in den nächsten 5 Millisekunden etwas empfangen. Während andere Anwendungen in der Lage sind, Datenverlust in einem solchen Ausmaß zu widerstehen, ist dies in unserem System aufgrund der Häufigkeit der Preisaktualisierungen vollkommen akzeptabel. Zeitbasiertes Nachrichtenfilter Das Problem mit diesem Ansatz ist, dass nicht alle Datenfelder gleichzeitig aktualisiert werden. Jede Bindung hat ungefähr 50 Datenfelder, die dem Benutzer einschließlich Preis angezeigt werden. Wir erkennen, dass nicht jedes Feld in jeder Nachricht aktualisiert wird. Wenn das System aufeinanderfolgende Nachrichten ignoriert, kann es sehr gut sein, wichtige Daten zu werfen. Das andere interessante Muster ist der Aggregator. Der Aggregator wird verwendet, um die Abstimmung von mehreren, verwandten Nachrichten in einer einzigen Nachricht zu verwalten, wodurch der Nachrichtenfluss reduziert wird. Der Aggregator konnte eine Kopie der Bond-Daten aus der ersten aggregierten Nachricht behalten und dann nur neue oder geänderte Felder aufeinanderfolgende Nachrichten aktualisieren. Schließlich werden die aggregierten Bond-Daten in einer Nachricht an den Client übergeben. Für jetzt können wir annehmen, dass der Aggregator eine Nachricht alle 5 Millisekunden wie den Message Filter sendet. Später erforsche eine andere Alternative. Aggregator mit teilweise aufeinanderfolgenden Updates Der Aggregator. Wie jedes andere Muster, ist nicht eine silberne Kugel es hat seine Pluspunkte und Minus, die erforscht werden müssen. Ein potentielles Minus ist, dass die Implementierung eines Aggregators den Nachrichtenverkehr um einen großen Betrag in unserem Fall nur reduzieren würde, wenn viele Nachrichten innerhalb einer relativ kurzen Zeit in Bezug auf die gleiche Bindung kommen. Auf der anderen Seite würden wir nichts erreichen, wenn der Java-Client nur Updates für ein Feld über alle Trader-Anleihen erhält. For example, if we receive 1000 messages in a specified timeframe with 4 bonds of interest, we would reduce the message flow from 1000 to 4 messages over that timeframe. Alternatively, if we receive 1000 messages in the same timeframe with 750 bonds of interest, we will have reduced the message flow from 1000 to 750 messages relatively little gain for the amount of effort. A quick analysis of the message updates proves that the Java client receives many messages updating fields of the same bond, and therefore related messages. So, Aggregator is in fact a good decision. Whats left is to determine how the Aggregator will know when to send a message it has been aggregating. The pattern describes a few algorithms for the Aggregator to know when to send the message. These include algorithms to cause the aggregator to send out its contents after a certain amount of time has elapsed, after all required fields in a data set have been completed, and others. The problem with all of these approaches is that the aggregator is controlling the message flow, not the client. And the client is the major bottleneck in this case, not the message flow. This is because the Aggregator is assuming the consumers of its purged messages (the client application in this case) are Event-Driven Consumer s, or consumers that rely on events from an external source. We need to turn the client into a Polling Consumer . or a consumer that continuously checks for messages, so the client application can control the message flow. We can do this by creating a background thread that continuously cycles through the set of bonds and updates and flashes any changes that have occurred since the last iteration. This way, the client controls when messages are received and as a result, guarantees that it will never become overloaded with messages during high update periods. We can easily implement this by sending a Command Message to the Aggregator initiating an update. The Aggregator will respond with a Document Message containing the set of updated fields that the client will process. The choice of Aggregator over Message Filter is clearly a decision based solely on the business requirements of our system. Each could help us solve our performance problems, but using the Message Filter would solve the problem at cost of the system data integrity. Major Production Crash With the performance of the flashing fixed, we are now in production. One day the entire system goes down. MQSeries crashes, bringing several components down with it. We struggle with the problem for a while and finally trace it back to the MQSeries dead letter queue (an implementation of the Dead Letter Channel ). The queue grows so large that it brings down the entire server. After exploring the messages in the dead letter queue we find they are all expired market data messages. This is caused by slow consumers, or consumers that do not process messages fast enough. While messages are waiting to be processed, they time out (see the Message Expiration pattern) and are sent to the Dead Letter Channel . The excessive number of expired market data messages in the dead letter queue is a clear indication that the message flow is too great messages expire before the target application can consume them. We need to fix the message flow and we turn to patterns for help slowing down the message flow. A reasonable first step is to explore solving this problem with the Aggregator as we recently used this pattern to solve the similar flashing market data control rate problem. The system design relies on the client application to immediately forward market data update messages to the trading venues. This means the system cannot wait to collect messages and aggregate them. So the Aggregator must be abandoned. There are two other patterns that deal with the problem of consuming messages concurrently: Competing Consumers and Message Dispatcher . Starting with Competing Consumers . the benefit of this pattern is the parallel processing of incoming messages. This is accomplished using several consumers on the same channel. Only one consumer processes each incoming message leaving the others to process successive messages. Competing Consumers . however, will not work for us since we are using Publish-Subscribe Channel s in server-to-client communication. Competing Consumers on a Publish-Subscribe Channel channel means that all consumers process the same incoming message. This results in more work without any gain and completely misses the goal of the pattern. This approach also has to be abandoned. On the other hand, the Message Dispatcher describes an approach whereby you add several consumers to a pool. Each consumer can run its own execution thread. One main Message Consumer listens to the Channel and delegates the message on to an unoccupied Message Consumer in the pool and immediately returns to listening on the Message Channel . This achieves the parallel processing benefit of Competing Consumers . but works on Publish-Subscribe Channel s. The Message Dispatcher in context Implementing this in our system is simple. We create a single JMSListener called the Dispatcher, which contains a collection of other JMSListener s called Performers. When the onMessage method of the Dispatcher is called, it in turn picks a Performer out of the collection to actually process the message. The result of which is a Message Listener (the Dispatcher) that always returns immediately. This guarantees a steady flow of message processing regardless of the message flow rate. Additionally, this works equally well on a Publish-Subscribe Channel s as it does on a Point-to-Point Channel s. With this infrastructure, messages can be received by the client application at almost any rate. If the client application is still slow to process the message after receiving them, the client application can deal with the delayed processing and potentially outdated market data rather than the messages expiring in the JMS Message Channel . The crash discussed in this section and the fix using the Message Dispatcher is an excellent example of the limits of applying patterns. We encountered a performance problem based on a design flaw not allowing the client to process messages in parallel. This greatly improved the problem, but did not completely fix it. This is because the real problem was the client becoming a bottleneck. This couldnt be fixed with a thousand patterns. We later addressed this problem by refactoring the message flow architecture to route messages directly from the Pricing Gateway to the Contribution Gateway. So patterns can help design and maintain a system, but dont necessarily make up for poor upfront design. Throughout this chapter, we have applied patterns to several different aspects of a bond trading system including solving initial upfront design problems and fixing a nearly job threatening production crash with patterns. We also saw these patterns as they already exist in third party product, legacy components, and our JMS and TIBCO messaging systems. Most importantly, these are real problems with the same types of architectural, technical and business problems we experience as we design and maintain our own systems. Hopefully reading about applying patterns to this system helps give you a better understanding of the patterns as well as how to apply them to your own systems. Want to keep up-to-date Follow My Blog . Want to read more in depth Check out My Articles . Want to see me live See where I am speaking next . Find the full description of this pattern in: Enterprise Integration Patterns Gregor Hohpe and Bobby Woolf ISBN 0321200683 650 pages Addison-Wesley From Enterprise Integration to Enterprise Transformation: My new book describes how architects can play a critical role in IT transformation by applying their technical, communication, and organizational skills with 37 episodes from large-scale enterprise IT. Parts of this page are made available under the Creative Commons Attribution license. You can reuse the pattern icon, the pattern name, the problem and solution statements (in bold), and the sketch under this license. Other portions of the text, such as text chapters or the full pattern text, are protected by copyright. Messaging Patterns 187 Integration Patterns in Practice 187 Case Study: Bond Trading SystemTrading Systems: Designing Your System - Part 1 13 The preceding section of this tutorial looked at the elements that make up a trading system and discussed the advantages and disadvantages of using such a system in a live trading environment. In diesem Abschnitt bauen wir auf diesem Wissen auf, indem wir untersuchen, welche Märkte sich besonders gut für den Systemhandel eignen. Wir werden dann die verschiedenen Gattungen der Handelssysteme genauer betrachten. Handel in verschiedenen Märkten Aktienmärkte Der Aktienmarkt ist wahrscheinlich der häufigste Markt für den Handel, vor allem bei Anfängern. In dieser Arena dominieren große Spieler wie Warren Buffett und Merrill Lynch, und traditionelle Wert - und Wachstumsinvestitionsstrategien sind bei weitem am häufigsten. Dennoch haben viele Institutionen erheblich in die Planung, Entwicklung und Umsetzung von Handelssystemen investiert. Einzelne Investoren treten diesem Trend bei, aber langsam. Hier sind einige Schlüsselfaktoren, die bei der Verwendung von Handelssystemen an den Aktienmärkten zu beachten sind: 13 Die große Menge an verfügbaren Aktien ermöglicht es Händlern, Systeme auf vielen verschiedenen Arten von Aktien zu testen - alles von extrem volatilen OTC-Aktien bis hin zu Nicht-flüchtige blaue Chips. Die Effektivität der Handelssysteme kann durch die geringe Liquidität einiger Aktien, insbesondere OTC - und Pink-Sheet-Themen, begrenzt werden. Provisionen können in Gewinne von erfolgreichen Geschäften gelangen und können Verluste erhöhen. OTC - und Pink-Sheet-Aktien entstehen oft zusätzliche Provisionsgebühren. Die wichtigsten Handelssysteme, die verwendet werden, sind diejenigen, die nach Wert suchen - das heißt, Systeme, die unterschiedliche Parameter verwenden, um festzustellen, ob eine Sicherheit im Vergleich zu ihrer bisherigen Leistung, ihren Kollegen oder dem Markt im Allgemeinen unterbewertet ist. Devisenmärkte Der Devisenmarkt oder Forex. Ist der größte und liquideste Markt der Welt. Die Welten Regierungen, Banken und anderen großen Institutionen Handel Trillionen von Dollar auf dem Forex-Markt jeden Tag. Die Mehrheit der institutionellen Händler auf dem Forex setzt auf Handelssysteme. Das gleiche gilt für Einzelpersonen auf dem Forex, aber einige Geschäfte auf der Grundlage von Wirtschaftsberichten oder Zinsauszahlungen. Hier sind einige Schlüsselfaktoren zu beachten bei der Verwendung von Handelssystemen auf dem Forex-Markt: Die Liquidität in diesem Markt - aufgrund der riesigen Volumen - Macht Handelssysteme genauer und effektiver. Es gibt keine Provisionen in diesem Markt, nur breitet sich aus. Daher ist es viel einfacher, viele Transaktionen ohne Erhöhung der Kosten zu machen. Im Vergleich zur Menge der verfügbaren Aktien oder Rohstoffe ist die Anzahl der zu handelnden Währungen begrenzt. Aber wegen der Verfügbarkeit von exotischen Währungspaaren - also Währungen aus kleineren Ländern - ist das Spektrum der Volatilität nicht zwangsläufig begrenzt. Die wichtigsten Handelssysteme, die in Forex verwendet werden, sind diejenigen, die Trends folgen (ein populäres Sprichwort auf dem Markt ist der Trend ist Ihr Freund) oder Systeme, die kaufen oder verkaufen auf Ausbrüche. Dies ist, weil ökonomische Indikatoren oft große Preisbewegungen auf einmal verursachen. Futures Equity, Forex und Rohstoffmärkte bieten alle Futures-Trading. Dies ist ein beliebtes Fahrzeug für den Systemhandel wegen der höheren Menge an Leverage verfügbar und die erhöhte Liquidität und Volatilität. Allerdings können diese Faktoren auf beide Weisen schneiden: Sie können entweder Ihre Gewinne verstärken oder Ihre Verluste verstärken. Aus diesem Grund ist die Verwendung von Futures in der Regel für fortgeschrittene Einzel - und institutionelle Systemhändler vorbehalten. Dies ist, weil Handelssysteme, die in der Lage sind, auf dem Futures-Markt zu profitieren, viel größere Anpassungen erfordern, fortgeschrittene Indikatoren verwenden und viel länger dauern, um zu entwickeln. Also, was ist das Beste Sein bis zu dem einzelnen Investor zu entscheiden, welcher Markt am besten für den Systemhandel geeignet ist - jeder hat seine eigenen Vor-und Nachteile. Die meisten Menschen sind mit den Aktienmärkten vertraut, und diese Vertrautheit macht die Entwicklung eines Handelssystems einfacher. Allerdings ist Forex üblicherweise die überlegene Plattform, um Handelssysteme laufen - vor allem bei erfahrenen Händlern. Darüber hinaus, wenn ein Händler beschließt, auf erhöhte Hebelwirkung und Volatilität zu profitieren, ist die Futures-Alternative immer offen. Letztlich liegt die Wahl in den Händen des Systementwicklers. Typen von Trading-Systemen Trendfolgesysteme Die gängigste Methode des Systemhandels ist das Trend-Nachfolgesystem. In seiner fundamentalsten Form wartet dieses System einfach auf eine signifikante Preisbewegung, dann kauft oder verkauft er in dieser Richtung. Diese Art von Systembanken auf die Hoffnung, dass diese Preisbewegungen den Trend beibehalten werden. Moving Average Systems Häufig in der technischen Analyse verwendet. Ein gleitender Durchschnitt ist ein Indikator, der einfach den durchschnittlichen Preis einer Aktie über einen Zeitraum zeigt. Das Wesentliche der Trends ergibt sich aus dieser Messung. Die häufigste Art der Einreise und Ausreise ist ein Crossover. Die Logik dahinter ist einfach: ein neuer Trend wird festgestellt, wenn der Preis über oder unter dem historischen Preisdurchschnitt liegt (Trend). Hier ist ein Diagramm, das sowohl den Preis (blaue Linie) als auch die 20-Tage-MA (rote Linie) von IBM aufzeichnet: Breakout-Systeme Das grundlegende Konzept hinter dieser Art von System ist ähnlich wie bei einem gleitenden Durchschnittssystem. Die Idee ist, dass, wenn ein neues hoch oder niedrig ist, die Preisbewegung am ehesten in Richtung des Ausbruchs fortsetzen wird. Ein Indikator, der bei der Ermittlung von Ausbrüchen verwendet werden kann, ist ein einfaches Bollinger Band Overlay. Bollinger Bands zeigen Mittelwerte von hohen und niedrigen Preisen, und Ausbrüche treten auf, wenn der Preis den Kanten der Bands entspricht. Hier ist ein Diagramm, das den Preis (blaue Linie) und die Bollinger Bands (graue Linien) von Microsoft verzeichnet: Nachteile von Trendfolgesystemen: Empirische Entscheidungsfindung erforderlich - Bei der Bestimmung von Trends gibt es immer ein empirisches Element zu berücksichtigen: die Dauer von Der historische Trend Zum Beispiel könnte der gleitende Durchschnitt für die letzten 20 Tage oder für die letzten fünf Jahre sein, so dass der Entwickler bestimmen muss, welche am besten für das System ist. Weitere Faktoren sind die durchschnittlichen Höhen und Tiefen in Breakout-Systemen. Lagging Nature - Moving Averages und Breakout-Systeme werden immer zurückbleiben. Mit anderen Worten, sie können niemals die genaue Top - oder Unterseite eines Trends treffen. Dies führt zwangsläufig zu einem Verfall von potenziellen Gewinnen, was manchmal erheblich sein kann. Whipsaw-Effekt - Unter den Marktkräften, die für den Erfolg von Trendfolgesystemen schädlich sind, gehört dies zu den häufigsten. Der Whipsaw-Effekt tritt auf, wenn der gleitende Durchschnitt ein falsches Signal erzeugt - das heißt, wenn der Durchschnitt nur in Reichweite fällt, dann kehrt er plötzlich die Richtung um. Dies kann zu massiven Verlusten führen, solange keine effektiven Stop-Verluste und Risikomanagement-Techniken angewendet werden. Seitwärtsmärkte - Trendfolgesysteme sind von Natur aus in der Lage, nur in Märkten Geld zu verdienen, die tatsächlich Trend machen. Die Märkte bewegen sich aber auch seitwärts. In einem bestimmten Bereich für einen längeren Zeitraum bleiben. Extreme Volatilität kann auftreten - Gelegentlich können Trendfolgesysteme eine extreme Volatilität erleben, aber der Trader muss mit seinem System zusammenhängen. Die Unfähigkeit, dies zu tun, führt zu einem versicherten Versagen. Countertrend Systems Grundsätzlich ist das Ziel mit dem Gegensprechsystem, auf dem niedrigsten Tief zu kaufen und am höchsten zu verkaufen. Der Hauptunterschied zwischen diesem und dem Trendfolgesystem besteht darin, dass das Gegensprechsystem nicht selbstkorrigiert ist. Mit anderen Worten, es gibt keine festgelegte Zeit, um Positionen zu verlassen, und dies führt zu einem unbegrenzten Abwärtspotenzial. Arten von Gegensprechsystemen Viele verschiedene Arten von Systemen gelten als Gegensprechsysteme. Die Idee hier ist zu kaufen, wenn Schwung in einer Richtung beginnt zu verblassen. Dies wird am häufigsten mit Oszillatoren berechnet. Zum Beispiel kann ein Signal erzeugt werden, wenn Stochastik oder andere relative Stärkeindikatoren unter bestimmte Punkte fallen. Es gibt andere Arten von Gegentrend Handelssysteme, aber alle von ihnen teilen das gleiche grundlegende Ziel - zu kaufen niedrig und verkaufen hoch. Nachteile von Gegenströmen Folgesysteme: E mpirische Entscheidungsfindung erforderlich - Zum Beispiel ist einer der Faktoren, die der Systementwickler entscheiden muss, die Punkte, an denen die relativen Stärkeindikatoren verblassen. Extreme Volatilität kann auftreten - Diese Systeme können auch einige extreme Volatilität erleben und eine Unfähigkeit, mit dem System zu bleiben, trotz dieser Volatilität wird zu einem versicherten Ausfall führen. Unbegrenzter Nachteil - Wie bereits erwähnt, gibt es unbegrenztes Abwärtspotenzial, da das System nicht selbstkorrigierend ist (es gibt keine festgelegte Zeit, um Positionen zu verlassen). Schlussfolgerung Die Hauptmärkte, für die Handelssysteme geeignet sind, sind die Aktien-, Devisen - und Futures-Märkte. Jeder dieser Märkte hat seine Vor - und Nachteile. Die beiden Hauptgenres der Handelssysteme sind die Trendfolgen und die Gegensprechsysteme. Trotz ihrer Unterschiede erfordern beide Arten von Systemen in ihren Entwicklungsstadien eine empirische Entscheidungsfindung seitens des Entwicklers. Auch diese Systeme unterliegen extremen Volatilität und dies kann eine gewisse Ausdauer erfordern - es ist wichtig, dass der Systemhändler mit seinem System während dieser Zeiten haftet. In der folgenden Rate, nehmen Sie einen genaueren Blick auf, wie man ein Handelssystem entwerfen und diskutieren einige der Software, die System-Händler verwenden, um ihr Leben leichter machen. Trading Systems: Gestaltung Ihres Systems - Teil 2

No comments:

Post a Comment