package Ġcom . sw iss chain . matching . engine . services . validators . input . impl Ċ Ċ import Ġcom . sw iss chain . matching . engine . da os . Asset Ċ import Ġcom . sw iss chain . matching . engine . da os . Asset Pair Ċ import Ġcom . sw iss chain . matching . engine . da os . Limit Order Ċ import Ġcom . sw iss chain . matching . engine . da os . context . Single Limit Order Context Ċ import Ġcom . sw iss chain . matching . engine . fee . check Fee Ċ import Ġcom . sw iss chain . matching . engine . holders . Application Settings Holder Ċ import Ġcom . sw iss chain . matching . engine . incoming . parsers . data . Single Limit Order Parsed Data Ċ import Ġcom . sw iss chain . matching . engine . order . Order Status Ċ import Ġcom . sw iss chain . matching . engine . order . process . context . Stop Limit Order Context Ċ import Ġcom . sw iss chain . matching . engine . services . validators . common . Order Validation Utils Ċ import Ġcom . sw iss chain . matching . engine . services . validators . impl . Order ValidationException Ċ import Ġcom . sw iss chain . matching . engine . services . validators . input . Limit Order Input Validator Ċ import Ġcom . sw iss chain . matching . engine . utils . Number Utils Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . math . BigDecimal Ċ Ċ @ Component Ċ class ĠLimit Order Input Validator Impl ( val Ġapplication Settings Holder : ĠApplication Settings Holder ) Ġ: ĠLimit Order Input Validator Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvalidate Limit Order ( single Limit Order Parsed Data : ĠSingle Limit Order Parsed Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsingle Limit Context Ġ= Ġsingle Limit Order Parsed Data . message Wrapper . context Ġas ĠSingle Limit Order Context ĊĊĠĠĠĠĠĠĠ Ġvalidate Limit Order ( single Limit Context . is Trusted Client , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Limit Context . limit Order , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Limit Context . asset Pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Limit Order Parsed Data . input Asset Pair Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Limit Context . base Asset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate Limit Order ( is Trusted Client : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder : ĠLimit Order , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Pair : ĠAsset Pair ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Pair Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Asset : ĠAsset ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Trusted Client ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Fee ( order ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalidate Asset ( asset Pair , Ġasset Pair Id ) ĊĠĠĠĠĠĠĠ Ġvalidate Price ( order ) ĊĠĠĠĠĠĠĠ Ġvalidate Volume ( order , Ġasset Pair !! ) ĊĠĠĠĠĠĠĠ Ġvalidate MaxValue ( order , Ġasset Pair ) ĊĠĠĠĠĠĠĠ Ġvalidate Price Accuracy ( order , Ġasset Pair ) ĊĠĠĠĠĠĠĠ Ġvalidate Volume Accuracy ( order , Ġbase Asset !! ) ĊĠĠĠĠĠĠĠ Ġvalidate Value ( order , Ġasset Pair ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate Stop Order ( single Limit Order Parsed Data : ĠSingle Limit Order Parsed Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsingle Limit Context Ġ= Ġsingle Limit Order Parsed Data . message Wrapper . context Ġas ĠSingle Limit Order Context ĊĠĠĠĠĠĠĠ Ġval Ġlimit Order Ġ= Ġsingle Limit Context . limit Order ĊĠĠĠĠĠĠĠ Ġval Ġasset Pair Ġ= Ġsingle Limit Context . asset Pair ĊĠĠĠĠĠĠĠ Ġvalidate Stop Order ( limit Order , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Limit Order Parsed Data . input Asset Pair Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Limit Context . base Asset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate Stop Order ( stop Limit Order Context : ĠStop Limit Order Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasset Pair Ġ= Ġstop Limit Order Context . executionContext . asset Pairs ById [ stop Limit Order Context . order . asset Pair Id ] ĊĠĠĠĠĠĠĠ Ġval Ġbase Asset Ġ= Ġasset Pair ?. let Ġ{ Ġstop Limit Order Context . executionContext . assets ById [ asset Pair . base Asset Id ] Ġ} ĊĠĠĠĠĠĠĠ Ġvalidate Stop Order ( stop Limit Order Context . order , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Limit Order Context . order . asset Pair Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Asset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Stop Order ( limit Order : ĠLimit Order , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Pair : ĠAsset Pair ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Pair Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Asset : ĠAsset ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Asset ( asset Pair , Ġasset Pair Id ) ĊĠĠĠĠĠĠĠ Ġvalidate Fee ( limit Order ) ĊĠĠĠĠĠĠĠ Ġvalidate Limit Prices ( limit Order ) ĊĠĠĠĠĠĠĠ Ġvalidate Volume ( limit Order , Ġasset Pair !! ) ĊĠĠĠĠĠĠĠ Ġvalidate Stop Order MaxValue ( limit Order , Ġasset Pair ) ĊĠĠĠĠĠĠĠ Ġvalidate Volume Accuracy ( limit Order , Ġbase Asset !! ) ĊĠĠĠĠĠĠĠ Ġvalidate Stop Prices Accuracy ( limit Order , Ġasset Pair ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Asset ( asset Pair : ĠAsset Pair ?, Ġasset Pair Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( asset Pair Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Unknown Asset , Ġ" Unable Ġto Ġfind Ġasset Ġpair Ġ$ asset Pair Id ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( application Settings Holder . is Asset Disabled ( asset Pair . base Asset Id ) Ġ|| Ġapplication Settings Holder . is Asset Disabled ( asset Pair . quot ing Asset Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Disabled Asset , Ġ" disabled Ġasset ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Fee ( order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! check Fee ( order . fees )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Fee , Ġ" has Ġinvalid Ġfee ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Price ( limit Order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( limit Order . price Ġ<= ĠBigDecimal . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Price , Ġ" price Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Limit Prices ( order : ĠLimit Order ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(( order . lower Limit Price Ġ== Ġnull Ġ&& Ġorder . lower Price Ġ== Ġnull Ġ&& Ġorder . upper Limit Price Ġ== Ġnull Ġ&& Ġorder . upper Price Ġ== Ġnull ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( order . lower Limit Price Ġ== Ġnull ). xor ( order . lower Price Ġ== Ġnull )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( order . upper Limit Price Ġ== Ġnull ). xor ( order . upper Price Ġ== Ġnull )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( order . lower Limit Price Ġ!= Ġnull Ġ&& Ġ( order . lower Limit Price Ġ<= ĠBigDecimal . ZERO Ġ|| Ġorder . lower Price !! Ġ<= ĠBigDecimal . ZERO )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( order . upper Limit Price Ġ!= Ġnull Ġ&& Ġ( order . upper Limit Price Ġ<= ĠBigDecimal . ZERO Ġ|| Ġorder . upper Price !! Ġ<= ĠBigDecimal . ZERO )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( order . lower Limit Price Ġ!= Ġnull Ġ&& Ġorder . upper Limit Price Ġ!= Ġnull Ġ&& Ġorder . lower Limit Price Ġ>= Ġorder . upper Limit Price )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Price , Ġ" limit Ġprices Ġare Ġinvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Value ( order : ĠLimit Order , Ġasset Pair : ĠAsset Pair ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( order . get Abs Volume () Ġ* Ġorder . price Ġ> Ġasset Pair . max Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Value , Ġ" value Ġis Ġtoo Ġlarge ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate MaxValue ( limit Order : ĠLimit Order , Ġasset Pair : ĠAsset Pair ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( limit Order . get Abs Volume () Ġ> Ġasset Pair . max Volume ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Volume , Ġ" volume Ġis Ġtoo Ġlarge ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Stop Order MaxValue ( limit Order : ĠLimit Order , Ġasset Pair : ĠAsset Pair ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate MaxValue ( limit Order , Ġasset Pair ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( limit Order . lower Limit Price Ġ!= Ġnull Ġ&& Ġlimit Order . get Abs Volume () Ġ* Ġlimit Order . lower Price !! Ġ> Ġasset Pair . max Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlimit Order . upper Limit Price Ġ!= Ġnull Ġ&& Ġlimit Order . get Abs Volume () Ġ* Ġlimit Order . upper Price !! Ġ> Ġasset Pair . max Value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Value , Ġ" value Ġis Ġtoo Ġlarge ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Volume ( limit Order : ĠLimit Order , Ġasset Pair : ĠAsset Pair ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Number Utils . equals Ignore Scale ( BigDecimal . ZERO , Ġlimit Order . volume )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Volume , Ġ" volume Ġcan Ġnot Ġbe Ġequal Ġto Ġzero ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Order Validation Utils . check Min Volume ( limit Order , Ġasset Pair )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Too Small Volume , Ġ" volume Ġis Ġtoo Ġsmall ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Volume Accuracy ( limit Order : ĠLimit Order , Ġbase Asset : ĠAsset ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Asset Accuracy Ġ= Ġbase Asset . accuracy ĊĊĠĠĠĠĠĠĠ Ġval Ġvolume Accuracy Valid Ġ= ĠNumber Utils . is Scale Small er OrEqual ( limit Order . volume , Ġbase Asset Accuracy ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! volume Accuracy Valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Volume Accuracy , Ġ" volume Ġaccuracy Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Price Accuracy ( limit Order : ĠLimit Order , Ġasset Pair : ĠAsset Pair ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprice Accuracy Valid Ġ= ĠNumber Utils . is Scale Small er OrEqual ( limit Order . price , Ġasset Pair . accuracy ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! price Accuracy Valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Price Accuracy , Ġ" price Ġaccuracy Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Stop Prices Accuracy ( order : ĠLimit Order , Ġasset Pair : ĠAsset Pair ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprice Accuracy Ġ= Ġasset Pair . accuracy ĊĠĠĠĠĠĠĠ Ġif Ġ( order . lower Limit Price Ġ!= Ġnull Ġ&& Ġ! Number Utils . is Scale Small er OrEqual ( order . lower Limit Price , Ġprice Accuracy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġorder . lower Price Ġ!= Ġnull Ġ&& Ġ! Number Utils . is Scale Small er OrEqual ( order . lower Price , Ġprice Accuracy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġorder . upper Limit Price Ġ!= Ġnull Ġ&& Ġ! Number Utils . is Scale Small er OrEqual ( order . upper Limit Price , Ġprice Accuracy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġorder . upper Price Ġ!= Ġnull Ġ&& Ġ! Number Utils . is Scale Small er OrEqual ( order . upper Price , Ġprice Accuracy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOrder ValidationException ( Order Status . Invalid Price Accuracy , Ġ" stop Ġorder Ġprice Ġaccuracy Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }