La section précédente de ce tutoriel a examiné les éléments qui composent un système de négociation et discuté des avantages et des inconvénients de l'utilisation d'un tel système dans un environnement commercial en direct. Dans cette section, nous nous appuyons sur ces connaissances en examinant quels marchés sont particulièrement bien adaptés au système de négociation. Nous allons ensuite examiner plus en profondeur les différents genres de systèmes de négociation. Le marché boursier est probablement le marché le plus commun au commerce, en particulier chez les novices. Dans ce domaine, les grands acteurs tels que Warren Buffett et Merrill Lynch dominent, et la valeur traditionnelle et la croissance des stratégies d'investissement sont de loin les plus courantes. Néanmoins, de nombreuses institutions ont investi considérablement dans la conception, le développement et la mise en œuvre de systèmes de négociation. Les investisseurs individuels se joignent à cette tendance, bien que lentement. Voici quelques-uns des facteurs clés à garder à l'esprit lors de l'utilisation des systèmes de négociation sur les marchés boursiers: 13 La grande quantité d'actions disponibles permet aux commerçants de tester des systèmes sur de nombreux types d'actions - Non volatile blue chips. L'efficacité des systèmes de négociation peut être limitée par la faible liquidité de certaines actions, en particulier les émissions de gré à gré et de feuilles roses. Les commissions peuvent manger dans les profits générés par des métiers réussis, et peuvent augmenter les pertes. Les actions de gré à gré et de gré à gré sont souvent assujetties à des frais de commission supplémentaires. Les principaux systèmes de négociation utilisés sont ceux qui cherchent de la valeur - c'est-à-dire des systèmes qui utilisent des paramètres différents pour déterminer si une valeur est sous-évaluée par rapport à ses performances passées, ses pairs ou le marché en général. Marchés des changes Le marché des changes, ou des devises. Est le marché le plus grand et le plus liquide au monde. Les gouvernements mondiaux, les banques et d'autres grandes institutions commercent trillions de dollars sur le marché forex tous les jours. La majorité des traders institutionnels sur le forex s'appuient sur les systèmes de négociation. La même chose vaut pour les individus sur le forex, mais un certain commerce basé sur des rapports économiques ou intérêts payouts. Here sont quelques facteurs clés à garder à l'esprit lors de l'utilisation des systèmes de négociation sur le marché des changes: La liquidité dans ce marché - Rend les systèmes de négociation plus précis et plus efficaces. Il n'y a pas de commissions sur ce marché, seulement des spreads. Par conséquent, il est beaucoup plus facile de faire de nombreuses transactions sans augmenter les coûts. Par rapport au montant des actions ou des matières premières disponibles, le nombre de devises à échanger est limité. Mais en raison de la disponibilité de paires de devises exotiques, c'est-à-dire de devises de pays plus petits, la fourchette en termes de volatilité n'est pas nécessairement limitée. Les principaux systèmes de trading utilisés dans le forex sont ceux qui suivent les tendances (un dicton populaire sur le marché est la tendance est votre ami), ou des systèmes qui achètent ou vendent sur les évasions. En effet, les indicateurs économiques entraînent souvent de grands mouvements de prix à la fois. Futures Equity, forex et marchés de matières premières offrent tous des contrats à terme. Il s'agit d'un véhicule populaire pour le système de négociation en raison de la plus grande quantité de levier disponible et l'augmentation de la liquidité et la volatilité. Cependant, ces facteurs peuvent couper les deux façons: ils peuvent amplifier vos gains ou amplifier vos pertes. Pour cette raison, l'utilisation des contrats à terme est habituellement réservée aux commerçants avancés des systèmes individuels et institutionnels. C'est parce que les systèmes commerciaux capables de capitaliser sur le marché à terme nécessitent une personnalisation beaucoup plus grande, utiliser des indicateurs plus avancés et prendre beaucoup plus de temps à développer. Donc, ce qui est le mieux C'est à l'investisseur individuel de décider quel marché est le mieux adapté au système de négociation - chacun a ses propres avantages et inconvénients. La plupart des gens sont plus familiarisés avec les marchés boursiers, et cette familiarité rend le développement d'un système commercial plus facile. Cependant, le forex est généralement considéré comme la plate-forme supérieure pour exécuter des systèmes de négociation - en particulier parmi les commerçants plus expérimentés. De plus, si un opérateur décide de capitaliser sur un effet de levier et une volatilité accrus, l'option à terme est toujours ouverte. En fin de compte, le choix réside dans les mains du développeur du système. Types de systèmes de négociation Systèmes de suivi des tendances La méthode la plus courante de système de négociation est le système de tendance-suivant. Dans sa forme la plus fondamentale, ce système attend simplement un mouvement de prix significatif, puis achète ou vend dans cette direction. Ce type de système de banques sur l'espoir que ces mouvements des prix maintiendront la tendance. Systèmes de moyenne mobile Utilisé fréquemment dans l'analyse technique. Une moyenne mobile est un indicateur qui montre simplement le prix moyen d'un stock sur une période de temps. L'essence des tendances est tirée de cette mesure. La façon la plus courante de déterminer l'entrée et la sortie est un croisement. La logique derrière cela est simple: une nouvelle tendance est établie lorsque le prix tombe au-dessus ou au-dessous de sa moyenne de prix historiques (tendance). Voici un graphique qui trame à la fois le prix (ligne bleue) et la MA de 20 jours (ligne rouge) d'IBM: Breakout Systems Le concept fondamental derrière ce type de système est similaire à celui d'un système de moyenne mobile. L'idée est que quand un nouveau haut ou bas est établi, le mouvement de prix est plus susceptible de continuer dans la direction de la rupture. Un indicateur qui peut être utilisé dans la détermination des éruptions est une simple bande Bollinger superposition. Bollinger Bands montrent des moyennes de prix élevés et bas, et les évasions se produisent lorsque le prix rencontre les bords des bandes. Voici un graphique qui trace le prix (ligne bleue) et les bandes de Bollinger (lignes grises) de Microsoft: Inconvénients des systèmes de suivi des tendances: Empirical Decision-Making Required - Lors de la détermination des tendances, il ya toujours un élément empirique à considérer: La tendance historique. Par exemple, la moyenne mobile pourrait être pour les 20 derniers jours ou pour les cinq dernières années, de sorte que le développeur doit déterminer lequel est le mieux pour le système. D'autres facteurs à déterminer sont les hauts et les bas moyens dans les systèmes d'échappement. Lagging Nature - Les moyennes mobiles et les systèmes d'évasion seront toujours en retard. En d'autres termes, ils ne peuvent jamais atteindre le haut ou le bas exact d'une tendance. Cela entraîne inévitablement une confiscation des bénéfices potentiels, qui peuvent parfois être importants. Effet Whipsaw - Parmi les forces du marché qui nuisent au succès des systèmes de suivi des tendances, c'est l'une des plus courantes. L'effet whipsaw se produit lorsque la moyenne mobile génère un faux signal, c'est-à-dire lorsque la moyenne tombe juste dans la plage, puis inverse soudainement la direction. Cela peut conduire à des pertes massives, à moins que des techniques d'arrêt-pertes efficaces et de gestion des risques ne soient utilisées. Sideways Markets - Les systèmes de suivi de tendance sont, par nature, capables de faire de l'argent uniquement sur les marchés qui font réellement tendance. Cependant, les marchés se déplacent également de côté. Restant dans une certaine plage pendant une longue période de temps. Une volatilité extrême peut se produire - Parfois, les systèmes de suivi des tendances peuvent présenter une certaine volatilité extrême, mais le trader doit rester fidèle à son système. L'incapacité de le faire entraînera un échec assuré. Systèmes de contre-tendance Fondamentalement, l'objectif avec le système de contre-tendance est d'acheter au bas plus bas et de vendre au plus haut haut. La principale différence entre ce système et le système de suivi des tendances est que le système de contre-tendance n'est pas auto-correcteur. En d'autres termes, il n'y a pas de temps défini pour sortir des positions, ce qui se traduit par un potentiel de baisse illimité. Types de systèmes de contre-tendance Beaucoup de différents types de systèmes sont considérés comme des systèmes de contre-tendance. L'idée ici est d'acheter quand l'élan dans une direction commence à s'estomper. Ceci est le plus souvent calculé à l'aide d'oscillateurs. Par exemple, un signal peut être généré lorsque des indicateurs stochastiques ou d'autres indicateurs de force relative tombent en dessous de certains points. Il existe d'autres types de systèmes de trading de contre-tendance, mais tous ont le même objectif fondamental: acheter bas et vendre haut. Inconvénients des systèmes de contre-tendance suivants: Prise de décision stratégique - Par exemple, l'un des facteurs sur lesquels le développeur du système doit décider est les points où les indicateurs de force relative s'effacent. Une volatilité extrême peut se produire - Ces systèmes peuvent également rencontrer une certaine volatilité extrême, et une incapacité à coller avec le système malgré cette volatilité se traduira par un échec assuré. Downside illimitée - Comme mentionné précédemment, il ya un potentiel de baisse illimitée parce que le système n'est pas auto-correcteur (il n'y a pas de temps défini pour sortir des positions). Conclusion Les principaux marchés pour lesquels les systèmes de négociation sont adaptés sont les marchés des actions, des changes et des contrats à terme. Chacun de ces marchés présente ses avantages et ses inconvénients. Les deux principaux genres de systèmes de négociation sont les systèmes de tendance et les systèmes de contre-tendance. Malgré leurs différences, les deux types de systèmes, à leurs stades de développement, nécessitent une prise de décision empirique de la part du développeur. En outre, ces systèmes sont soumis à une volatilité extrême et cela peut exiger une certaine endurance - il est essentiel que le commerçant de système s'en tenir à son système pendant ces temps. Dans l'article suivant, bien examiner de plus près comment concevoir un système commercial et discuter de certains des logiciels que les commerçants système utilisent pour rendre leur vie plus facile. Systèmes de négociation: Conception de votre système - Partie 2Messages de conception 187 Modèles d'intégration dans la pratique 187 Étude de cas: Système d'échange de titres (par Jonathan Simon) Il est facile de vous distancer d'une vaste collection de modèles ou d'un langage de motifs. Les motifs sont l'abstraction d'une idée sous une forme réutilisable. Souvent, la nature très générique des motifs qui les rend si utiles les rend également difficiles à saisir. Parfois, la meilleure chose pour aider à comprendre les modèles est un exemple du monde réel. Pas un scénario artificiel de ce qui pourrait arriver, mais ce qui se passe réellement et ce qui va arriver. Ce chapitre applique des modèles pour résoudre des problèmes en utilisant un processus de découverte. Le système que nous allons discuter est un système d'échange d'obligations avec lequel j'ai travaillé pendant deux ans, de la conception initiale à la production. Nous allons explorer les scénarios et les problèmes qui ont été rencontrés et comment les résoudre avec des modèles. Cela implique le processus de décision de choisir un modèle, ainsi que la façon de combiner et d'ajuster les modèles pour répondre aux besoins du système. Et tout cela en tenant compte des forces rencontrées dans les systèmes réels, y compris les exigences de l'entreprise, les décisions des clients, les exigences architecturales et techniques, ainsi que l'intégration du système hérité. L'intention de cette approche est de fournir une compréhension plus claire des modèles eux-mêmes par l'application pratique. Construire un système Une grande banque d'investissement de Wall Street se propose de construire un système de tarification des obligations afin de rationaliser le flux de travail de leur guichet de négociation d'obligations. Actuellement, les traders obligataires doivent envoyer des prix pour un grand nombre d'obligations à plusieurs sites de négociation différents, chacun avec sa propre interface utilisateur. Le but du système est de minimiser les minima de tarification de toutes leurs obligations combinées à des fonctionnalités analytiques avancées spécifiques au marché des obligations dans une seule interface utilisateur encapsulée. Cela signifie l'intégration et la communication avec plusieurs composants sur différents protocoles de communication. Le flux de haut niveau du système ressemble à ceci: Premièrement, les données du marché entrent dans le système. Les données de marché sont des données concernant le prix et les autres propriétés de l'obligation représentant ce que les gens sont prêts à acheter et à vendre l'obligation pour sur le marché libre. Les données du marché sont immédiatement envoyées au moteur d'analyse qui modifie les données. Analytique se réfère à des fonctions mathématiques pour les applications financières qui modifient les prix et autres attributs des obligations. Il s'agit de fonctions génériques qui utilisent des variables d'entrée pour adapter les résultats de la fonction à une liaison particulière. L'application cliente qui s'exécutera sur chaque ordinateur de bureau trader configurera le moteur d'analyse sur une base par commerçant, en contrôlant les spécificités de l'analyse pour chaque obligation de l'opérateur est la tarification. Une fois que les données analytiques sont appliquées aux données du marché, les données modifiées sont envoyées à différents lieux de négociation où des commerçants d'autres entreprises peuvent acheter ou vendre des obligations. Architecture avec Patterns Avec cette vue d'ensemble du workflow du système, nous pouvons aborder quelques-uns des problèmes d'architecture que nous rencontrons pendant le processus de conception. Jetons un coup d'oeil à ce que nous savons à ce jour. Les opérateurs ont besoin d'une application très réactive sur les postes de travail Windows NT et Solaris. Par conséquent, nous avons décidé de mettre en œuvre l'application client en tant que client d'épaisseur Java en raison de son indépendance de plate-forme et de sa capacité à répondre rapidement aux données d'entrée et de marché des utilisateurs. Du côté du serveur, nous héritons des composants C hérités que notre système utilisera. Les composants de données de marché communiquent avec l'infrastructure de messagerie TIBCO Information Bus (TIB). Nous héritons des composants suivants: Market Data Feed Feed Server. Publie les données du marché entrant au TIB. Analytics Engine. Effectue des analyses sur les données de marché entrantes et diffuse les données de marché modifiées vers le TIB. Serveur de contribution. Effectue toutes les communications avec les sites de négociation. Les sites de négociation sont des composants tiers non contrôlés par la banque. Sous-système Legacy Market Data Sous-système Legacy Contribution Nous devons décider de la façon dont les sous-systèmes distincts (client épais de Java, données de marché et contribution) vont communiquer. Nous pourrions avoir le client épais communiquer directement avec les serveurs hérités, mais cela nécessiterait trop de logique métier sur le client. Au lieu de cela, construisez bien une paire de passerelles Java pour communiquer avec les serveurs héritésLa passerelle de tarification pour les données de marché une passerelle de contribution pour envoyer des prix aux sites de négociation. Cela permettra d'obtenir une bonne encapsulation de la logique métier liée à ces domaines. Les composants actuels du système sont présentés ci-dessous. Les connexions marquées comme. Indiquent que nous ne savons toujours pas comment certains des composants communiqueront. Le système et ses composants La première question de communication est d'intégrer le client Java épais et les deux composants du serveur Java afin d'échanger des données. Examinons les quatre styles d'intégration suggérés dans ce livre: Transfert de fichiers. Base de données partagée. Invocation de procédure à distance. Et messagerie. Nous pouvons exclure la base de données partagée immédiatement parce que nous voulions créer une couche d'abstraction entre le client et la base de données et ne veulent pas avoir le code d'accès de base de données dans le client. Transfert de fichiers peut également être exclue car une latence minimale est nécessaire pour s'assurer que les prix actuels sont envoyés aux lieux de négociation. Cela nous laisse le choix entre l'appel de procédure distante ou la messagerie. La plate-forme Java fournit une prise en charge intégrée pour l'appel de procédure distante et la messagerie. L'intégration de style RPC peut être obtenue à l'aide de Remote Method Invocation (RMI), CORBA ou Enterprise Java Beans (EJB). Java Messaging Service (JMS) est l'API commune pour l'intégration de messagerie. Les deux styles d'intégration sont donc faciles à implémenter en Java. Donc ce qui fonctionnera mieux pour ce projet, Remote Procedure Invocation ou Messaging. Theres une seule instance de la Passerelle de prix et une instance de la passerelle de contribution dans le système, mais habituellement de nombreux clients épais se connectent simultanément à ces services (un pour chaque opérateur d'obligations qui se trouve être connecté à un moment particulier). En outre, la banque voudrait que ce soit un système de prix générique qui peut être utilisé dans d'autres applications. Donc, outre un nombre inconnu de Think Clients, il peut y avoir un nombre inconnu d'autres applications en utilisant les données de tarification qui sortent des passerelles. Un client grossier (ou une autre application utilisant les données de tarification) peut utiliser assez facilement RPC pour effectuer des appels aux passerelles pour obtenir des données de tarification et pour invoquer le traitement. Toutefois, les données sur les prix seront constamment publiées, et certains clients ne s'intéressent qu'à certaines données, ce qui pourrait compliquer l'accès aux données pertinentes aux clients appropriés. Les clients pourraient consulter les passerelles, mais cela va créer beaucoup de frais généraux. Il serait préférable pour les passerelles de mettre les données à la disposition des clients dès qu'il est disponible. Cela nécessitera cependant que chaque passerelle conserve la trace des clients actifs et qui veulent savoir quelles données alors, lorsqu'une nouvelle donnée est disponible (ce qui se produira plusieurs fois par seconde), la passerelle devra Un RPC à chaque client intéressé pour transmettre les données au client. Idéalement, tous les clients doivent être notifiés simultanément, de sorte que chaque RPC doit être faite dans son propre thread simultané. Cela peut fonctionner, mais devient très compliqué très rapidement. La messagerie simplifie grandement ce problème. Avec messagerie. Nous pouvons définir des canaux distincts pour les différents types de données de tarification. Ensuite, lorsqu'une passerelle reçoit une nouvelle donnée, elle ajoute un message contenant ces données au canal Publier-Inscription pour ce type de données. Pendant ce temps, tous les clients intéressés par un certain type de données écouteront sur le canal pour ce type. De cette façon, les passerelles peuvent facilement envoyer de nouvelles données à quiconque est intéressé, sans avoir besoin de savoir combien d'applications d'écoute il ya ou ce qu'ils sont. Les clients doivent encore être en mesure d'invoquer le comportement dans les passerelles ainsi. Puisqu'il y a seulement deux passerelles et que le client peut probablement bloquer pendant que la méthode est appelée de manière synchrone, ces invocations de client à passerelle peuvent assez facilement être implémentées en utilisant RPC. Cependant, étant donné que nous utilisons déjà la messagerie pour la communication passerelle-client, les messages sont probablement aussi bon moyen d'implémenter la communication client-passerelle. Par conséquent, toutes les communications entre les passerelles et les clients seront effectuées par messagerie. Parce que tous les composants sont écrits en Java, JMS présente un choix facile pour le système de messagerie. Cela crée effectivement un Message Bus ou une architecture qui permettra aux futurs systèmes d'intégrer avec le système actuel avec peu ou pas de changements à l'infrastructure de messagerie. De cette façon, la fonctionnalité commerciale de l'application peut être facilement utilisée par d'autres applications développées par la banque. Composants Java Communiquer avec JMS JMS est simplement une spécification et nous devons décider d'un système de messagerie compatible JMS. Nous avons décidé d'utiliser IBM MQSeries JMS parce que la banque est une boutique IBM, utilisant des serveurs d'applications WebSphere et de nombreux autres produits IBM. En conséquence, nous utiliserons MQSeries car nous avons déjà une infrastructure de support en place et une licence de site du produit. La question suivante est de savoir comment connecter le système de messagerie MQSeries au serveur C Contribution autonome et aux serveurs Market Data et Analytics Engine basés sur TIBCO. Nous avons besoin d'un moyen pour les consommateurs MQSeries d'avoir accès aux messages TIB. Mais comment pourrions-nous utiliser le modèle Message Translator pour traduire les messages TIB en messages MQSeries. Bien que le client C pour MQSeries serve de traducteur de messages. L'utilisation de ce serveur sacrifierait l'indépendance du serveur JMS. Et bien que TIBCO ait une API Java, l'architecte client et le gestionnaire l'ont rejetée. Par conséquent, l'approche de Message Translator doit être abandonnée. Le pont entre le serveur TIB et le serveur MQSeries requiert une communication entre C et Java. Nous pourrions utiliser CORBA, mais alors que dire de la messagerie Un examen plus approfondi du modèle Message Translator montre qu'il est lié à l'adaptateur de canal dans son utilisation des protocoles de communication. Le cœur d'un adaptateur de canal est de connecter des systèmes sans messagerie aux systèmes de messagerie. Une paire d'adaptateurs de canal qui connecte deux systèmes de messagerie est un Messaging Bridge. Le but de Messaging Bridge est de transférer des messages d'un système de messagerie à un autre. C'est exactement ce que nous faisons avec la complexité ajoutée de la communication intra-langage Java vers C. Nous pouvons implémenter le Messaging Bridge en utilisant une combinaison de Channel Adapter s et CORBA. Nous allons construire deux serveurs adaptateur de canal léger, l'un en C pour la gestion de la communication avec le TIB et l'autre en Java, qui gère la communication avec JMS. Ces deux adaptateurs de canal. Qui sont Message Endpoint s eux-mêmes, communiquent entre eux via CORBA. Comme notre choix pour MQSeries, nous allons utiliser CORBA plutôt que JNI puisqu'il s'agit d'une norme de l'entreprise. Le pont de messagerie implémente la traduction de messages simulée de manière efficace entre des systèmes de messagerie apparemment incompatibles et des langages différents. Traducteur de messages à l'aide d'adaptateurs de voies Le schéma suivant présente la conception actuelle du système, y compris les passerelles et les autres composants. C'est un bon exemple d'application de modèle. Nous avons combiné deux adaptateurs de canal avec un protocole non messagerie pour implémenter le modèle Message Translator, en utilisant un modèle pour implémenter un autre modèle. En outre, nous avons modifié le contexte de l'adaptateur de canal pour relier deux systèmes de messagerie à un protocole de traduction de langue croisée sans messagerie plutôt que de connecter un système de messagerie à un système sans messagerie. Le système actuel avec les adaptateurs de canal Structurer les canaux Une clé pour travailler avec des modèles n'est pas seulement savoir quand utiliser ce modèle, mais aussi comment l'utiliser plus efficacement. Chaque implémentation de modèle doit tenir compte des spécificités de la plate-forme technologique ainsi que d'autres critères de conception. Cette section applique le même processus de découverte afin de trouver l'utilisation la plus efficace de la Chaîne Publish-Subscribe dans le contexte du serveur de données de marché communiquant avec le moteur d'analyse. Les données de marché en temps réel proviennent du flux de données du marché, un serveur C qui diffuse des données de marché sur le TIB. Le flux de données de marché utilise un canal de publication-abonnement distinct pour chaque lien pour lequel il publie des prix. Cela peut sembler un peu extrême car chaque nouvelle obligation a besoin de sa propre nouvelle chaîne. Mais ce n'est pas si grave car vous n'avez pas vraiment besoin de créer des canaux dans TIBCO. Les chaînes sont plutôt référencées par un ensemble hiérarchique de noms de sujets appelés sujets. Le serveur TIBCO filtre alors un seul flux de messages par sujet, en envoyant chaque objet unique à un seul canal virtuel. Le résultat est un canal de message très léger. Nous pourrions créer un système qui publie sur quelques canaux et les abonnés pouvaient écouter uniquement pour les prix qu'ils sont intéressés po Cela nécessiterait des abonnés d'utiliser un filtre de message ou consommateur sélectif pour filtrer l'ensemble du flux de données pour les prix des obligations intéressantes, Doit être traitée au fur et à mesure qu'elle est reçue. Étant donné que les données du marché sont publiées sur des chaînes dédiées aux obligations, les abonnés peuvent s'inscrire aux mises à jour d'une série d'obligations. Cela permet effectivement aux abonnés de filtrer en s'abonnant de manière sélective aux canaux et de recevoir uniquement des mises à jour d'intérêt plutôt que de décider après la réception du message. Il est important de noter que l'utilisation de plusieurs canaux pour éviter le filtrage est une utilisation non standard des canaux de messagerie. Dans le contexte de la technologie TIBCO cependant, nous décidons vraiment d'implémenter ou de posséder des filtres ou d'utiliser le filtrage de canaux intégré à TIBCO - plutôt que d'utiliser tant de canaux. Le prochain composant que nous devons concevoir est le moteur d'analyse, un autre serveur CTIB qui va modifier les données de marché et de rediffuser à la TIB. Bien qu'il soit hors de la portée de notre développement JavaJMS, nous travaillons en étroite collaboration avec l'équipe C pour le concevoir puisque nous sommes le client principal des moteurs d'analyse. Le problème à venir est de trouver la structure de canal la plus efficace pour retransmettre les données de marché nouvellement modifiées. Puisque nous avons déjà un canal de message dédié par lien hérité de l'alimentation de prix de données de marché, il serait logique de modifier les données de marché et de retransmettre les données de marché modifiées sur le canal de message dédié aux obligations. Mais cela ne fonctionnera pas puisque les analyses modifiant les prix des obligations sont spécifiques au négociant. Si nous retransmettons les données modifiées sur le canal de message de l'obligation. Nous allons détruire l'intégrité des données en remplaçant les données génériques du marché par des données spécifiques aux opérateurs. D'autre part, nous pourrions avoir un type de message différent pour les données de marché spécifiques au trader que nous publions sur le même canal permettant aux abonnés de décider quel message ils sont intéressés à éviter de détruire l'intégrité des données. Mais alors les clients devront mettre en œuvre leurs propres filtres pour séparer les messages pour d'autres commerçants. De plus, les messages reçus par les abonnés augmenteront considérablement, ce qui leur imposera une charge inutile. Il existe deux options: Un canal par commerçant: Chaque opérateur dispose d'un canal désigné pour les données de marché modifiées. De cette façon, les données du marché d'origine reste intacte et chaque application commerçant peut écouter ses commerçants spécifiques Message Channel pour les mises à jour de prix modifiés. Un canal par négociant par obligation: Créer un canal de message par transactionur par obligation uniquement pour les données de marché modifiées de ce lien. Par exemple, les données de marché pour le lien ABC seraient publiées sur le canal Bond ABC alors que les données de marché modifiées pour le négociant A seraient publiées sur le canal de messages Trader A, Bond ABC, les données de marché modifiées pour le trader B sur le Trader B, Bond ABC et bientôt. Un canal par commerçant Un canal par obligation par commerçant Il ya des avantages et des inconvénients à chaque approche. L'approche par lien, par exemple, utilise beaucoup plus le Message Channel. Dans le pire des cas, le nombre de messages sera le nombre d'obligations total multiplié par le nombre de commerçants. Nous pouvons mettre des limites supérieures sur le nombre de canaux qui seront créés, car nous savons qu'il ya seulement environ 20 commerçants et ils ne jamais le prix de plus de quelques centaines d'obligations. Cela place la limite supérieure en dessous de la fourchette de 10 000, ce qui n'est pas si bizarre par rapport à la chaîne de près de 100 000 messages que le flux de données de marché est utilisé. De plus, comme nous utilisons le TIB et le Message Channel sont assez peu coûteux, le nombre de messages n'est pas un problème grave. D'autre part, le simple nombre de canaux de messages pourrait être un problème du point de vue de la gestion. Chaque fois qu'un lien est ajouté un canal pour chaque commerçant doit être maintenu. Cela pourrait être grave dans un système très dynamique. Notre système, cependant, est essentiellement statique. Il dispose également d'une infrastructure pour la gestion automatique des canaux de messages. Ceci combiné à l'architecture héritée d'un composant hérité utilisant une approche similaire minimise l'inconvénient. Cela ne veut pas dire que nous devrions faire un nombre inutilement excessif de canaux de messages. Plutôt, nous pouvons mettre en œuvre une approche architecturale qui utilise un grand nombre de canaux de messages quand il ya une raison. Et il ya une raison dans ce cas qui se résume à l'emplacement de la logique. Si nous mettons en œuvre l'approche par opérateur, le moteur Analytics a besoin d'une logique pour grouper les canaux d'entrée et de sortie. Cela est dû au fait que les canaux d'entrée du moteur d'analyse sont par liaison et que le canal de messages de sortie est par opérateur, ce qui oblige le moteur Google Analytics à acheminer toutes les données analytiques provenant de plusieurs obligations pour un opérateur particulier. Cela transforme effectivement le moteur d'analyse en un routeur basé sur le contenu afin de mettre en œuvre une logique de routage personnalisée pour notre application. Suite à la structure Message Bus, le moteur Analytics est un serveur générique qui pourrait être utilisé par plusieurs autres systèmes dans le. Donc, nous ne voulons pas de nuages avec des fonctionnalités spécifiques du système. D'autre part, l'approche par obligation fonctionne puisque l'idée d'un opérateur possédant la sortie analytique des prix des obligations est une pratique acceptée par l'entreprise. L'approche par liaison maintient la séparation du canal de messages du flux de données du marché intacte, tout en ajoutant plusieurs autres canaux de messages. Avant d'atteindre le client, nous voulons qu'un routeur basé sur le contenu combine ces plusieurs canaux en un nombre gérable de canaux. Nous ne voulons pas que l'application cliente s'exécute sur le bureau des commerçants pour écouter des milliers ou des dizaines de milliers de canaux de messages. Maintenant, la question est de savoir où mettre le routeur basé sur le contenu. Nous pourrions simplement avoir l'adaptateur de canal CTIB transmettre tous les messages à la passerelle de prix sur un seul canal de message. C'est mal pour deux raisons que nous allions diviser la logique métier entre C et Java, et nous perdrions l'avantage des canaux de message séparés sur le côté TIB nous permettant d'éviter de filtrer plus tard dans le flux de données. En examinant nos composants Java, nous pourrions le placer dans la passerelle de tarification ou créer un composant intermédiaire entre la passerelle de tarification et le client. En théorie, si nous maintenions la séparation basée sur les obligations de Message Channel s jusqu'au client, la Passerelle de tarification diffuserait des informations sur les prix avec la même structure de canal que la passerelle de tarification et le moteur d'analyse. Cela signifie une duplication de tous les canaux TIB dédiés aux obligations dans JMS. Même si nous créons une composante intermédiaire entre la passerelle de tarification et le client, la passerelle de tarification devra toujours dupliquer tous les canaux dans JMS. D'autre part, la mise en œuvre de la logique directement dans la passerelle de tarification nous permet d'éviter de dupliquer le grand nombre de canaux dans JMS, nous permettant de créer un nombre beaucoup plus petit de canaux de l'ordre d'un par commerçant. La passerelle de tarification s'inscrit par l'intermédiaire de l'adaptateur de canal CTIB en tant que consommateur pour chaque obligation de chaque opérateur dans le système. Ensuite, la Passerelle de tarification transmettra à chaque client spécifique uniquement les messages relatifs à ce commerçant en particulier. De cette façon, nous n'utilisons qu'un petit nombre de canaux de messages sur l'extrémité JMS, tout en maximisant l'avantage de la séparation sur la fin TIB. Le flux de données de marché complet pour le client La discussion sur la mise en page des messages est un bon exemple de l'importance de l'intégration de modèles. Le but ici était de comprendre comment utiliser efficacement le canal de messages. Dire que vous utilisez un modèle n'est pas assez. Vous devez trouver la meilleure façon de le mettre en œuvre et d'intégrer dans votre système pour résoudre les problèmes à portée de main. En outre, cet exemple montre les forces d'affaires en action. Si nous pouvions mettre en œuvre la logique métier dans l'une de nos composantes, nous aurions pu utiliser l'approche par opérateur et implémenter une approche globale plus simple avec beaucoup moins de canaux. Sélection d'un canal de messagerie Maintenant que nous connaissons la mécanique de la communication entre les composants JavaJMS et les composants C TIBCO, et nous avons vu une certaine structuration Message Channel, nous devons décider quel type de JMS Message Channel s les composants Java doivent utiliser pour communiquer . Avant de pouvoir choisir entre les différents canaux de messages disponibles dans JMS, nous allons regarder le flux de messages de haut niveau du système. Nous avons deux passerelles (prix et contribution) communiquant avec le client. Les flux de données de marché vers le client à partir de la passerelle de tarification qui envoie à la passerelle de contribution. L'application cliente envoie un message à la passerelle de tarification pour modifier les analyses appliquées à chaque liaison. The Contribution Gateway also sends messages to the Client application relaying the status of the price updates to the different trading venues. The system message flow The JMS specification describes two Message Channel types, Point-to-Point Channel (JMS Queue ) and Publish-Subscribe Channel (JMS Topic ). Recall that the case for using publish-subscribe is to enable all interested consumers to receive a message while the case for using point-to-point is to ensure that only one eligible consumer receives a particular message. Many systems would simply broadcast messages to all client applications, leaving each individual client application to decide for itself whether or not to process a particular message. This will not work for our application since there are a large number of market data messages being sent to each client application. If we broadcast market data updates to uninterested trader, we will be unnecessarily wasting client processor cycles deciding whether or not to process a market data update. Point-to-Point Channel s initially sound like a good choice since the clients are sending messages to unique servers and visa versa. But it was a business requirement that traders may be logged in to multiple machines at the same time. If we have a trader logged in at two workstations simultaneously and a point-to-point price update is sent, only one of the two client applications will get the message. This is because only one consumer on a Point-to-Point Channel can receive a particular message. Notice that only the first of each group of a traders client applications receives the message. Point-to-Point Messaging for Price Updates We could solve this using the Recipient List pattern, which publishes messages to a list of intended recipients, guaranteeing that only clients in the recipient list will receive messages. Using this pattern, the system could create recipient lists with all client application instances related to each trader. Sending a message related to a particular trader would in turn send the message to each application in the recipient list. This guarantees all client application instances related to a particular trader would receive the message. The downside of this approach is that it requires quite a bit of implementation logic to manage the recipients and dispatch messages. Recipient List for Price Updates Even though point-to-point could be made to work, lets see if there is a better way. Using Publish-Subscribe Channel s, the system could broadcast messages on trader specific channels rather than client application specific channels. This way, all client applications processing messages for a single trader would receive and process the message. Publish-Subscribe Messaging for Price Updates The downside of using Publish-Subscribe Channel s is that unique message processing is not guaranteed with the server components. It would be possible for multiple instances of a server component to be instantiated and each instance process the same message, possibly sending out invalid prices. Recalling the system message flow, only a single communication direction is satisfactory with each Message Channel . Server-to-client communication with publish-subscribe is satisfactory while client-to-server communication is not and client-server communication with point-to-point is satisfactory while server-client is not. Since there is no need to use the same Message Channel in both directions, we can use each Message Channel only one direction. Client-to-server communication will be implemented with point-to-point while server-to-client communication will be implemented with publish-subscribe. Using this combination of Message Channel s, the system benefits from direct communication with the server components using point-to-point messaging and the multicast nature of publish-subscribe without either of the drawbacks. Message flow with Channel Types Problem Solving With Patterns Patterns are tools and collections of patterns are toolboxes. They help solve problems. Some think that patterns are only useful during design. Following the toolbox analogy, this is like saying that tools are only useful when you build a house, not when you fix it. The fact is that patterns are a useful tool throughout a project when applied well. In the following sections we will use the same pattern exploration process we used in the previous section to solve problems in our now working system. Flashing Market Data Updates Traders want table cells to flash when new market data is received for a bond, clearly indicating changes. The Java client receives messages with new data which triggers a client data cache update and eventually flashing in the table. The problem is that updates come quite frequently. The GUI thread stack is becoming overloaded and eventually freezing the client since it cant respond to user interaction. We will assume that the flashing is optimized and concentrate on the data flow of messages through the updating process. An examination of performance data shows the client application is receiving several updates a second some updates occurred less than a millisecond apart. Two patterns that seem like they could help slow down the message flow are Aggregator and Message Filter. A first thought is to implement a Message Filter to control the speed of the message flow by throwing out updates received a small amount of time after the reference message. As an example, lets say that we are going to ignore messages within 5 milliseconds of each other. The Message Filter could cache the time of the last acceptable message and throw out anything received within the next 5 milliseconds. While other applications may not be able to withstand data loss to such an extent, this is perfectly acceptable in our system due to the frequency of price updates. Time based Message Filter The problem with this approach is that not all data fields are updated at the same time. Each bond has approximately 50 data fields displayed to the user including price. We realize that not every field is updated in every message. If the system ignores consecutive messages, it may very well be throwing out important data. The other pattern of interest is the Aggregator . The Aggregator is used to manage the reconciliation of multiple, related messages into a single message, potentially reducing the message flow. The Aggregator could keep a copy of the bond data from the first aggregated message, then update only new or changed fields successive messages. Eventually the aggregated bond data will be passed in a message to the client. For now, lets assume that the Aggregator will send a message every 5 milliseconds like the Message Filter . Later, well explore another alternative. Aggregator with partial successive updates The Aggregator . like any other pattern, is not a silver bullet it has its pluses and minuses that need to be explored. One potential minus is that implementing an Aggregator would reduce the message traffic by a great amount in our case only if many messages are coming in within a relatively short time regarding the same bond. On the other hand, we would accomplish nothing if the Java client only receives updates for one field across all of the traders bonds. 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 SystemChapdelaine 038 Co. Modernizes Municipal 038 Corporate Bond Trading System to the Web with Nexaweb BURLINGTON, Mass. July 12, 2011 PRNewswire -- Nexaweb Technologies, Inc. a leading provider of IT application modernization software solutions. today announced that Chapdelaine amp Co. has selected Nexaweb to help transform its terminal-based municipal bond trading system into a rich Internet application that provides real-time market data and trading services to traders over the web. Established in 1966, Chapdelaine amp Co. is an inter-dealer broker that provides dealer-to-dealer services for fixed-income bond executions for municipal and corporate bonds. At the core of the firms service is its custom, fixed-income trading platform. The terminal-based system was originally designed to support Chapdelaine amp Co. traders fielding orders from clients over the phone. In order to make the system easier to learn and more productive to use for employees, and to provide self-service e-trading to clients over the web, Chapdelaine amp Co selected Nexaweb to help modernize their trading platform. In order for the next-generation trading platform to meet the firms business objectives, it needed to have a rich Internet user interface (UI) that pushes market data to users in real time it also required a modular architecture that would make it easier to maintain and extend in the future. Chapdelaine amp Co. selected Nexaweb to support the initiative in large part, because Nexawebs application modernization software aligned with their objectives so well: - Nexaweb Studio - visually create rich Internet application UIs for traders - Nexaweb Internet Message Bus - provides secure, two-way data transfer between the server and web browsers for real-time market data delivery, order status reporting and trade capture - Nexaweb Reference Framework - reduces project time, cost and risk by providing a ready-to-use, modular J2EE architecture that ties new and legacy application components together and includes pre-built code for handling security, user interface interactions, workflow, SOA access, etc. In order to deliver a revolutionary user experience to our clients we had very ambitious application requirements to meet, said Ken Torres, senior vice president of IT at Chapdelaine amp Co. We turned to Nexaweb because they not only possess a great modernization customer track record they also integrated nicely into our infrastructure, which gave us a huge head start and eliminated a lot of delivery risk. Chapdelaine amp Co. is using the Nexaweb Enterprise Web Suite to make additional enhancements to their trading platform, including real-time Municipal Securities Rulemaking Board (MSRB) data feeds, market indicators, market news and analysis tickers delivered via RSS, and user preferences configuration. Were excited to be working with Chapdelaine amp Co. to support the modernization of their bond trading platform, said Nexaweb CEO, Chris Heidelberger. Seeing the transformational effect that application modernization has on our customers businesses is the most rewarding part of the field were in. Nexaweb Technologies, Inc. is the leader in clientserver and legacy application modernization using cloud computing. Nexaweb has modernized more than 450 applications to date -- and is the only company offering a fixed-time, fixed-price guarantee. More than 200 customers, including Aflac, DHL, EMC, Nokia Siemens Networks, Pepsico, Rabobank and US Air Force have leveraged Nexaweb software and services to modernize their applications and transform their businesses. For the latest news and information, follow Nexaweb on Twitter at twitterNexaweb and visit nexaweb . Media Contact: Andrew Ellicott Andyellicott(at)nexaweb(dot)com 603-205-2804
No comments:
Post a Comment