package Ġc pa . ib gw api . broker age Ċ Ċ import Ġcom . ib . client . Contract Ċ import Ġcom . ib . client . E Client Socket Ċ import Ġcom . ib . client . E Java Signal Ċ import Ġcom . ib . client . E Reader Ċ import Ġcom . ib . client . Order Ċ import Ġc pa . ib gw api . thread . Auto Reset Event Ċ import Ġc pa . ib gw api . thread . Rate Limiter Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . lang . Exception Ċ import Ġjava . util . concurrent . TimeoutException Ċ Ċ /** Ċ Ġ* ĠClient Ġto Ġsend Ġrequests Ġto ĠIB ĠGateway . Ċ Ġ*/ Ċ class ĠIB Client ( ĊĠĠĠ Ġreceiver : ĠIB Receiver , ĊĠĠĠ Ġval Ġdata Store : ĠIB DataStore , ĊĠĠĠ Ġprivate Ġval Ġrate Limiter : ĠRate Limiter Ċ ) Ġ: ĠAuto Closeable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġreader Signal Ġ= ĠE Java Signal () ĊĠĠĠ Ġprivate Ġval Ġclient Socket Ġ= ĠE Client Socket ( receiver , Ġreader Signal ) ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġrequest Counter : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTIME OUT _ MS Ġ= Ġ 1 5 0 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconnect ( host : ĠString , Ġport : ĠInt , ĠclientId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Socket . e Connect ( host , Ġport , ĠclientId ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! client Socket . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġconnect Ġto ĠIB Ġgateway ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠE Reader ( client Socket , Ġreader Signal ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠThread Ġ{ Ġprocess Messages ( reader ) Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreq Account Summary () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreq Id Ġ= Ġmake RequestId () ĊĠĠĠĠĠĠĠ Ġval Ġtags Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Net Liquid ation ", Ġ" Total Cash Value ", Ġ" Set tled Cash ", Ġ" Acc ru ed Cash ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Buy ing Power ", Ġ" Equ ity With Loan Value ", Ġ" Init Margin Req ", Ġ" Maint Margin Req ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Available Funds ", Ġ" Day Trades Remaining ", Ġ" Le verage " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsynchronized ( data Store . lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Store . clear Account Summary () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Socket . req Account Summary ( req Id , Ġ" All ", Ġtags . join ToString ("," )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠwaitFor Signal ( data Store . account Summary End Signal ) ĊĠĠĠĠĠĠĠ Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Socket . cancel Account Summary ( req Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreq Next Valid OrderId (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( data Store . lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Store . next Valid OrderId Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Socket . req Ids (- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠwaitFor Signal ( data Store . next Valid OrderId Completed ) ĊĠĠĠĠĠĠĠ Ġsynchronized ( data Store . lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata Store . next Valid OrderId ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplace Order ( orderId : ĠInt , Ġcontract : ĠContract , Ġorder : ĠOrder ) Ġ= Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Socket . place Order ( orderId , Ġcontract , Ġorder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcancel Order ( orderId : ĠInt ) Ġ= Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Socket . cancel Order ( orderId ) ĊĠĠĠĠĠĠĠ Ġ// ĠAllow Ġsome Ġtime Ġfor Ġconfirmation ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 5 0 0 L ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreq Open Orders () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( data Store . lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Store . clear Orders () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Socket . req Open Orders () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠwaitFor Signal ( data Store . order Request Completed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreq Positions () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( data Store . lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Store . clear Positions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Socket . req Positions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrate Limiter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Socket . cancel Positions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠwaitFor Signal ( data Store . positions Request Completed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠwaitFor Signal ( signal : ĠAuto Reset Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . await ( TIMEOUT _ MS ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIB TimeoutException (" Timeout Ġafter Ġwaiting Ġfor Ġsignal Ġfor Ġ$ TIMEOUT _ MS Ġmilliseconds .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake RequestId (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġrequest Counter ++ ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Messages ( reader : ĠE Reader ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( client Socket . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader Signal . waitFor Signal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . process Msgs () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( e ) Ġ{ Ġ" Failed Ġto Ġprocess Ġmessage Ġfrom Ġgateway " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Termin ating Ġmessage Ġprocessing Ġthread " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( client Socket . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Closing Ġconnection Ġto Ġgateway ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Socket . e Disconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ