package Ġcom . ly k ke . matching . engine . services Ċ Ċ import Ġcom . ly k ke . matching . engine . da os . C andle Ċ import Ġcom . ly k ke . matching . engine . da os . Hour C andle Ċ import Ġcom . ly k ke . matching . engine . da os . Tick Ċ import Ġcom . ly k ke . matching . engine . da os . Trade Info Ċ import Ġcom . ly k ke . matching . engine . database . C andle s Database Accessor Ċ import Ġcom . ly k ke . matching . engine . database . Hours C andle s Database Accessor Ċ import Ġcom . ly k ke . utils . logging . Performance Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Id Ċ import Ġjava . util . Date Ċ import Ġjava . util . HashMap Ċ import Ġjava . util . LinkedList Ċ import Ġjava . util . concurrent . BlockingQueue Ċ import Ġkotlin . concurrent . thread Ċ Ċ class ĠTr ades Info Service ( private Ġval Ġc andle s Database Accessor : ĠC andle s Database Accessor ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġhours C andle s Database Accessor : ĠH ours C andle s Database Accessor ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtrade Info Queue : ĠBlock ing Queue < Trade Info >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġformatter Ġ= ĠSimpleDateFormat (" yyyy MM dd HH mm ") ĊĊĠĠĠ Ġprivate Ġval Ġis C andle s Enabled Ġ= Ġc andle s Database Accessor Ġ!= Ġnull ĊĠĠĠ Ġprivate Ġval Ġc andle s Ġ= ĠHashMap < String , ĠHashMap < String , ĠHashMap < Int , ĠTick >> >() ĊĊĠĠĠ Ġprivate Ġval Ġis Hours C andle s Enabled Ġ= Ġhours C andle s Database Accessor Ġ!= Ġnull ĊĠĠĠ Ġprivate Ġval Ġsaved Hours C andle s Ġ= Ġhours C andle s Database Accessor ?. getHours C andle s () ĊĠĠĠ Ġprivate Ġval Ġhours C andle s Ġ= ĠHashMap < String , ĠBigDecimal >() ĊĊĠĠĠ Ġprivate Ġval Ġbid Ġ= Ġ" Bid " ĊĠĠĠ Ġprivate Ġval Ġask Ġ= Ġ" Ask " ĊĊĠĠĠ Ġprivate Ġval Ġc andle s Performance Logger Ġ= ĠPerformance Logger ( LoggerFactory . getLogger (" history Persist Stats "), Ġ 1 , Ġ" save C andle s : Ġ") ĊĠĠĠ Ġprivate Ġval Ġhour C andle s Performance Logger Ġ= ĠPerformance Logger ( LoggerFactory . getLogger (" history Persist Stats "), Ġ 1 , Ġ" save Hour C andle s : Ġ") ĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġthread ( start Ġ= Ġtrue , Ġname Ġ= ĠTr ades Info Service :: class . java . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess ( trade Info Queue . take ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess ( info : ĠTrade Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is C andle s Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd C andle s ( info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Hours C andle s Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Hours C andle s ( info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd C andle s ( info : ĠTrade Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasset Ġ= Ġ"${ info . asset Pair }_${ if Ġ( info . is Buy ) Ġbid Ġelse Ġask }" ĊĠĠĠĠĠĠĠ Ġval ĠdateTime Ġ= ĠLocalDateTime . of Instant ( info . date . to Instant (), ĠZone Id . of (" UTC ")) ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġformatter . format ( info . date ) ĊĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= ĠdateTime . second ĊĠĠĠĠĠĠĠ Ġsynchronized ( c andle s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġc andle s . get Or Put ( time ) Ġ{ ĠHashMap () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġticks Ġ= Ġmap . get Or Put ( asset ) Ġ{ ĠHashMap () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Tick Ġ= Ġticks [ second ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Tick Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Tick . high Price Ġ< Ġinfo . price ) Ġcur Tick . high Price Ġ= Ġinfo . price ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Tick . low Price Ġ> Ġinfo . price ) Ġcur Tick . low Price Ġ= Ġinfo . price ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Tick . close Price Ġ= Ġinfo . price ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġticks [ second ] Ġ= ĠTick ( info . price , Ġinfo . price , Ġinfo . price , Ġinfo . price ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Hours C andle s ( info : ĠTrade Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . is Buy Ġ|| Ġ! hours C andle s . containsKey ( info . asset Pair )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( hours C andle s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhours C andle s . put ( info . asset Pair , Ġinfo . price ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave C andle s () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is C andle s Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġc andle s Database Accessor !! ĊĊĠĠĠĠĠĠĠ Ġc andle s Performance Logger . start () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġformatter . format ( Date ()) ĊĠĠĠĠĠĠĠ Ġsynchronized ( c andle s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġc andle s . keys . filter Ġ{ Ġit Ġ!= Ġtime Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc andle s Performance Logger . start Persist () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . forEach Ġ{ Ġkey Time Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc andle s [ key Time ]?. forEach Ġ{ Ġasset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc andle s Database Accessor . write C andle ( C andle ( asset . key , Ġkey Time , Ġasset . value . entries . join ToString ("| ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" O =${ it . value . open Price }; C =${ it . value . close Price }; H =${ it . value . high Price }; L =${ it . value . low Price }; T =${ it . key }" Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc andle s . remove ( key Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc andle s Performance Logger . end Persist () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġc andle s Performance Logger . end () ĊĠĠĠĠĠĠĠ Ġc andle s Performance Logger . fix Time () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Hour C andle s () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Hours C andle s Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhours C andle s Database Accessor !! ĊĠĠĠĠĠĠĠ Ġsaved Hours C andle s !! ĊĊĠĠĠĠĠĠĠ Ġhour C andle s Performance Logger . start () ĊĠĠĠĠĠĠĠ Ġsynchronized ( hours C andle s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhours C andle s . keys . forEach Ġ{ Ġasset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhour C andle Ġ= Ġsaved Hours C andle s . find Ġ{ Ġit . asset Ġ== Ġasset Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hour C andle Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhour C andle Ġ= ĠHour C andle ( asset , ĠLinkedList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhour C andle . add Price ( hours C andle s [ asset ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Hours C andle s . add ( hour C andle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhour C andle . add Price ( hours C andle s [ asset ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhours C andle s . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhour C andle s Performance Logger . start Persist () ĊĠĠĠĠĠĠĠ Ġhours C andle s Database Accessor . write Hour C andle s ( saved Hours C andle s ) ĊĠĠĠĠĠĠĠ Ġhour C andle s Performance Logger . end Persist () ĊĠĠĠĠĠĠĠ Ġhour C andle s Performance Logger . end () ĊĠĠĠĠĠĠĠ Ġhour C andle s Performance Logger . fix Time () ĊĠĠĠ Ġ} Ċ }