package Ġcom . art em k ax boy . tel er est . service Ċ Ċ import Ġcom . art em k ax boy . tel er est . business . Chart Message Ċ import Ġcom . art em k ax boy . tel er est . entity . LiveData Ċ import Ġcom . art em k ax boy . tel er est . service . storage . Live DataService Ċ import Ġcom . art em k ax boy . tel er est . service . storage . Ticker Service Ċ import Ġcom . art em k ax boy . tel er est . tool . Result Ċ import Ġcom . art em k ax boy . tel er est . tool . extensions . toDate Ċ import Ġorg . jfree . chart . J Free Chart Ċ import Ġorg . jfree . chart . axis . Date Axis Ċ import Ġorg . jfree . chart . axis . Number Axis Ċ import Ġorg . jfree . chart . plot . Combined Domain XY Plot Ċ import Ġorg . jfree . chart . plot . Plot Orientation Ċ import Ġorg . jfree . chart . plot . XY Plot Ċ import Ġorg . jfree . chart . renderer . xy . XY Line And Shape Renderer Ċ import Ġorg . jfree . chart . ui . Rectangle Insets Ċ import Ġorg . jfree . data . time . Day Ċ import Ġorg . jfree . data . time . TimeSeries Ċ import Ġorg . jfree . data . time . TimeSeries Collection Ċ import Ġorg . jfree . data . xy . XY Dataset Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . awt . Basic Stroke Ċ import Ġjava . awt . Color Ċ import Ġjava . time . LocalDate Ċ import Ġkotlin . math . PI Ċ Ċ private Ġconst Ġval ĠCH ART _ GRID _ COLOR Ġ= Ġ 0 xcc cccc Ċ private Ġconst Ġval ĠCH ART _ BACKGROUND _ COLOR Ġ= Ġ 0 xffffff Ċ Ċ private Ġconst Ġval ĠPR ICE _ COLOR Ġ= Ġ 0 xff 0 0 0 0 Ċ private Ġconst Ġval ĠPR ICE _ ST RO KE Ġ= Ġ 3 . 0 f Ċ private Ġconst Ġval ĠPR ICE _ LEG END Ġ= Ġ" price " Ċ Ċ private Ġconst Ġval ĠFORE CAST _ COLOR Ġ= Ġ 0 x 0 0 0 0 ff Ċ private Ġconst Ġval ĠFORE CAST _ ST RO KE Ġ= Ġ 2 . 0 f Ċ private Ġconst Ġval ĠFORE CAST _ LEG END Ġ= Ġ" forecast " Ċ Ċ private Ġconst Ġval ĠP OT ENTIAL _ COLOR Ġ= Ġ 0 xf 4 b 4 0 d Ċ private Ġconst Ġval ĠP OT ENTIAL _ ST RO KE Ġ= Ġ 3 . 0 f Ċ private Ġconst Ġval ĠP OT ENTIAL _ LEG END Ġ= Ġ" potential " Ċ Ċ private Ġconst Ġval ĠDEFAULT _ HISTORY _ DAYS Ġ= Ġ 1 0 0 Ċ Ċ private Ġconst Ġval ĠCH ART S _ GAP Ġ= Ġ 1 0 . 0 Ċ private Ġconst Ġval ĠMAIN _ CH ART _ WEIGHT Ġ= Ġ 3 Ċ private Ġconst Ġval ĠSE COND ARY _ CH ART _ WEIGHT Ġ= Ġ 2 Ċ Ċ private Ġconst Ġval ĠCH ART _ HEIGHT Ġ= Ġ 3 0 0 Ċ private Ġconst Ġval ĠCH ART _ WIDTH Ġ= Ġ 6 0 0 Ċ Ċ @ Service Ċ class ĠChart Service ( ĊĠĠĠ Ġprivate Ġval Ġlive DataService : ĠLive DataService , ĊĠĠĠ Ġprivate Ġval Ġticker Service : ĠT icker Service Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdate Axis Ġ= ĠDate Axis () ĊĊĠĠĠ Ġfun Ġget Chart Message ( ticker : ĠString ? Ġ= Ġnull , Ġtoday Data : ĠLive Data ? Ġ= Ġnull ): ĠResult < Chart Message > Ġ= ĠResult . of Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresolved Ticker Ġ= Ġtoday Data ?. ticker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġticker ?. let Ġ{ Ġticker Service . findById ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠResult . failure (" Ticker Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= Ġfetch LiveData History ( resolved Ticker . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġadd Ġthe Ġlatest Ġtick Ġinstead Ġof Ġlast Ġsaved Ġin ĠDB Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġhistory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoday Data ?. let Ġ{ Ġhistory . drop Last ( 1 ) Ġ+ Ġit Ġ} Ġ?: Ġhistory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdatasets Ġ= Ġgenerate Chart Data Collections ( live Data ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprice And Forecast Xy Plot Ġ= Ġgenerate Ticker Price And Forecast Xy Plot ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaxis Label Ġ= Ġresolved Ticker . getC urrency Sign (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdataset Ġ= Ġdatasets . values ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpotential Xy Plot Ġ= Ġgenerate Ticker Potential Xy Plot ( datasets . potential ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcombined Plot Ġ= Ġgenerate Combined Xy Plot ( price And Forecast Xy Plot , Ġpotential Xy Plot ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchart Ġ= Ġgenerate Chart ("${ resolved Ticker . id }: Ġ${ resolved Ticker . name }", Ġcombined Plot ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Pair Ġ= Ġlive Data . take Last ( 2 ) ĊĠĠĠĠĠĠĠ ĠChart Message ( chart , ĠCH ART _ WIDTH , ĠCH ART _ HEIGHT , Ġlast Pair . first OrNull (), Ġlast Pair . last OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch LiveData History ( ticker : ĠString , Ġdays : ĠInt Ġ= ĠDEFAULT _ HISTORY _ DAYS ): ĠList < LiveData > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDate . now () ĊĠĠĠĠĠĠĠ Ġval Ġperiod Start Ġ= Ġnow . minus Days ( days . to Long ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlive DataService . findBy Ticker Id And Date Between OrderBy Date ( ticker , Ġperiod Start , Ġnow ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Chart Data Collections ( data : ĠList < LiveData >): ĠChart Collections Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġprice Ġ= ĠTime Series ( PRICE _ LEG END ) ĊĠĠĠĠĠĠĠ Ġval Ġforecast Ġ= ĠTime Series ( FORE CAST _ LEG END ) ĊĠĠĠĠĠĠĠ Ġval Ġpotential Ġ= ĠTime Series ( P OT ENTIAL _ LEG END ) ĊĊĠĠĠĠĠĠĠ Ġdata . forEach Ġ{ Ġlive Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Ġ= ĠDay ( live Data . date . toDate ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprice . add ( day , Ġlive Data . price ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast . add ( day , Ġlive Data . consensus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpotential . add ( day , Ġlive Data . get Rounded Potential ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠChart Collections ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Series Collection ( price ). apply Ġ{ Ġadd Series ( forecast ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Series Collection ( potential ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Ticker Price And Forecast Xy Plot ( ĊĠĠĠĠĠĠĠ Ġaxis Label : ĠString , ĊĠĠĠĠĠĠĠ Ġdataset : ĠXY Dataset ĊĠĠĠ Ġ): ĠXY Plot Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Axis Ġ= ĠNumber Axis ( axis Label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . auto Range Includes Zero Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . label Angle Ġ= ĠPI Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . label Insets Ġ= ĠRectangle Insets . ZERO _ IN SETS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues Renderer Ġ= ĠXY Line And Shape Renderer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Series Paint ( 0 , ĠColor ( PRICE _ COLOR )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Series Stroke ( 0 , ĠBasic Stroke ( PRICE _ ST RO KE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Series Paint ( 1 , ĠColor ( FORE CAST _ COLOR )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Series Stroke ( 1 , ĠBasic Stroke ( FORE CAST _ ST RO KE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠXY Plot ( dataset , Ġdate Axis , Ġvalues Axis , Ġvalues Renderer ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange Grid line Paint Ġ= ĠColor ( CH ART _ GRID _ COLOR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Grid line Paint Ġ= ĠColor ( CH ART _ GRID _ COLOR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Ticker Potential Xy Plot ( ĊĠĠĠĠĠĠĠ Ġdataset : ĠXY Dataset ĊĠĠĠ Ġ): ĠXY Plot Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpercent Axis Ġ= ĠNumber Axis ("% ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . auto Range Includes Zero Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . label Angle Ġ= ĠPI Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpercent Renderer Ġ= ĠXY Line And Shape Renderer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Series Paint ( 0 , ĠColor ( P OT ENTIAL _ COLOR )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Series Stroke ( 0 , ĠBasic Stroke ( P OT ENTIAL _ ST RO KE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠXY Plot ( dataset , Ġdate Axis , Ġpercent Axis , Ġpercent Renderer ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange Grid line Paint Ġ= ĠColor ( CH ART _ GRID _ COLOR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Grid line Paint Ġ= ĠColor ( CH ART _ GRID _ COLOR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Combined Xy Plot ( ĊĠĠĠĠĠĠĠ Ġmain Plot : ĠXY Plot , ĊĠĠĠĠĠĠĠ Ġsecondary Plot : ĠXY Plot ĊĠĠĠ Ġ) Ġ= ĠCom bined Domain XY Plot ( date Axis ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . gap Ġ= ĠCH ART S _ GAP ĊĠĠĠĠĠĠĠ Ġthis . orientation Ġ= ĠPlot Orientation . VERTICAL ĊĠĠĠĠĠĠĠ Ġthis . add ( main Plot , ĠMAIN _ CH ART _ WEIGHT ) ĊĠĠĠĠĠĠĠ Ġthis . add ( secondary Plot , ĠSE COND ARY _ CH ART _ WEIGHT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Chart ( ĊĠĠĠĠĠĠĠ Ġcaption : ĠString , ĊĠĠĠĠĠĠĠ Ġcombined Plot : ĠCom bined Domain XY Plot ĊĠĠĠ Ġ) Ġ= ĠJ Free Chart ( ĊĠĠĠĠĠĠĠ Ġcaption , ĊĠĠĠĠĠĠĠ ĠJ Free Chart . DEFAULT _ TITLE _ FONT , ĊĠĠĠĠĠĠĠ Ġcombined Plot , ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . background Paint Ġ= ĠColor ( CH ART _ BACKGROUND _ COLOR ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠChart Collections ( val Ġvalues : ĠXY Dataset , Ġval Ġpotential : ĠXY Dataset ) Ċ