/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠPeter ĠKen ji ĠY aman aka Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . py am soft . tick ert ape . stocks . sources . yf Ċ Ċ import Ġandroidx . annotation . Check Result Ċ import Ġcom . py am soft . py d roid . core . En for cer Ċ import Ġcom . py am soft . tick ert ape . stocks . Internal Api Ċ import Ġcom . py am soft . tick ert ape . stocks . api . Stock Money Value Ċ import Ġcom . py am soft . tick ert ape . stocks . api . Stock Options Ċ import Ġcom . py am soft . tick ert ape . stocks . api . Stock Symbol Ċ import Ġcom . py am soft . tick ert ape . stocks . api . as Money Ċ import Ġcom . py am soft . tick ert ape . stocks . api . as Percent Ċ import Ġcom . py am soft . tick ert ape . stocks . api . as Symbol Ċ import Ġcom . py am soft . tick ert ape . stocks . data . Stock Options Impl Ċ import Ġcom . py am soft . tick ert ape . stocks . network . Network Option Response Ċ import Ġcom . py am soft . tick ert ape . stocks . service . Options Service Ċ import Ġcom . py am soft . tick ert ape . stocks . sources . Options Source Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . Zone Id Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjavax . inject . Inject Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ Ċ internal Ġclass ĠY ahoo Options Source Ċ @ Inject Ċ internal Ġconstructor (@ Internal Api Ġprivate Ġval Ġservice : ĠOptions Service ) Ġ: ĠOptions Source Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠINVALID _ OPTIONS _ FORMAT Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ STRI KE _ PRICE Ġ= Ġ 1 0 0 0 0 0 . 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ LOOP _ COUNT Ġ= Ġ 1 0 ĊĠĠĠ Ġprivate Ġval ĠOPTIONS _ EXPI RATION _ DATE _ FORMAT TER Ġ= ĠDateTime Formatter . of Pattern (" yy MM DD ") ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Check Result ĊĠĠĠ Ġprivate Ġfun ĠNetwork Option Response . Resp . Option Chain . Option . Option Contract . as Contract ( ĊĠĠĠĠĠĠĠ Ġsymbol : ĠStock Symbol , ĊĠĠĠĠĠĠĠ Ġtype : ĠStock Options . Contract . Type , ĊĠĠĠ Ġ): ĠStock Options Impl . Contract Impl Ġ{ ĊĠĠĠĠĠ Ġreturn ĠStock Options Impl . Contract Impl ( ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġsymbol , ĊĠĠĠĠĠĠĠĠĠ Ġcontract Symbol Ġ= Ġthis . contract Symbol . as Symbol (), ĊĠĠĠĠĠĠĠĠĠ Ġstrike Ġ= Ġthis . strike . as Money (), ĊĠĠĠĠĠĠĠĠĠ Ġchange Ġ= Ġthis . change . as Money (), ĊĠĠĠĠĠĠĠĠĠ Ġpercent Ġ= Ġthis . percent Change . as Percent (), ĊĠĠĠĠĠĠĠĠĠ Ġlast Price Ġ= Ġthis . last Price . as Money (), ĊĠĠĠĠĠĠĠĠĠ Ġbid Ġ= Ġthis . bid . as Money (), ĊĠĠĠĠĠĠĠĠĠ Ġask Ġ= Ġthis . ask . as Money (), ĊĠĠĠĠĠĠĠĠĠ Ġiv Ġ= Ġthis . imp lied Vol atility . as Percent (), ĊĠĠĠĠĠĠĠĠĠ Ġit m Ġ= Ġthis . in The Money , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Check Result ĊĠ Ġprivate Ġfun Ġparse Options Response ( resp : ĠNetwork Option Response ): ĠStock Options Ġ{ ĊĠĠĠ Ġval Ġoption Ġ= Ġresp . option Chain . result . first () ĊĠĠĠ Ġval Ġchain Ġ= Ġoption . options . first () ĊĠĠĠ Ġval Ġsymbol Ġ= Ġoption . underlying Symbol . as Symbol () ĊĠĠĠ Ġval Ġcalls Ġ= Ġchain . calls . map Ġ{ Ġit . as Contract ( symbol , ĠStock Options . Contract . Type . CALL ) Ġ} ĊĠĠĠ Ġval Ġputs Ġ= Ġchain . puts . map Ġ{ Ġit . as Contract ( symbol , ĠStock Options . Contract . Type . PUT ) Ġ} ĊĊĠĠĠ Ġval Ġlocal Id Ġ= ĠZone Id . system Default () ĊĠĠĠ Ġreturn ĠStock Options Impl ( ĊĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġsymbol , ĊĠĠĠĠĠĠĠ Ġexpiration Dates Ġ= Ġoption . expiration Dates . map Ġ{ Ġparse Market Time ( it , Ġlocal Id ) Ġ}, ĊĠĠĠĠĠĠĠ Ġstri kes Ġ= Ġoption . stri kes . map Ġ{ Ġit . as Money () Ġ}, ĊĠĠĠĠĠĠĠ Ġdate Ġ= Ġparse Market Time ( chain . expiration Date , Ġlocal Id ), ĊĠĠĠĠĠĠĠ Ġcalls Ġ= Ġcalls , ĊĠĠĠĠĠĠĠ Ġputs Ġ= Ġputs , ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġget Options ( ĊĠĠĠĠĠ Ġforce : ĠBoolean , ĊĠĠĠĠĠ Ġsymbol : ĠStock Symbol , ĊĠĠĠĠĠ Ġdate : ĠLocalDate ? ĊĠ Ġ): ĠStock Options Ġ= ĊĠĠĠĠĠ Ġwith Context ( context Ġ= ĠDispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEn for cer . assert Off MainThread () ĊĠĠĠĠĠĠĠ Ġval Ġresp Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( date Ġ== Ġnull ) Ġservice . getOptions ( symbol . symbol ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġservice . getOptions ( symbol . symbol (), Ġdate . to Epoch Day ()) ĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġparse Options Response ( resp ) ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġresolve Option Lookup Identifier ( ĊĠĠĠĠĠ Ġsymbol : ĠStock Symbol , ĊĠĠĠĠĠ Ġexpiration Date : ĠLocalDate , ĊĠĠĠĠĠ Ġstrike Price : ĠStock Money Value , ĊĠĠĠĠĠ Ġcontract Type : ĠStock Options . Contract . Type ĊĠ Ġ): ĠString Ġ= ĊĠĠĠĠĠ Ġwith Context ( context Ġ= ĠDispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEn for cer . assert Off MainThread () ĊĠĠĠĠĠĠĠ Ġ// ĠMS FT 2 2 0 1 1 4 P 0 0 3 0 5 0 0 0 ĊĠĠĠĠĠĠĠ Ġ// ĠMS FT Ġ 2 2 - 0 1 - 1 4 ĠP Ġ$ 0 0 3 0 5 . 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġdate String Ġ= Ġexpiration Date . format ( OPTIONS _ EXPI RATION _ DATE _ FORMAT TER ) ĊĠĠĠĠĠĠĠ Ġval Ġcontract Ġ= Ġif Ġ( contract Type Ġ== ĠStock Options . Contract . Type . CALL ) Ġ" C " Ġelse Ġ" P " ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġdollar Ġsign Ġfrom Ġthe Ġstrike Ġprice Ġformatting ĊĠĠĠĠĠĠĠ Ġval Ġfixed Stri ke Ġ= Ġstrike Price . as Money Value (). replace ("$ ", Ġ"") ĊĊĠĠĠĠĠĠĠ Ġ// ĠOptions ĠIDs Ġcan Ġonly Ġhave Ġ 3 Ġ" decimal " Ġplaces , Ġfigure Ġout Ġhow Ġmany Ġwe Ġhave Ġcurrently ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġadd Ġmore Ġzero es Ġif Ġwe Ġneed Ġmore ĊĠĠĠĠĠĠĠ Ġval Ġnumbers After Decimal Ġ= Ġfixed Stri ke . substring After (". "). length ĊĠĠĠĠĠĠĠ Ġval Ġneeded Zero Count Ġ= Ġ 3 Ġ- Ġnumbers After Decimal ĊĊĠĠĠĠĠĠĠ Ġ// ĠReplace Ġthe Ġ. Ġin Ġthe Ġprice ĊĠĠĠĠĠĠĠ Ġval Ġzero String Ġ= Ġif Ġ( needed Zero Count Ġ== Ġ 0 ) Ġ"" Ġelse Ġ" 0 ". repeat ( needed Zero Count ) ĊĠĠĠĠĠĠĠ Ġvar Ġstrike String Ġ= Ġ"${ fixed Stri ke . replace (" ." Ġ, Ġ"") }${ zero String }" ĊĊĠĠĠĠĠĠĠ Ġ// ĠHere Ġwe Ġgo , Ġtime Ġto Ġassemble ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Stri ke Ġ= Ġstrike Price . value () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġhighest Ġnumber ĠY F Ġcan Ġsupport Ġis Ġ 1 0 0 , 0 0 0 Ġfor Ġa Ġstrike ĊĠĠĠĠĠĠĠ Ġtemp Stri ke Ġ*= Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġsafe Ġguard Ġto Ġavoid Ġinfinite Ġloops ĊĠĠĠĠĠĠĠ Ġvar Ġloop Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( temp Stri ke . compareTo ( MAX _ STRI KE _ PRICE ) Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( loop Count ++ Ġ> ĠMAX _ LOOP _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" Options Ġloop Ġtoo Ġlarge !. Ġ$ temp Stri ke Ġ( Stri ke : Ġ$ MAX _ STRI KE _ PRICE )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠINVALID _ OPTIONS _ FORMAT ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠPad Ġthe Ġstring Ġwith Ġ 0 Ġuntil Ġit Ġfill s Ġto Ġthe Ġmaximum Ġstrike Ġprice ĊĠĠĠĠĠĠĠĠĠ Ġstrike String Ġ= Ġ" 0 ${ strike String }" ĊĠĠĠĠĠĠĠĠĠ Ġtemp Stri ke Ġ*= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġ"${ symbol . symbol ()} ${ date String }${ contract }${ strike String }" ĊĠĠĠĠĠ Ġ} Ċ } Ċ