package Ġcom . sw iss chain . matching . engine . services . utils Ċ Ċ import Ġcom . sw iss chain . matching . engine . da os . Limit Order Ċ import Ġcom . sw iss chain . matching . engine . order . Order Status Ċ import Ġcom . sw iss chain . matching . engine . utils . Number Utils Ċ import Ġorg . slf 4 j . Logger Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util . Date Ċ Ċ class ĠMulti Order Filter ( private Ġval Ġis Trusted Client : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġbase Asset Available Balance : ĠBigDecimal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġqu oting Asset Available Balance : ĠBigDecimal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġqu oting Asset Accuracy : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdate : ĠDate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Capacity : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOGGER : ĠLogger ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġnot Sorted Buy Side Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġnot Sorted Sell Side Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġprev Bid Price : ĠBigDecimal ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġprev Ask Price : ĠBigDecimal ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġused Base Asset Volume Ġ= ĠBigDecimal . ZERO ĊĠĠĠ Ġprivate Ġvar Ġused Qu oting Asset Volume Ġ= ĠBigDecimal . ZERO ĊĠĠĠ Ġprivate Ġval Ġorders Ġ= ĠArrayList < Limit Order >( initial Capacity ) ĊĠĠĠ Ġprivate Ġval Ġrejected Orders Ġ= Ġmutable ListOf < Rejected Order >() ĊĠĠĠ Ġprivate Ġvar Ġdone Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġcheck And Add ( order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Result Ġis Ġalready Ġreturned ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġorders . add ( order ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Trusted Client ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( order . is Buy Side ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Buy Order ( order ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Sell Order ( order ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Result (): ĠList < Limit Order > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck IfNot Sorted () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġorders ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Buy Order ( order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( not Sorted Buy Side ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( prev Bid Price Ġ== Ġnull Ġ|| Ġorder . price Ġ< Ġprev Bid Price ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Bid Price Ġ= Ġorder . price ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Qu oting Asset Volume ( order ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnot Sorted Buy Side Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠLOGGER . debug ("[ ${ order . asset Pair Id }] ĠBu y Ġorders Ġare Ġnot Ġsorted Ġby Ġprice ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Qu oting Asset Volume ( order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqu oting Asset Volume Ġ= ĠNumber Utils . set Scale Round Up ( order . volume Ġ* Ġorder . price , Ġqu oting Asset Accuracy ) ĊĠĠĠĠĠĠĠ Ġif Ġ( used Qu oting Asset Volume Ġ+ Ġqu oting Asset Volume Ġ<= Ġqu oting Asset Available Balance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġused Qu oting Asset Volume Ġ+= Ġqu oting Asset Volume ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrejected Orders . add ( Rejected Order ( order , ĠOrder Status . valueOf ( order . status ))) ĊĠĠĠĠĠĠĠ Ġorder . update Status ( Order Status . Not En ough Funds , Ġdate ) ĊĠĠĠĠĠĠĠ ĠLOGGER . info ("[ ${ order . asset Pair Id }] ĠUnable Ġto Ġadd Ġorder Ġ${ order . volume } Ġ@ Ġ${ order . price } Ġ(${ order . external Id }) Ġdue Ġto Ġlow Ġbalance Ġ( available : Ġ$ quot ing Asset Available Balance , Ġused : Ġ$ used Qu oting Asset Volume )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Sell Order ( order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( not Sorted Sell Side ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( prev Ask Price Ġ== Ġnull Ġ|| Ġorder . price Ġ> Ġprev Ask Price ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ask Price Ġ= Ġorder . price ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Base Asset Volume ( order ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnot Sorted Sell Side Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠLOGGER . debug ("[ ${ order . asset Pair Id }] ĠS ell Ġorders Ġare Ġnot Ġsorted Ġby Ġprice ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Base Asset Volume ( order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvolume Ġ= Ġorder . get Abs Volume () ĊĠĠĠĠĠĠĠ Ġif Ġ( used Base Asset Volume Ġ+ Ġvolume Ġ<= Ġbase Asset Available Balance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġused Base Asset Volume Ġ+= Ġvolume ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrejected Orders . add ( Rejected Order ( order , ĠOrder Status . valueOf ( order . status ))) ĊĠĠĠĠĠĠĠ Ġorder . update Status ( Order Status . Not En ough Funds , Ġdate ) ĊĠĠĠĠĠĠĠ ĠLOGGER . info ("[ ${ order . asset Pair Id }] ĠUnable Ġto Ġadd Ġorder Ġ${ order . volume } Ġ@ Ġ${ order . price } Ġ(${ order . external Id }) Ġdue Ġto Ġlow Ġbalance Ġ( available : Ġ$ base Asset Available Balance , Ġused : Ġ$ used Base Asset Volume )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck IfNot Sorted () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Trusted Client Ġ|| Ġ! not Sorted Sell Side Ġ&& Ġ! not Sorted Buy Side ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrollback Rejection Result () ĊĠĠĠĠĠĠĠ Ġval Ġbuy Orders Ġ= ĠArrayList < Limit Order >() ĊĠĠĠĠĠĠĠ Ġval Ġsell Orders Ġ= ĠArrayList < Limit Order >() ĊĠĠĠĠĠĠĠ Ġorders . forEach Ġ{ Ġorder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( order . is Buy Side ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuy Orders . add ( order ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsell Orders . add ( order ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuy Orders . sortBy Descending Ġ{ Ġit . price Ġ} ĊĠĠĠĠĠĠĠ Ġsell Orders . sortBy Ġ{ Ġit . price Ġ} ĊĠĠĠĠĠĠĠ Ġused Qu oting Asset Volume Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġbuy Orders . forEach Ġ{ Ġorder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Qu oting Asset Volume ( order ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġused Base Asset Volume Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġsell Orders . forEach Ġ{ Ġorder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Base Asset Volume ( order ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrollback Rejection Result () Ġ{ ĊĠĠĠĠĠĠĠ Ġrejected Orders . forEach Ġ{ Ġit . order . update Status ( it . previous Status , Ġdate ) Ġ} ĊĠĠĠĠĠĠĠ Ġrejected Orders . clear () ĊĠĠĠĠĠĠĠ ĠLOGGER . info (" Rol led Ġback Ġrejection Ġresult ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠReject ed Order ( val Ġorder : ĠLimit Order , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Status : ĠOrder Status )