package Ġorg . ro bo quant . common Ċ Ċ /** Ċ Ġ* ĠAsset Ġis Ġused Ġto Ġuniquely Ġidentify Ġa Ġfinancial Ġinstrument . ĠSo Ġit Ġcan Ġrepresent Ġa Ġstock , Ġa Ġfuture Ċ Ġ* Ġor Ġeven Ġa Ġcrypt oc urrency . ĠAll Ġof Ġits Ġproperties Ġare Ġread - only , Ġand Ġassets Ġare Ġtypically Ġonly Ġcreated Ċ Ġ* Ġonce Ġand Ġreused Ġthere after . Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ@ property Ġsymbol Ġsymbol Ġname Ċ Ġ* Ġ@ property Ġtype Ġtype Ġof Ġasset Ġclass , Ġdefault Ġis Ġ[ Asset Type . STO CK ] Ċ Ġ* Ġ@ property Ġcurrency Code Ġcurrency Ġcode , Ġdefault Ġis Ġ" USD " Ċ Ġ* Ġ@ property Ġexchange Code ĠExchange Ġthis Ġasset Ġis Ġtr aded Ġon , Ġdefault Ġis Ġempty Ċ Ġ* Ġ@ property Ġmultiplier Ġcontract Ġmultiplier , Ġdefault Ġis Ġ 1 . 0 Ċ Ġ* Ġ@ property Ġdetails Ġcontract Ġdetails , Ġfor Ġexample Ġthis Ġcould Ġhold Ġthe Ġoption Ġseries Ġor Ġfutures Ġcontract Ġdetails Ċ Ġ* Ġ@ property Ġname ĠCompany Ġname , Ġdefault Ġis Ġempty Ċ Ġ* Ġ@ property Ġid Ġasset Ġidentifier , Ġdefault Ġis Ġempty Ċ Ġ* Ġ@ constructor ĠCreate Ġa Ġnew Ġasset Ċ Ġ*/ Ċ data Ġclass ĠAsset ( ĊĠĠĠ Ġval Ġsymbol : ĠString , ĊĠĠĠ Ġval Ġtype : ĠAsset Type Ġ= ĠAsset Type . STO CK , ĊĠĠĠ Ġval Ġcurrency Code : ĠString Ġ= Ġ" USD ", ĊĠĠĠ Ġval Ġexchange Code : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġmultiplier : ĠDouble Ġ= Ġ 1 . 0 , ĊĠĠĠ Ġval Ġdetails : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġid : ĠString Ġ= Ġ"" Ċ ) Ġ: ĠComparable < Asset > Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( symbol . isNotBlank ()) Ġ{ Ġ" Symbol Ġin Ġan Ġasset Ġcannot Ġbe Ġempty Ġor Ġblank " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġ[ Currency ] Ġof Ġthis Ġasset Ġbased Ġon Ġthe Ġunderlying Ġcurrency Ġcode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcurrency ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠCurrency . getInstance ( currency Code ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġ[ Exchange ] Ġof Ġthis Ġasset Ġbased Ġon Ġthe Ġunderlying Ġexchange Ġcode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġexchange ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExchange . getInstance ( exchange Code ) ĊĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ type Ġ$ symbol Ġ$ details " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġserialized Ġstring Ġrepresentation Ġof Ġthis Ġasset Ġthat Ġcan Ġbe Ġlater Ġdeserialized Ġusing Ġthe ĊĠĠĠĠ Ġ* Ġ[ deserialize ] Ġmethod ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĊĠĠĠ Ġfun Ġserialize (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ symbol $ SEP $ type $ SEP $ currency Code $ SEP $ exchange Code $ SEP $ multiplier $ SEP $ last Date $ SEP $ right $ SEP $ strike $ SEP $ name $ SEP $ id " ĊĠĠĠ Ġ} ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġserialized Ġstring Ġrepresentation Ġof Ġthis Ġasset Ġthat Ġcan Ġbe Ġlater Ġdeserialized Ġusing Ġthe Ġ[ deserialize ] ĊĠĠĠĠ Ġ* Ġmethod . ĠIt Ġoptim izes Ġthe Ġstring Ġlength . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġserialize (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ( symbol ). append ( SEP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠAsset Type . STO CK ) Ġsb . append ( type . name ); Ġsb . append ( SEP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( currency Code Ġ!= Ġ" USD ") Ġsb . append ( currency Code ); Ġsb . append ( SEP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( exchange Code Ġ!= Ġ"") Ġsb . append ( exchange Code ); Ġsb . append ( SEP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( multiplier Ġ!= Ġ 1 . 0 ) Ġsb . append ( multiplier ); Ġsb . append ( SEP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( details . isNotEmpty ()) Ġsb . append ( details ); Ġsb . append ( SEP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isNotEmpty ()) Ġsb . append ( name ); Ġsb . append ( SEP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( id . isNotEmpty ()) Ġsb . append ( id ); Ġsb . append ( SEP ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcnt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( ch Ġin Ġsb . reversed ()) Ġif Ġ( ch Ġ== ĠSE P ) Ġcnt ++ Ġelse Ġbreak ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . substring ( 0 , Ġsb . length Ġ- Ġcnt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUse Ġthe ĠASCII ĠUnit ĠSe parator Ġcharacter . ĠShould Ġnot Ġinterf ere Ġwith Ġmost Ġstrings ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSE P Ġ= Ġ'\ u 0 0 1 F ' ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDeserialize Ġa Ġstring Ġinto Ġan Ġasset . ĠThe Ġstring Ġneeds Ġto Ġhave Ġbeen Ġcreated Ġusing Ġ[ serialize ] ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠ Ġfun Ġdeserialize ( s : ĠString ): ĠAsset Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġs . split ( SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . size Ġ== Ġ 1 0 ) Ġ{ Ġ"$ s Ġhas Ġunexpected Ġformat " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAsset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsset Type . valueOf ( e [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 2 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 3 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 4 ]. toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 5 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 6 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 7 ]. toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 8 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 9 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDeserialize Ġa Ġstring Ġinto Ġan Ġasset . ĠThe Ġstring Ġneeds Ġto Ġhave Ġbeen Ġcreated Ġusing Ġ[ serialize ] Ġmethod ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdeserialize ( s : ĠString ): ĠAsset Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġs . split ( SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġe . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAsset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġ 1 Ġ&& Ġe [ 1 ]. isNotEmpty ()) ĠAsset Type . valueOf ( e [ 1 ]) Ġelse ĠAsset Type . STO CK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġ 2 Ġ&& Ġe [ 2 ]. isNotEmpty ()) Ġe [ 2 ] Ġelse Ġ" USD ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġ 3 ) Ġe [ 3 ] Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġ 4 Ġ&& Ġe [ 4 ]. isNotEmpty ()) Ġe [ 4 ]. toDouble () Ġelse Ġ 1 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġ 5 ) Ġe [ 5 ] Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġ 6 ) Ġe [ 6 ] Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Ġ> Ġ 7 ) Ġe [ 7 ] Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp ares Ġthis Ġobject Ġwith Ġthe Ġspecified Ġobject Ġfor Ġorder . ĠReturns Ġzero Ġif Ġthis Ġobject Ġis Ġequal ĊĠĠĠĠ Ġ* Ġto Ġthe Ġspecified Ġ[ other ] Ġobject , Ġa Ġnegative Ġnumber Ġif Ġit 's Ġless Ġthan Ġ[ other ], Ġor Ġa Ġpositive Ġnumber ĊĠĠĠĠ Ġ* Ġif Ġit 's Ġgreater Ġthan Ġ[ other ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠAsset ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsymbol . compareTo ( other . symbol ) ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ Ċ /** Ċ Ġ* ĠGet Ġan Ġasset Ġbased Ġon Ġits Ġ[ symbol ] Ġname . ĠWill Ġthrow Ġa ĠNoSuch ElementException Ġif Ġno Ġasset Ġis Ġfound . ĠIf Ġthere Ġare Ċ Ġ* Ġmultiple Ġassets Ġwith Ġthe Ġsame Ġsymbol , Ġthe Ġfirst Ġone Ġwill Ġbe Ġreturned . Ċ Ġ*/ Ċ fun ĠCollection < Asset >. getBy Symbol ( symbol : ĠString ): ĠAsset Ġ= Ġfirst Ġ{ Ġit . symbol Ġ== Ġsymbol Ġ} Ċ Ċ /** Ċ * ĠFind Ġan Ġasset Ġbased Ġon Ġits Ġ[ symbols ] Ġname . ĠWill Ġreturn Ġan Ġempty Ġlist Ġif Ġno Ġassets Ġare Ġmatched . Ċ */ Ċ fun ĠCollection < Asset >. findBy Symbols ( var arg Ġsymbols : ĠString ): ĠList < Asset > Ġ= Ġfilter Ġ{ Ġit . symbol Ġin Ġsymbols Ġ} Ċ Ċ /** Ċ Ġ* ĠFind Ġall Ġassets Ġbased Ġon Ġtheir Ġ[ currency Codes ]. ĠReturns Ġan Ġempty Ġlist Ġif Ġno Ġmatching Ġassets Ġcan Ġbe Ġfound . Ċ Ġ*/ Ċ fun ĠCollection < Asset >. findBy C urrencies ( var arg Ġcurrency Codes : ĠString ): ĠList < Asset > Ġ= Ġfilter Ġ{ Ġit . currency Code Ġin Ġcurrency Codes Ġ} ĊĊ Ċ /** Ċ Ġ* ĠFind Ġall Ġassets Ġbased Ġon Ġtheir Ġ[ exchange Codes ]. ĠReturns Ġan Ġempty Ġlist Ġif Ġno Ġmatching Ġassets Ġcan Ġbe Ġfound . Ċ Ġ*/ Ċ fun ĠCollection < Asset >. findBy Exchange s ( var arg Ġexchange Codes : ĠString ): ĠList < Asset > Ġ= Ġfilter Ġ{ Ġit . exchange Code Ġin Ġexchange Codes Ġ} Ċ Ċ /** Ċ Ġ* ĠSelect Ġ[ n ] Ġrandom Ġassets Ġfrom Ġa Ġcollection , Ġwithout Ġduplicates . Ġ[ n ] Ġhas Ġto Ġequal Ġor Ġsmaller Ġthan Ġthe Ġsize Ġof Ġthe Ċ Ġ* Ġcollection Ċ Ġ*/ Ċ fun ĠCollection < Asset >. random ( n : ĠInt ): ĠList < Asset > Ġ= Ġsh uffled (). take ( n ) ĊĊ Ċ /** Ċ Ġ* ĠProvide Ġa Ġ[ Summary ] Ġfor Ġa Ġcollection Ġof Ġassets Ċ Ġ*/ Ċ fun ĠCollection < Asset >. summary (): ĠSummary Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠSummary (" Assets ") ĊĠĠĠ Ġfor Ġ( asset Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . add ("$ asset ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } ĊĊ