Handelssystem som utformar ditt system - Del 1.Första delen av denna handledning tittade på de delar som utgör ett handelssystem och diskuterade fördelarna och nackdelarna med att använda ett sådant system i en levande handelsmiljö. I det här avsnittet bygger vi vidare på den kunskapen Genom att undersöka vilka marknader som är särskilt lämpade för systemhandel. Vi ska sedan ta en närmare titt på de olika handelssystemens genrer. Försäljning i olika marknader. Aktiemarknader Aktiemarknaden är förmodligen den vanligaste marknaden för handel, Särskilt bland nybörjare I denna arena dominerar stora aktörer som Warren Buffett och Merrill Lynch, och traditionella värde - och tillväxtinvesteringsstrategier är överlägset vanligaste. Dock har många institutioner investerat betydligt i design, utveckling och genomförande av handelssystem Individuella investerare Går med i denna trend, men långsamt. Det är några viktiga faktorer att komma ihåg när man använder handelssystem på aktiemarknaden S. Det stora antalet tillgängliga aktier gör det möjligt för handlare att testa system på många olika typer av aktier - allt från extremt flyktiga OTC-aktier till icke-flyktiga blue chips. Effektiviteten hos handelssystem kan begränsas av den låga likviditeten Av vissa aktier, i synnerhet OTC och pink sheet emissioner kan äta i vinster genererade av framgångsrika affärer och kan öka förluster OTC och rosa ark aktier ofta medför ytterligare provision avgifter. De viktigaste handelssystem som används är de som söker värde - det vill säga system Som använder olika parametrar för att avgöra huruvida en säkerhet är undervärderad jämfört med dess tidigare prestanda, dess jämlikar eller marknaden i allmänhet. Forex Exchange Markets Valutamarknaden eller Forex är den största och mest likvida marknaden i världen Världens regeringar , banker och andra stora institutioner handlar biljoner dollar på valutamarknaden varje dag De flesta institutionella handlare på valutan är beroende av trad Ing system Detsamma gäller för individer i forexen, men viss handel baserad på ekonomiska rapporter eller ränteutbetalningar. Här är några viktiga faktorer att komma ihåg när man använder handelssystem i valutamarknaden. Likviditeten på denna marknad - på grund av den enorma volymen - gör handelssystemen mer exakta och effektiva. Det finns inga provisioner på denna marknad. Det är därför mycket lättare att göra många transaktioner utan att öka kostnadsbesparingar på antalet aktier eller råvaror som finns tillgängliga. Antalet valutor som ska handlas är begränsade Men på grund av tillgången på exotiska valutapar - det vill säga valutor från mindre länder - är volatilitetsintervallet inte nödvändigtvis begränsat. De viktigaste handelssystemen som används i forex är de som följer trender ett populärt ord på marknaden är trenden är din vän, eller system som köper eller säljer på breakouts Detta beror på att ekonomiska indikatorer ofta orsakar stora prisrörelser på en gång. Futures Equity, forex och råvara marknader allt erbjuds terminshandel Detta är ett populärt fordon för systemhandel på grund av den högre mängden hävstång som finns och ökad likviditet och volatilitet. Dessa faktorer kan dock skära båda sätten att de antingen kan förstärka dina vinster eller förstärka dina förluster. användning av terminer är vanligtvis reserverad för avancerade enskilda och institutionella systemhandlare. Det beror på att handelssystem som kan kapitalisera på terminsmarknaden kräver mycket större anpassning, använder mer avancerade indikatorer och tar mycket längre tid att utveckla. Så, vilket är bäst. Det är upp till enskild investerare för att bestämma vilken marknad som passar bäst för systemhandel - var och en har sina egna fördelar och nackdelar. De flesta människor är mer bekanta med aktiemarknaderna och denna förtrogenhet gör det lättare att utveckla ett handelssystem. Forex anses emellertid vara den överlägsen plattformen att driva handelssystem - särskilt bland mer erfarna handlare Dessutom, om en näringsidkare bestämmer sig för att locka Italize på ökad hävstångseffekt och volatilitet är terminsalternativet alltid öppet. Slutligen ligger valet i systemutvecklarens händer. Typ av handelssystem. Trend-Följande system Den vanligaste metoden för systemhandel är det trend-efterföljande systemet. mest grundläggande form, väntar detta system helt enkelt på en betydande prisrörelse, köper eller säljer i den riktningen. Denna typ av systembanker hoppas att dessa prisrörelser kommer att behålla trenden. Möjliga medelstorlekar Används ofta i teknisk analys är ett rörligt medelvärde en indikator som helt enkelt visar genomsnittspriset på ett lager över en tidsperiod Trenden av trender är härledd från denna mätning Den vanligaste sättet att bestämma in - och utträde är en crossover Logiken bakom detta är enkel En ny trend är etablerad när priset faller över eller under dess historiska prisgenomsnittstrenden Här är ett diagram som pryder både prisblå linjen och den 20-dagars MA-röda raden av IBM. Breakout Systems The grundläggande begrepp bakom denna typ av system är liknande det för ett glidande medelvärde. Tanken är att när en ny hög eller låg är etablerad, är prisrörelsen sannolikt att fortsätta i riktning mot breakout. En indikator som kan användas i Att bestämma breakouts är ett enkelt Bollinger Band-överlag Bollinger Bands visar medelvärden av höga och låga priser och breakouts uppstår när priset möter kanterna på banden. Här är ett diagram som prissätter pris blå linje och Bollinger Bands gråa linjer av Microsoft. Disadvantages of Trend - Följande Systems. Empirical Decision-Making Required - Vid fastställande av trender finns det alltid ett empiriskt element att överväga varaktigheten av den historiska trenden. Till exempel kan det rörliga genomsnittet vara de senaste 20 dagarna eller de senaste fem åren, så utvecklaren måste bestämma vilken som är bäst för systemet Andra faktorer som ska bestämmas är de genomsnittliga höjderna och nedgångarna i brytningssystem. Lagring av naturen - Flyttande medelvärden och brytningssystem wi Jag kommer alltid att fördröja Med andra ord kan de aldrig träffa exakt toppen eller botten av en trend. Detta leder oundvikligen till förverkande av potentiella vinster, vilket ibland kan vara betydande. Växlande effekt - Bland marknadsstyrkorna som skadar framgången för trend-efter-system är detta en av de vanligaste. Whipsaw-effekten uppstår när det rörliga genomsnittsvärdet genererar en falsk signal - det vill säga när genomsnittet sjunker precis i intervallet, vänder det plötsligt riktning. Detta kan leda till stora förluster om inte effektiv stopp - Förluster och riskhanteringstekniker är anställda. Sannolikt marknader - Trend-efter-system är av naturen kapabla att tjäna pengar endast på marknader som faktiskt trender Men marknaderna rör sig också sidledes inom ett visst område under en längre tidsperiod. Extreme Volatilitet kan förekomma - Trenden efterföljande system kan uppleva viss extrem volatilitet, men näringsidkaren måste hålla sig i sitt system. Oförmågan att göra det kommer att resultera i försiktigt misslyckande. Countertrend Systems I grund och botten är målet med countertrend-systemet att köpa till lägst lågt och sälja högst högt. Huvudskillnaden mellan detta och det trendföljande systemet är att motströmsystemet inte är självkorrigerande Med andra ord , Det finns ingen bestämd tid för att avsluta positioner och detta leder till obegränsad nackdel. Typ av motverkningssystem Många olika typer av system betraktas motströmsystem. Tanken här är att köpa när momentum i en riktning börjar blekna. Detta beräknas oftast med oscillatorer Exempelvis kan en signal genereras när stokastik eller andra relativa styrindikatorer faller under vissa punkter. Det finns andra typer av motstridshandelssystem, men alla delar samma grundläggande mål - att köpa låga och sälja höga. Nackdelar med Countertrend Följande Systems. Emirical Decision-Making Required - Till exempel, en av de faktorer som systemutvecklaren måste bestämma är pointen Ts där relativa hållfasthetsindikatorer fade. Extreme Volatility May Occur - Dessa system kan också uppleva viss extrem volatilitet och en oförmåga att hålla fast vid systemet trots att volatiliteten kommer att resultera i ett försäkrat misslyckande. Ojämn nackdel - Som tidigare nämnts är det obegränsat Nackdelen potential eftersom systemet inte är självkorrigerande är det ingen bestämd tid att gå ut. Positionen De viktigaste marknaderna för vilka handelssystem är lämpliga är aktie-, valutamarknaden och terminsmarknaden. Var och en av dessa marknader har sina fördelar och nackdelar. De två huvudgenrerna Av handelssystem är trend-following och countertrend-systemen Trots skillnaderna kräver båda typerna av system i utvecklingsstadierna empirisk beslutsfattande från utvecklarens sida. Dessa system är också utsatta för extrem volatilitet och detta kan kräva en del uthållighet - det är viktigt att systemhandlaren håller fast vid sitt system under dessa tider I följande i Nallment ska vi titta närmare på hur man utformar ett handelssystem och diskutera några av de programvaror som systemhandlare använder för att göra sina liv enklare. Systemutveckling av system - Del 2.Första avsnittet om att utforma ett handelssystem granskar olika typer av marknader att handla och tar en titt på de två grundläggande genren av handelssystemens trend-följande och motstridssystem Dessa två strategier utgör grunden för alla handelssystem är byggda och marknaderna ger mediet I denna sekund Avsnitt om design av ett handelssystem bryter vi ner de två genren i enskilda komponenter, undersöker den empiriska beslutsprocessen och slutligen tittar på hur mjukvaran har revolutionerat systemhandel. Basiska handelssystemkomponenter Som nämnts i introduktionen handlas handel Systemen är konstruerade med hjälp av parametrar - grupperna av specifika regler som genererar in - och utgångspunkter för ett givet eget kapital. Både trend-follow och countertr slutet handelssystem följa fyra grundläggande principer som styr byggandet av något handelssystem Dessa principer är också de väsentliga egenskaperna hos ett effektivt system. Systemet måste tjäna pengar - det här är lätt att säga men svårt att göra. Maximera procentuell avkastning bör vara Ditt primära mål när du utformar ett handelssystem. Systemet måste kunna begränsa riskerna. Det är svårt att använda ett system som fluktuerar mellan extrema höga och låga. Det hämmar inte bara din förmåga att likvida men det kan också vara en psykisk skattning. genom att begränsa risker kan du minska effekten av en dålig post, till exempel, gå lång under en nedåtgående fluktuation. Systemets parametrar måste vara stabila och genomförbara - Handelssystem kan inte förlita sig på tillfällighet eller lycka Systemdesignern kan uppfylla detta princip av stabilitet genom att bredda parametrarna och inte optimera för mycket i ett försök att öka hans eller hennes chans att lyckas. Genomförbarheten av parametrar, Inklusive glidning, diskuteras i den andra delen av denna handledning. Återigen är det mycket viktigt att ta hänsyn till glidning vid utformning av ett system. Systemets tidsram måste vara stabilt och genomförbart. För att systemets tidsram ska lyckas, slump och lycka Bör inte spela en faktor. Feasibility måste också beaktas i det här fallet. Om tidsramarna är inställda för nära varandra kan den resulterande mängden handelsfrekvens kanske inte vara möjlig på grund av programvarubegränsningar och eller begränsningar på marknaden. Empirisk beslutsfattande Ett handelssystem kräver designer för att göra några empiriska beslut som direkt påverkar systemets prestanda - om det inte fanns något behov av detta beslutsfattande skulle alla vara rika. Här är några grundläggande faktorer som systemdesigners måste bestämma och några riktlinjer. Hur lång tid ska jag använda All aktier kan analyseras ur flera perspektiv av tidsperioder, från en minut till ett decennium eller mer. Beslutar vilken tidsperiod som ska testas ca n drastiskt påverkar systemets prestanda Mer tillförlitliga resultat kommer i allmänhet från längre tidsperioder, medan korta perioder kan vara vilseledande när man bedömer verkliga marknadsförhållanden. Det betyder emellertid inte att endast extremt långa prisperioder ska användas. Det är viktigt att hålla i tänk på att ju längre tidsperioden desto längre tid det kan ta för vinst att bli realiserat. Observera följande exempel på Microsofts långsiktiga period på mer än 20 år, jämfört med kort sikt en period av några veckor. Vi kan tydligt Se att kortsiktigheten inte är en korrekt representation på lång sikt, och vice versa Som en allmän tumregel är fem till tio år ett bra mål för mellan - och långsiktiga systemhandlare och sex månader till fem år är ett rimligt utbud för kortfristiga handlare Återigen beror det på när du planerar att likvida. Vilka prisserier ska jag använda De flesta aktier kartläggs på en obruten prisserie - det vill säga diagrammen är kontinuerliga några andra aktier finns det emellertid möjlighet att använda faktiska kontraktsdata i stället för kontinuitet. Terminskontrakten håller sig bara ett par månader och systemtesttestning kräver ofta ett år eller mer av data. Därför använder systemhandlare ofta kontinuerliga terminer, vilket är en serie av kontrakt kombinerade för att skapa en kontinuerlig ström av data Som en allmän tumregel bör långsiktiga handlare hålla sig till kontinuerliga terminer, medan kortfristiga näringsidkare bör använda faktiska kontraktsdata. Vilka parametrar och inställningar ska jag använda? Vi utforskar detta vidare i efterföljande sektioner som adresserar uppförandet av ett handelssystem I grund och botten väljs parametrar genom gissning och kontroll, eller producerar blindsimuleringar, eller förinställer en grupp parametrar och sedan använder medelvärdet för att bestämma prestanda. Det finns många av dessa faktorer kan påverkas av önskad likviditetstid tills likvidation, risk och en mängd andra faktorer, så det är viktigt att ta sig tid att bestämma vilka arbeten bäst för dig. Software och systemhandel Evolutionen av datorn är kanske den största drivkraften bakom systemhandel. Ursprungligen användes datorer för att knyta siffrorna så småningom att de fick kapacitet att genomföra simuleringar, generera signaler i realtid och till och med placera affärer för näringsidkaren Någon programvara är helt enkelt utformad som en plattform från vilken en systemutvecklare kan bygga ett system. Annan programvara använder neurala nätverk för att lära av marknaderna och förbättra sig. Vissa program är installerade på användarens hårddisk. online Här är några av de grundläggande programmen som används av systemutvecklare. Client-Side Software Klientsidan måste installeras på användarens dator. Det är ofta anslutet till internet och kan hämta realtidsdata inklusive priser, nyheter osv. Observera att vissa företag tar ut dig inte bara för programvaran utan även för data. Dessa applikationer tillåter normalt användaren att ange tidsperioden, typer av p arametrar och mer En av de viktigaste egenskaperna ger användaren möjlighet att programmera ett system. Detta görs med ett enkelt programmeringsspråk som ofta är specifikt för den applikation som används som du kan ställa in regler för att generera köp - och säljsignaler - Dessa visas då direkt på diagrammet. Här är ett exempel på en applikation på klientsidan som heter MetaTrader. Serverprogramvaruserverprogramvaran är installerad på en fjärrserver. Dessa applikationer returnerar ofta de signaler som visas för allmänheten med hjälp av en webbsida eller en abonnentsbas Det eliminerar behovet av någon annan klientsida än en webbläsare Dessutom betalar användaren ett litet abonnemangsavgift i motsats till att köpa ett program och betala för en abonnemang för data. Slutligen behöver användaren inte utveckla systemet får endast genererade signaler Men du bör komma ihåg att den här typen av programvara ofta är mottaglig för bedrägerier, medan programvaran för klientsidor inte är tillgänglig. För mer om detta, se Trading Syste Ms kodning. Konklusion Nu har du en grundläggande förståelse av handelssystem du vet vad de är, de olika typerna av system som finns, faktorerna att tänka på medan du utformar dem och programvaran som används för att göra systemhandeln lättare på dig. vi kommer att undersöka hur man faktiskt bygger ett handelssystem och lägger det i bruk. Mönsterbildningsmönster Integrationsmönster i praktikfallstudie Bond Trading System. Av Jonathan Simon. Det är lätt att avstå från en stor samling av mönster eller ett mönsterspråk Mönster är abstraktionen av en idé i en återanvändbar form Ofta gör den mycket generiska karaktären hos mönster som gör dem så användbara gör dem svårt att förstå Ibland är det bästa att hjälpa till att förstå mönster är ett verkligt världsexempel Inte ett konstruerat scenario av vad som kan hända men vad som faktiskt händer och vad som händer. Det här kapitlet gäller mönster för att lösa problem med en upptäcktsprocess Det system vi kommer att diskutera är en obligationshandel system som jag arbetade med i två år från inledande design genom produktion Vi kommer att undersöka scenarier och problem som uppstod och hur man löser dem med mönster. Det innebär beslutsprocessen att välja ett mönster, samt hur man kombinerar och anpassar mönster för att passa Systemets behov Och det här är allt gjort med hänsyn till krafterna i reala system, inklusive företagskrav, kundbeslut, ar chitekturala och tekniska krav samt äldre systemintegration. Syftet med detta tillvägagångssätt är att ge en tydligare förståelse av mönstren själva genom praktisk tillämpning. Bygga ett system. En stor Wall Street investeringsbank fastställer att bygga ett obligationsprissättningssystem i en ansträngningar för att effektivisera arbetsflödet på deras obligationshandelskort För närvarande måste obligationshandlare skicka priser för ett stort antal obligationer till flera olika handelsplatser, var och en med sitt eget användargränssnitt. Syftet med systemet är att minimera minutiae av prissättning av alla Deras obligationer kombinerat med avancerad analytisk funktionalitet som är specifik för obligationsmarknaden i ett enda inkapslat användargränssnitt. Detta innebär integration och kommunikation med flera komponenter över olika kommunikationsprotokoll. Systemets höga nivå ser ut som detta. Först kommer marknadsdata i systemet Marknaden data är uppgifter om pris och andra egenskaper hos obligationen som representerar vad människor är willin g att köpa och sälja obligationen på den fria marknaden Marknadsdata skickas omedelbart till analysmotorn som ändrar data Analytics avser matematiska funktioner för finansiella applikationer som ändrar priser och andra attribut av obligationer Dessa är generiska funktioner som använder inmatning Variabler för att skräddarsy resultaten av funktionen till ett visst bindning Klientapplikationen som kommer att köras på varje traderbordsskrivare konfigurerar analysmotorn på en näringsidkarbas, kontrollerar analysens specifika för varje obligation som näringsidkaren prissätter. När analyserna är Tillämpas på marknadsdata, skickas de modifierade uppgifterna till olika handelsplatser där handlare från andra företag kan köpa eller sälja obligationerna. Arkitektur med mönster. Med denna översikt över systemets arbetsflöde kan vi närma oss några av de arkitektoniska problemen vi möter under designprocessen Låt oss ta en titt på vad vi vet hittills Traders behöver ett mycket lyhörd program på både Windows NT en d Solaris-arbetsstationer Därför bestämde vi oss för att implementera klientapplikationen som en Java-tjock klient på grund av dess plattformsoberoende och dess förmåga att snabbt svara på användarinmatning och marknadsdata. På serverns sida förvärvar vi äldre C-komponenter som vårt system kommer att utnyttja Marknadsdatakomponenterna kommunicerar med TIBCO Information Bus TIB Messaging Infrastructure. We ärverger följande komponenter. Marknadsdataprismatningsserver publicerar inkommande marknadsdata till TIB. Analytics Engine Utför analys på inkommande marknadsdata och sänder ändrade marknadsdata till TIB. Contribution Server Utför all kommunikation med handelsplatserna. Handelsplatserna är komponenter från tredje part som inte kontrolleras av banken. Data för subsystem för legitimitetsdata. Subsystem för legitimitet. Vi måste bestämma hur de separata delsystemen Java tjock klient, marknadsdata och bidrag är Kommunicerar Vi kan få den tjocka klienten att kommunicera direkt med le gacy-servrar men det skulle kräva för mycket affärslogik på klienten i stället ska vi bygga ett par Java-gateways för att kommunicera med de gamla servrarna Prissättning Gateway för marknadsdata en bidragsportway för att skicka priser till handelsplatser Detta kommer att uppnå fin inkapsling av affärslogiken relaterad till dessa områden De nuvarande komponenterna i systemet visas nedan Anslutningarna markerade som indikerar att vi fortfarande är osäkra på hur vissa komponenter kommer att kommunicera. Systemet och dess komponenter. Den första kommunikationsfrågan är hur man integrerar Java-tjock klient och de två Java-serverkomponenterna för att utbyta data Låt oss titta på de fyra integrationsstilarna som föreslås i denna bok. Filöverföring Delad databas Fjärrprocedur Inbjudningar och meddelanden Vi kan utesluta delad databas omedelbart eftersom vi ville skapa ett lager av abstraktion mellan klienten och databasen och inte vill ha databasåtkomstkod i klienten File Transfe R kan på samma sätt uteslutas eftersom minimal latens krävs för att säkerställa att nuvarande priser skickas ut till handelsplatserna. Detta ger oss möjlighet att välja mellan Remote Procedure Invocation eller Messaging. Java-plattformen erbjuder inbyggt stöd för både Remote Procedure Invocation och Messaging Integreringen av RPC-format kan uppnås med hjälp av fjärrmetodinventering RMI, CORBA eller Enterprise Java-bönor. EJB Java Messaging Service JMS är det gemensamma API för meddelandeformatintegration Så båda integrationsstilarna är lätta att implementera i Java. Såsom kommer att fungera bättre för detta projekt, Remote Procedure Invocation eller Messaging There är endast en instans av prissättningsporten och en instans av Contribution Gateway i systemet, men vanligtvis många Thick Clients kopplar samtidigt till dessa tjänster en för varje obligationshandlare som råkar vara inloggad Vid en viss tidpunkt skulle banken vilja att detta är ett generiskt prissystem som kan användas i andra applikationer förutom ett okänt antal Think Clients kan det finnas ett okänt antal andra applikationer som använder prisuppgifterna som kommer ut från Gateways. En tjock klient eller annan applikation som använder prissättningsdata kan ganska enkelt använda RPC för att ringa till Gateways för att få prissättning data och åberopa bearbetning Men prissättning data kommer ständigt att publiceras, och vissa kunder är bara intresserade av vissa uppgifter, så att få relevanta uppgifter till rätt kunder i tid kan vara svårt. Kunderna kunde granska Gateways, men det kommer att skapa mycket överhuvudet Det skulle vara bättre för Gateways att göra data tillgängliga för kunderna så snart den är tillgänglig. Det kommer emellertid att kräva att varje Gateway ska hålla reda på vilka klienter som för närvarande är aktiva och vilka vill ha vilken viss data Då, när en ny bit av data blir tillgänglig som kommer att hända flera gånger per sekund, måste Gateway göra en RPC till varje intresserad klient för att överföra data till clie nt Ideellt bör alla klienter meddelas samtidigt, så varje RPC måste göras i sin egen samtidiga tråd. Det kan fungera, men blir väldigt komplicerat mycket snabbt. Med hjälp av meddelanden kan vi definiera separata kanaler för olika typer av prissättningsdata När en Gateway får en ny datauppsättning kommer den att lägga till ett meddelande som innehåller data till Public-Subscribe-kanalen för den datatypen. Samtidigt lyssnar alla klienter som är intresserade av en viss typ av data på kanalen för den typen På så sätt kan Gateways enkelt skicka ut nya data till den som är intresserad, utan att behöva veta hur många lyssnarapplikationer det finns eller vad de är. Klienterna måste fortfarande kunna påverka beteenden i Gateways Det finns bara två Gateways, och klienten kan förmodligen blockera medan metoden är påkallad synkront. Dessa klient-till-Gateway-inbjudningar kan ganska enkelt implementeras med hjälp av RPC Men eftersom vi använder redan meddelanden för gateway-till-klientkommunikation. Meddelanden är förmodligen lika bra för att implementera klient-till-gateway-kommunikation också. Därför kommer all kommunikation mellan Gateways och klienterna att uppnås genom meddelandet eftersom alla komponenter skrivs i Java, JMS presenterar ett lätt val för som meddelandesystem Det här skapar effektivt en Message Bus eller en arkitektur som gör det möjligt för framtida system att integrera med det nuvarande systemet med få eller inga ändringar i meddelandets infrastruktur. sättet kan programmets affärsfunktion enkelt användas av en annan applikation som banken utvecklar. Java-komponenter som kommunicerar med JMS. JMS är helt enkelt en specifikation och vi måste besluta om ett JMS-kompatibelt meddelandesystem. Vi bestämde oss för att använda IBM MQSeries JMS eftersom Banken är en IBM-butik, som använder WebSphere-applikationsservrar och många andra IBM-produkter. Som ett resultat kommer vi att använda MQSeries eftersom vi redan har ave en supportinfrastruktur på plats och en webbplatslicens för produkten. Nästa fråga är hur man ansluter MQSeries messaging system med fristående C Contribution-servern och TIBCO-baserade marknadsdata och Analytics Engine servrar Vi behöver ett sätt för MQSeries konsumenter att Har tillgång till TIB-meddelanden Men hur kan vi kanske använda Message Translator-mönstret för att översätta TIB-meddelanden till MQSeries-meddelanden Även om C-klienten för MQSeries fungerar som en Message Translator använder den att offra JMS-serverens oberoende Och även om TIBCO har ett Java API, Kundarkitekten och chefen har avvisat det. Därför måste Message Translator-tillvägagångssättet överges. Broen från TIB-servern till MQSeries-servern kräver kommunikation mellan C och Java Vi kan använda CORBA, men hur är meddelandet A närmare titta på Message Translator-mönstret visar att den är relaterad till kanaladaptern i dess användning av kommunikationsprotokoll. En hjärtas hjärta Adapter är att ansluta icke-meddelandesystem till meddelandesystem Ett par kanaladaptrar som ansluter två meddelandesystem är en Messaging Bridge. Syftet med en Messaging Bridge är att överföra meddelanden från ett meddelandesystem till ett annat. Det är precis vad vi gör med Den extra komplexiteten hos Java-C-kommunikationen mellan språken Vi kan implementera cross-language Messaging Bridge med hjälp av en kombination av Channel Adapter s och CORBA. Vi kommer att bygga två lättvikta kanaladapterservrar, en i C som hanterar kommunikation med TIB och en i Java hantera kommunikation med JMS Dessa två kanaladapter som är Message Endpoint s själva kommer att kommunicera med varandra via CORBA Liksom vårt val för MQSeries använder vi CORBA snarare än JNI eftersom det är en företagsstandard Meddelandebroen implementerar det effektivt simulerade meddelandet översättning mellan till synes inkompatibla meddelandesystem och olika språk. Message Translator med Channel Adapte r. Nästa diagram visar nuvarande systemdesign inklusive Gateways och andra komponenter. Detta är ett bra exempel på mönsterapplikation. Vi kombinerade två kanaladapter s med ett icke-meddelandeprotokoll för att implementera Message Translator-mönstret, effektivt med ett mönster för att implementera en annan mönster Dessutom ändrade vi kanaladapterns sammanhang för att länka två meddelandesystem med ett icke-meddelande språköverföringsprotokoll i stället för att ansluta ett meddelandesystem till ett icke-meddelandesystem. Det nuvarande systemet med kanaladaptrarna. Strukturkanaler. En nyckel Att arbeta med mönster är inte bara att veta när man ska använda vilket mönster men också hur man effektivt använder det. Varje mönsterimplementering måste ta hänsyn till specifikationerna för teknologiplattformen liksom andra designkriterier. Det här avsnittet gäller samma funktionsprocess för att hitta Den mest effektiva användningen av Public-Subscribe-kanalen i samband med marknadsdataservern som kommunicerar med t han analytics engine. Real tid marknadsdata härstammar med marknadsdata feed, en C-server som sänder marknadsdata på TIB Marknadsdata flödet använder en separat Public-Subscribe Channel för varje obligation det publicerar priser för. Det kan tyckas lite extrema sedan varje nytt band behöver sin egen nya kanal Men det här är inte så allvarligt eftersom du inte behöver skapa kanaler i TIBCO. I stället hänvisas kanaler till en hierarkisk uppsättning ämnesnamn som heter ämnen. TIBCO-servern filtrerar sedan ett enda meddelandeflöde efter ämne , Skickar varje unikt ämne till en enda virtuell kanal. Resultatet är en mycket lätt meddelandekanal. Vi kan skapa ett system som publicerar på några kanaler och abonnenter kan bara lyssna på priser de är intresserade av. Detta skulle kräva att abonnenter använder en Meddelandefilter eller selektiv konsument för att filtrera hela dataflödet för intressanta obligationspriser och bestämma om varje meddelande ska behandlas som det mottas med tanke på att E-marknadsdata publiceras på obligatoriska kanaler, kan abonnenter registrera sig för uppdateringar på en serie obligationer. Det gör det möjligt för abonnenter att filtrera genom att selektivt abonnera på kanaler och endast få uppdateringar av intresse snarare än att bestämma efter att meddelandet har tagits emot. Det är viktigt att notera att användningen av flera kanaler för att undvika filtrering är en otillåten användning av meddelandekanaler. I samband med TIBCO-tekniken bestämmer vi emellertid verkligen huruvida vi ska implementera eller äga filter eller använda kanalfiltrering som är inbyggd i TIBCO - istället för att använda så många Kanaler. Nästa komponent vi behöver designa är analysmotorn, en annan C TIB-server som kommer att ändra marknadsdata och vidarebefordra den till TIB. Även om den ligger utanför vår Java JMS-utveckling, arbetar vi nära med C team för att designa det eftersom vi är analytikerns primära kund. Problemet finns att hitta den kanalstruktur som mest effektivt återuppbyggs t den nyligen modifierade marknadsdata. Since vi redan har en dedikerad Message Channel per bindning ärvt från marknadsdataprismatningen, skulle det vara logiskt att ändra marknadsdata och vidarebefordra de modifierade marknadsdata på den obligatoriska meddelandekanalen, men det här kommer inte att work since the analytics modifying the bonds prices are trader specific If we rebroadcast the modified data on the bond Message Channel we will destroy the data integrity by replacing generic market data with trader specific data On the other hand, we could have a different message type for trader specific market data that we publish on the same channel allowing subscribers to decide which message they are interested in to avoid destroying the data integrity But then clients will have to implement their own filters to separate out messages for other traders Additionally, there will a substantial increase in messages received by subscribers, placing an unnecessary burden on them. There are two options. One Channel per Trader Each trader has a designated channel for the modified market data This way, the original market data remains intact and each trader application can listen to its specific traders Message Channel for the modified price updates. One Channel per trader per Bond Create one Message Channel per-trader per-bond solely for the modified market data of that bond For example, the market data for bond ABC would be published on channel Bond ABC while the modified market data for trader A would be published on Message Channel Trader A, Bond ABC , modified market data for trader B on Trader B, Bond ABC, and so on. One channel per trader. One channel per bond per trader. There are advantages and disadvantages to each approach The per-bond approach, for example, uses a lot more Message Channel In the worst-case scenario, the number of Message Channel will be the number of bonds total multiplied by the number of traders We can put upper bounds on the number of channels that will be created since we know that there are only around 20 traders and they never price more than a couple hundred bonds This puts the upper limit below the 10,000 range, which is not so outlandish compared to the nearly 100,000 Message Channel the market data price feed is using Also, since we are using the TIB and Message Channel are quite inexpensive, the number of Message Channel s is not a severe issue On the other hand, the sheer number of Message Channel s could be a problem from a management perspective Every time a bond is added a channel for each trader must be maintained This could be severe in a very dynamic system Our system, however, is essentially static It also has an infrastructure for automatically managing Message Channel s This combined with the inherited architecture of a legacy component using a similar approach minimizes the downside This is not to say we should make an unnecessarily excessive number of Message Channel s Rather, we can implement an architectural approach that uses a large number of Message Channel s when there is a reason. And there is a reason in this case that comes down to the location of logic If we implement the per trader approach, the Analytics Engine needs logic to group input and output channels This is because the input channels from the Analytics Engine are per bond and the output Message Channel s would be per trader, requiring the Analytics Engine to route all analytics input from multiple bonds for a particular trader to a trader specific output Message Channel This effectively turns the analytics engine into a Content-Based Router to implement custom routing logic for our application. Following the Message Bus structure, the Analytics Engine is a generic server that could be used by several other systems in the So we don t want to cloud it with system specific functionality On the other hand, the per-bond approach works since the idea of a trader owning the analytics output of bond prices is a company accepted practice The per-bond a pproach keeps the Message Channel separation of the market data feed intact, while adding several more Message Channel s Before we reach the client, we want a Content-Based Router to combine these several channels into a manageable number of channels We don t want the client application running on the trader s desktop to be listening to thousands or tens of thousands of Message Channel s Now the question becomes where to put the Content-Based Router We could simply have the C TIB Channel Adapter forward all of the messages to the Pricing Gateway on a single Message Channel This is bad for two reasons we would be splitting up the business logic between C and Java, and we would lose the benefit of the separate Message Channel s on the TIB side allowing us to avoid filtering later in the data flow Looking at our Java components, we could either place it in the Pricing Gateway or create an intermediary component between the Pricing Gateway and the client. In theory, if we persisted the bond - based separation of Message Channel s all the way to the client, the Pricing Gateway would rebroadcast pricing information with the same channel structure as the Pricing Gateway and Analytics Engine This means a duplication of all of the bond dedicated TIB channels in JMS Even if we create an intermediary component between the Pricing Gateway and the client, the Pricing Gateway will still have to duplicate all of the channels in JMS On the other hand, implementing logic directly in the Pricing Gateway allows us to avoid duplicating the large number of channels in JMS allowing us to create a much smaller number of channels in the order of one per trader The Pricing Gateway registers itself through the C TIB Channel Adapter as a consumer for each bond of every trader in the system Then the Pricing Gateway will forward each specific client only the messages related to that particular trader This way, we only use a small number of Message Channel s on the JMS end, while maximizing the ben efit of the separation on the TIB end. The complete Market Data Flow to the client. The Message Channel layout discussion is a good example of how integrating patterns is important The goal here was to figure out how to effectively use the Message Channel s Saying you use a pattern isn t enough You need to figure out how to best implement it and incorporate into your system to solve the problems at hand Additionally, this example shows business forces in action If we could implement business logic in any of our components, we could have gone with the per trader approach and implemented an overall more simple approach with many less channels. Selecting a Message Channel. Now that we know the mechanics of the communication between the Java JMS components and the C TIBCO components, and we have seen some Message Channel structuring, we need to decide which type of JMS Message Channel s the Java components should use to communicate Before we can choose between the different Message Channels av ailable in JMS, let s look at the high level message flow of the system We have two gateways Pricing and Contribution communicating with the client Market data flows to the client from the Pricing Gateway which sends it out to the Contribution Gateway The client application sends message to the Pricing Gateway to alter the analytics being applied to each bond 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 trader s client applications receives the message. Point-to-Point Messaging for Pri ce 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, let s 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 ca che 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 can t 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 milliseco nds 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 mil liseconds like the Message Filter Later, we ll 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 t hat the Java client receives many messages updating fields of the same bond, and therefore related messages So, Aggregator is in fact a good decision. What s 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 continu ously 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 mo re 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 guarantee s 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 couldn t be fixed with a thousand patterns We later addressed this problem by refac toring 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 don t 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 s ee 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 Integration Patterns in Practice Case Study Bond Trading System.
No comments:
Post a Comment