Monday, 27 November 2017

Lager trading system design mönster


Trading Systems: Designing Your System - Del 1 13 Den föregående 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 detta avsnitt bygger vi vidare på den kunskapen genom att undersöka vilka marknader som är särskilt lämpade för systemhandel. Vi kommer då att ta en djupare titt på de olika handelssystemens genrer. Handel på olika marknader Aktiemarknader Aktiemarknaden är förmodligen den vanligaste marknaden för handel, särskilt bland nybörjare. I denna arena dominerar stora spelare som Warren Buffett och Merrill Lynch, och traditionella värde - och tillväxtinvesteringsstrategier är överlägset vanligast. Trots detta har många institutioner investerat betydligt i design, utveckling och genomförande av handelssystem. Enskilda investerare går med i denna trend, men långsamt. Här är några viktiga faktorer att komma ihåg när man använder handelssystem på aktiemarknaderna: 13 Den stora mängden tillgängliga aktier gör det möjligt för aktörer att testa system på många olika typer av aktier - allt från extremt volatila OTC-lager till icke-flyktiga blå marker. Effektiviteten i handelssystemen kan begränsas av vissa aktiers låga likviditet, särskilt OTC - och rosa arkproblem. Provisioner kan äta i vinster som genereras av framgångsrika affärer och kan öka förlusterna. OTC - och rosa arkaktier uppstår ofta extra provisionskostnader. De viktigaste handelssystemen är de som söker värde - det vill säga system som använder olika parametrar för att avgöra om en säkerhet är undervärderad jämfört med tidigare prestanda, dess jämställdhetsgrupper eller marknaden i allmänhet. Valutamarknader Valutamarknaden eller valutakurser. är den största och mest likvida marknaden i världen. Världens regeringar, banker och andra stora institutioner handlar med tusen dollar på valutamarknaden varje dag. Majoriteten av institutionella handlare på valutan är beroende av handelssystem. Detsamma gäller för individer i valutan, 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 på valutamarknaden: Likviditeten på denna marknad - på grund av den stora volymen - gör handelssystemen mer exakta och effektiva. Det finns inga provisioner på denna marknad, bara sprider sig. Därför är det mycket lättare att göra många transaktioner utan att öka kostnaderna. Jämfört med mängden aktier eller råvaror som är tillgängliga är antalet valutor att handla begränsat. 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åvarumarknader erbjuder alla futureshandel. Detta är ett populärt fordon för systemhandel på grund av den högre hävstångseffekten som finns och ökad likviditet och volatilitet. Men dessa faktorer kan skära båda sätten: de kan antingen förstärka dina vinster eller förstärka dina förluster. Av denna anledning är användningen av terminer vanligtvis reserverad för avancerade enskilda och institutionella systemhandlare. Detta 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 den enskilda investeraren 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. Men forex anses allmänt vara överlägsen plattform för att driva handelssystem - särskilt bland mer erfarna handlare. Om en näringsidkare bestämmer sig för att kapitalisera på ökad hävstångseffekt och volatilitet är framtidsalternativet alltid öppet. I slutändan ligger valet i systemutvecklarens händer. Typ av Trading Systems Trend-Following Systems Den vanligaste metoden för systemhandel är det trend-efterföljande systemet. I sin mest grundläggande form väntar detta system helt enkelt på en betydande prisrörelse, då köper eller säljs i den riktningen. Denna typ av system bankar på hoppet att dessa prisrörelser kommer att behålla trenden. Flytta genomsnittliga system Används ofta i teknisk analys. ett glidande medelvärde är en indikator som helt enkelt visar genomsnittspriset på ett lager över en tidsperiod. Kärnan i trender är härledd från denna mätning. Det vanligaste sättet att bestämma inresa och utresa är en crossover. Logiken bakom detta är enkel: en ny trend är etablerad när priset faller över eller under det historiska prisgenomsnittet (trend). Här är ett diagram som visar både priset (blå linje) och IBMs 20-dagars röda linje: Breakout Systems Det grundläggande konceptet bakom denna typ av system liknar det för ett glidande genomsnittssystem. Tanken är att när en ny hög eller låg är etablerad, är prisrörelsen sannolikt att fortsätta i riktning mot breakouten. En indikator som kan användas vid bestämning av breakouts är ett enkelt Bollinger Band-överlägg. Bollinger Bands visar medelvärden av höga och låga priser, och breakouts uppstår när priset möter bandets kanter. Här är ett diagram som prissätter pris (blå linje) och Bollinger Bands (gråa linjer) i Microsoft: Nackdelar med Trend-Following Systems: Empirisk beslutsfattande krävs - 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 brytningssystemen. Lagging Nature - Flyttande medelvärden och breakout-system kommer alltid att ligga kvar. Med andra ord kan de aldrig träffa den exakta toppen eller botten av en trend. Detta leder oundvikligen till förverkande av potentiella vinster, vilket ibland kan vara betydande. Whipsaw Effect - Bland de marknadskrafter som är skadliga för framgången med trend-följande system är detta en av de vanligaste. Whipsaw-effekten uppträder 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 riktningen. Detta kan leda till stora förluster om inte effektiva stoppförluster och riskhanteringstekniker används. Sideways Markets - Trend-efter-system är av naturen kapabla att tjäna pengar bara på marknader som faktiskt tränar. Marknaderna rör sig emellertid också i sidled. stanna inom ett visst område under en längre tid. Extreme Volatility May Occur - Ibland kan trend-efterföljande system uppleva viss extrem volatilitet, men näringsidkaren måste hålla sig i sitt system. Oförmågan att göra det kommer att leda till ett försäkrat 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 motverkningssystemet inte är självkorrigerande. Det är med andra ord ingen bestämd tid för att gå ur positioner, vilket leder till en obegränsad nackdel. Typer av motverkningssystem Många olika typer av system betraktas som motströmsystem. Tanken här är att köpa när momentum i en riktning börjar blekna. Detta beräknas oftast med hjälp av oscillatorer. Till exempel kan en signal genereras när stokastik eller andra relativa hållfasthetsindikatorer 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 att motverka följande system: E mpirisk beslutsfattande krävs - Till exempel, en av de faktorer som systemutvecklaren måste bestämma är punkterna där relativa styrindikatorer bleknade. 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 denna volatilitet kommer att leda till ett försäkrat misslyckande. Obegränsad nackdel - Som tidigare nämnts finns det obegränsad nackdel, eftersom systemet inte är självkorrigerande (det finns ingen tid för att avsluta positioner). Slutsats De viktigaste marknaderna för vilka handelssystemen är lämpliga är aktie-, valutamarknaden och valutamarknaden. Var och en av dessa marknader har sina fördelar och nackdelar. De två viktigaste genren av handelssystem är trend-following och countertrend-systemen. Trots deras skillnader kräver båda typerna av system i utvecklingsstadiet empirisk beslutsfattande från utvecklarens sida. Även dessa system är föremål för extrem volatilitet och det kan kräva lite uthållighet - det är viktigt att systemhandlaren håller fast vid sitt system under dessa tider. I den följande avdelningen, ta en närmare titt på hur man utformar ett handelssystem och diskutera några av programvaran som systemhandlare använder för att göra sina liv enklare. Trading Systems: Design Your System - Del 2Messaging Patterns 187 Integrationsmönster i praktiken 187 Fallstudie: 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, också svårt att förstå. Ibland är det bästa för att förstå mönster 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. I det här kapitlet tillämpas mönster för att lösa problem med en upptäcktsprocess. Det system vi kommer att diskutera är ett obligationshandelssystem 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. Detta innebär beslutsprocessen för att välja ett mönster, samt hur man kombinerar och anpassar mönster för att passa systemets behov. Och allt detta görs med hänsyn till krafterna i reala system, inklusive affärsbehov, kundbeslut, arkitektoniska och tekniska krav, samt äldre systemintegration. Syftet med detta tillvägagångssätt är att ge en tydligare förståelse för mönstren själva genom praktisk tillämpning. Bygga ett system En stor Wall Street investeringsbank utser att bygga ett obligationsprissättningssystem i ett försök att effektivisera arbetsflödet i 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 sina obligationer i kombination 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åflöde ser ut så här: Först kommer marknadsdata i systemet. Marknadsdata är uppgifter om pris och andra egenskaper hos obligationen som representerar vad folk är villiga att köpa och sälja obligationen för på den fria marknaden. Marknadsdata skickas omedelbart till analysmotorn som ändrar data. Analytics avser matematiska funktioner för finansiella applikationer som förändrar priser och andra attribut på obligationer. Dessa är generiska funktioner som använder inmatningsvariabler för att skräddarsy resultaten av funktionen till ett visst bindning. Klientprogrammet som kommer att köras på varje traderbordsskrivare konfigurerar analysmotorn på en näringsidkare basis och kontrollerar specifika uppgifterna för analysen för varje obligation som näringsidkaren prissätter. När analyserna 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 problem som vi möter under designprocessen. Låt oss ta en titt på vad vi vet hittills. Traders behöver en mycket lyhörd applikation på både Windows NT och 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 använda. Marknadsdata komponenterna kommunicerar med TIBCO Information Bus (TIB) messaging infrastruktur. Vi ärverar följande komponenter: Market Data Price Feed Server. Publicerar inkommande marknadsdata till TIB. Analytics Engine. Utför analys på inkommande marknadsdata och sänder de modifierade marknadsdata till TIB. Bidragsserver. Utför all kommunikation med handelsplatser. Handelsplatserna är komponenter från tredje part som inte kontrolleras av banken. Vi måste bestämma hur separata delsystem (Java tjock klient, marknadsdata och bidrag) kommer att kommunicera. Vi kunde få den tjocka klienten att kommunicera direkt med de gamla servrarna, men det skulle kräva för mycket affärslogik på klienten. Bygg i stället ett par Java-gatewayar för att kommunicera med de gamla servrarna. Prissättning Gateway för marknadsdata En Bidrags Gateway för att skicka priser till handelsplatser. Detta kommer att uppnå en bra inkapsling av affärslogiken relaterad till dessa områden. De nuvarande komponenterna i systemet visas nedan. Anslutningarna markerade som. ange att vi fortfarande är osäkra hur några av komponenterna 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 den här boken: Filöverföring. Delad databas. Remote Procedure Invocation. 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. Filöverföring kan på samma sätt uteslutas eftersom minimal latens krävs för att se till 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. Integration av RPC-stil kan uppnås med hjälp av Remote Method Invocation (RMI), CORBA eller Enterprise Java Beans (EJB). Java Messaging Service (JMS) är det gemensamma API för meddelandeformatintegration. Så båda integrationsstilarna är lätta att implementera i Java. Så vilket kommer att fungera bättre för detta projekt, Remote Procedure Invocation eller Messaging. Det finns bara en förekomst av prissättningsporten och en instans av Contribution Gateway i systemet, men oftast ansluter många Thick Clients till dessa tjänster (en för varje obligationshandlare som råkar vara inloggad vid en viss tidpunkt). Vidare vill banken att detta är ett generellt prissystem som kan användas i andra applikationer. Så förutom ett okänt antal Think Clients kan det finnas ett okänt antal andra applikationer med hjälp av 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 och åberopa bearbetning. Däremot kommer prisuppgifterna ständigt att publiceras, och vissa kunder är bara intresserade av vissa uppgifter, så det kan vara svårt att få relevanta uppgifter till rätt kunder i tid. Klienterna kunde kolla Gateways, men det kommer att skapa en hel del overhead. Det skulle vara bättre för Gateways att göra data tillgängliga för kunderna så snart det är tillgängligt. Detta 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 speciell data då när en ny bit data blir tillgänglig (vilket 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 klienten. Helst bör alla kunder meddelas samtidigt, så varje RPC måste göras i sin egen samtidiga tråd. Detta kan fungera, men blir väldigt komplicerat mycket snabbt. Meddelanden förenklar det här problemet mycket. Med Meddelanden. Vi kan definiera separata kanaler för olika typer av prisuppgifter. Då, när en Gateway får en ny data, lägger den till ett meddelande som innehåller den data till Public-Subscribe Channel för den datatypen. Under tiden kommer alla kunder intresserade av en viss typ av data att lyssna på kanalen för den typen. På så sätt kan Gateways enkelt skicka ut nya data till vem som helst ä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 också. Eftersom det bara finns två Gateways, och klienten kan förmodligen blockera medan metoden är påkallad synkront, kan dessa klient-till-gateway-invokationer ganska enkelt implementeras med hjälp av RPC. Men eftersom vi redan använder meddelanden för gateway-till-klientkommunikation är meddelanden förmodligen lika bra för att implementera Client-to-Gateway-kommunikation också. Därför kommer all kommunikation mellan Gateways och klienterna att uppnås genom meddelanden. Eftersom alla komponenter är skrivna i Java, presenterar JMS ett enkelt val för meddelandesystemet. Detta 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 liten eller ingen förändringar i meddelandets infrastruktur. På så sätt kan affärsfunktionaliteten i applikationen enkelt användas av annan applikation som banken utvecklar. Java-komponenter Kommunicera med JMS JMS är helt enkelt en specifikation och vi måste bestämma oss för 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 en stödinfrastruktur på plats och en webbplatslicens för produkten. Nästa fråga är hur du kopplar MQSeries meddelandesystem med den fristående C-bidragsservern och de TIBCO-baserade marknadsdata - och analysmotorservrarna. Vi behöver ett sätt för MQSeries konsumenter att få tillgång till TIB-meddelandena. 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 Message Translator. använda det skulle offra JMS server oberoende. Och även om TIBCO har ett Java API, har kundarkitekten och chefen avvisat den. Som ett resultat måste inställningen för meddelande översättare överges. Broen från TIB-servern till MQSeries-servern kräver kommunikation mellan C och Java. Vi kan använda CORBA, men hur är det med meddelandet? En närmare titt på Message Translator-mönstret visar att den är relaterad till kanaladaptern vid användningen av kommunikationsprotokoll. Hjärtat i en kanaladapter ä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 här är precis vad vi gör med den extra komplexiteten hos den språket Java-C-kommunikation inom språket. Vi kan implementera meddelandebroen på tvärspråk med hjälp av en kombination av kanaladapter s och CORBA. Vi ska bygga två lätta kanaladapter servrar, en i C hantera 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, kommer vi att använda CORBA snarare än JNI eftersom det är en företagsstandard. Meddelandebroen implementerar den effektivt simulerade budskapsöversättningen mellan till synes inkompatibla meddelandesystem och olika språk. Meddelande Översättare med Kanal Adaptrar Nästa diagram visar den aktuella systemdesignen 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 ett annat mönster. Dessutom ändrade vi kanaladapterns sammanhang för att länka två meddelandesystem med ett icke-meddelande språköverföringsprotokoll snarare än att ansluta ett meddelandesystem till ett icke-meddelandesystem. Det nuvarande systemet med kanaladaptrarna Strukturerade kanaler En nyckel för att arbeta med mönster är inte bara att veta när man ska använda vilket mönster, utan också hur man använder det mest effektivt. 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 analysmotorn. Realtidsmarknadsdata härstammar från marknadsdata, en C-server som sänder marknadsdata på TIB. Marknadsdataflödet använder en separat Public-Subscribe-kanal för varje obligation som publiceras för. Det kan tyckas lite extremt eftersom 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. Snarare refereras kanaler av en hierarkisk uppsättning av ämnesnamn som kallas ämnen. TIBCO-servern filtrerar sedan ett enda meddelandeflöde per ämne, och 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 ett meddelandefilter eller selektiv konsument för att filtrera hela dataflödet för intressanta obligationspriser och bestämmer om varje meddelande bör behandlas som det är mottaget. Med tanke på att marknadsdata publiceras på obligatoriska kanaler kan abonnenter registrera sig för uppdateringar på en serie obligationer. Detta tillåter effektivt abonnenter att filtrera genom att selektivt abonnera på kanaler och endast mottaga uppdateringar av intresse snarare än att bestämma efter att meddelandet har tagits emot. Det är viktigt att notera att användandet av flera kanaler för att undvika filtrering är en icke-standard användning av meddelandekanaler. Inom ramen för 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 CTIB-server som kommer att modifiera marknadsdata och vidarebefordra den till TIB. Även om det inte ligger inom ramen för vår JavaJMS-utveckling, jobbar vi nära med C-laget för att designa det eftersom vi är den primära kunden för analyticsmotorer. Problemet för hand är att hitta kanalstrukturen som mest effektivt återfördelade de nymodifierade marknadsdata. Eftersom vi redan har en dedikerad meddelandekanal per bindning som ärverts från marknadsdataprismatningen, skulle det vara logiskt att ändra marknadsdata och omfördela den modifierade marknadsdata på den obligatoriska meddelandekanalen. Men det här kommer inte fungera eftersom analysen ändrar obligationerna priserna är näringsidkare specifika. Om vi ​​omfördelade de ändrade data på obligationsmeddelandekanalen. Vi kommer att förstöra dataintegriteten genom att ersätta generiska marknadsdata med näringsidkars specifika data. Å andra sidan kan vi ha en annan meddelandetyp för näringsidkarspecifika marknadsdata som vi publicerar på samma kanal, så att abonnenterna kan bestämma vilket meddelande de är intresserade av för att undvika att förstöra dataintegriteten. Men då måste klienterna genomföra sina egna filter för att skilja ut meddelanden för andra handlare. Dessutom kommer det att bli en väsentlig ökning av meddelanden som mottagits av abonnenter, vilket innebär en onödig börda för dem. Det finns två alternativ: En kanal per handlare: Varje handlare har en angiven kanal för den modifierade marknadsdata. På så sätt förblir de ursprungliga marknadsuppgifterna intakta och varje näringsansökan kan lyssna på sin specifika återförsäljare Message Channel för de modifierade prisuppdateringarna. En kanal per näringsidkare per obligation: Skapa en meddelandekanal per-näringsidkare per bindning enbart för den modifierade marknadsdata för det obligationen. Marknadsdata för obligationer ABC skulle till exempel publiceras på kanalen Bond ABC medan den modifierade marknadsdata för näringsidkare A skulle publiceras på Message Channel Trader A, Bond ABC, modifierad marknadsdata för näringsidkare B på Trader B, Bond ABC och så vidare. En kanal per näringsidkare En kanal per obligation per näringsidkare Det finns fördelar och nackdelar för varje tillvägagångssätt. Tillvägagångssättet per bindning, till exempel, använder mycket mer Message Channel. I värsta fallet kommer antalet meddelandekanaler att vara antalet obligationer totalt multiplicerat med antalet handlare. Vi kan sätta gränser på antalet kanaler som kommer att skapas eftersom vi vet att det bara finns cirka 20 handlare och de prissätter aldrig mer än ett par hundra obligationer. Detta sätter den övre gränsen under 10 000-serien, vilket inte är så outlandish jämfört med den nästan 100 000 meddelandekanalen som marknadsdataprismatningen använder. Eftersom vi använder TIB och Message Channel, är det också ganska billigt att antalet meddelandekanal s inte är en allvarlig fråga. Å andra sidan kan det stora antalet Message Channel s vara ett problem från ett ledningsperspektiv. Varje gång ett band läggs till måste en kanal för varje näringsidkare bibehållas. Detta kan vara svårt i ett mycket dynamiskt system. Vårt system är dock väsentligen statiskt. Det har också en infrastruktur för att automatiskt hantera meddelandekanal s. Detta kombineras med den arvade arkitekturen hos en äldre komponent med ett liknande tillvägagångssätt minimerar nackdelen. Detta betyder inte att vi ska göra ett onödigt stort antal meddelandekanaler s. Snarare kan vi genomföra ett arkitektoniskt tillvägagångssätt som använder ett stort antal Message Channel s när det finns anledning. Och det finns en anledning i detta fall som kommer ner till logikens läge. Om vi ​​implementerar per näringsidkarbeteende behöver Analytics Engine logik för att gruppera inmatnings - och utmatningskanaler. Detta beror på att ingångskanalerna från Analytics-motorn är per bindning och utmatningskommunikationskanalen s skulle vara per näringsidkare och kräver att Analytics-motorn strömmar all analysinmatning från flera obligationer för en viss näringsidkare till en näringsidkarspecifik utmatningskommunikationskanal. Detta gör att analysmotorn effektivt blir till en innehållsbaserad router för att implementera anpassad routinglogik för vår applikation. Efter Message Bus-strukturen är Analytics Engine en generisk server som kan användas av flera andra system i. Så vi vill inte molna det med systemspecifik funktionalitet. Å andra sidan fungerar per-bond-tillvägagångssättet eftersom idén om en näringsidkare som äger analystillgången i obligationspriserna är en företagsacceptad praxis. Per-bond-tillvägagångssättet håller meddelandekanalseparationen av marknadsdataflödet intakt, samtidigt som flera adderingskanaler sätts till. Innan vi når kunden vill vi ha en innehållsbaserad router för att kombinera dessa flera kanaler till ett hanterbart antal kanaler. Vi vill inte att klientprogrammet körs på handlarens skrivbord för att lyssna på tusentals eller tiotusentals Message Channel s. Nu blir frågan var man ska sätta innehållsbaserad router. Vi kan helt enkelt få CTIB-kanaladaptern att vidarebefordra alla meddelanden till prissättningsparoten på en enda meddelandekanal. Det här är dåligt av två anledningar att vi skulle dela upp affärslogiken mellan C och Java och vi skulle förlora fördelen med den separata Message Channel s på TIB-sidan, så att vi undviker filtrering senare i dataflödet. Om vi ​​tittar på våra Java-komponenter kan vi antingen placera den i prissättningspartongen eller skapa en mellanliggande komponent mellan prissättningspartén och klienten. I teorin, om vi fortsatte den obligationsbaserade avskiljningen av Message Channel s hela vägen till klienten, skulle prissättning Gateway återupplösta prisinformation med samma kanalstruktur som Pricing Gateway och Analytics Engine. Detta innebär en dubblering av alla obligatoriska TIB-kanaler i JMS. Även om vi skapar en mellanliggande komponent mellan prissättningspartén och klienten, måste prissättningsporten fortfarande duplicera alla kanaler i JMS. Å andra sidan tillåter implementeringslogiken direkt i prissättningsporten att vi undviker att duplicera det stora antalet kanaler i JMS, vilket gör att vi kan skapa ett mycket mindre antal kanaler i storleksordningen av en per näringsidkare. Prissättningsporten registrerar sig via CTIB-kanaladaptern som konsument för varje bindning av varje näringsidkare i systemet. Då prissätter Gateway varje vidare klient endast meddelanden som är relaterade till den aktuella näringsidkaren. På detta sätt använder vi endast ett litet antal meddelandekanal s på JMS-änden, samtidigt som vi maximerar fördelarna med separationen på TIB-änden. Den fullständiga marknadsdataflödet till kunden Meddelandekanalens layoutdiskussion är ett bra exempel på hur integrering av mönster är viktigt. Målet här var att ta reda på hur man effektivt använder Message Channel s. Att säga att du använder ett mönster är inte tillräckligt. Du måste räkna ut hur du bäst implementerar det och införlivar i ditt system för att lösa problemen vid handen. Dessutom visar detta exempel företagskrafter i åtgärd. Om vi ​​skulle kunna genomföra affärslogik i någon av våra komponenter kunde vi ha gått med per näringsidkare och implementera ett övergripande enklare tillvägagångssätt med många mindre kanaler. Välja en meddelandekanal Nu när vi känner till kommunikationsmekanismerna mellan JavaJMS-komponenterna och C TIBCO-komponenterna, och vi har sett en del meddelandekanalstrukturering, måste vi bestämma vilken typ av JMS-meddelandekanal som Java-komponenterna ska använda för att kommunicera . Innan vi kan välja mellan de olika meddelandekanalerna som finns i JMS, kan vi titta på systemets höga meddelandeflöde. Vi har två gateways (Pricing and Contribution) kommunicera med kunden. Marknadsdata strömmar till klienten från prissättningsporten som skickar ut den till bidragsporten. Klientapplikationen skickar meddelande till prissättningsporten för att ändra analysen som tillämpas på varje bindning. 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 SystemI am in the process of designing a trading application which will use a Markets API to place orders on the Market. This isnt a complex high performance algorithmic trading application of the kind found in investment banks. This is just a small personal application which will trade maybe two or three times a day depending on market conditionstrends The application will consist (roughly) of the following modulespackages: Strategies - The actual trading algorithms Analytics - The classes for analysing the live prices amp orders on the market to produce buysell signals Services - The classes used to maintain a connection to the market, retrieve market information and place buysell orders. So far, everything required for the application seems to be available on the internet: Apache CXF for generating the Java classes used for accessing the markets web services. Apache Maths for the performing the pricing analytics Wikipedia for the various design patterns i. e. Factory, SubjectObserver, State, etc. Where Im really stuck however is with the algorithms. Ive decided to use the State pattern to partition, into logical groupings, the various pieces of logic which should be performed when certain market conditions are met. The problem is that Im beginning to see that it is very likely that each state class will contain an explosion of if else statements: I cant help but feel Im missing something here and that there must exist some framework or design pattern I dont know about which enables the developer to encapsulate all the inputs and outputs of a given business context into a finite number of business actions inputoutput on which business rulesalgorithms can be built. Dvs. Rather than having to hardcode the algorithms Im hoping that it should be possible to make the application into a rules processor of some sort. Unfortunately I dont know where to start on this. I hope Ive explained my dilema clearly enough, if you would like me to clarify anything please let me know. Thank you asked Oct 8 09 at 22:48

No comments:

Post a Comment