To use the features described, activate the account-management plugin
 
require 'ib-api' 
ib =  IB::Connection.new
ib.activate_plugin 'account-management'
ib.activate_managed_accounts!
ib.get_account_data

The current status of the Account is available through the :RequestAccountSummary-Message. The TWS responds with :AccountSummary-Messages.

> ib =  IB::Connection.current
> ags = %w( NetLiquidation InitMarginReq DayTradesRemaining  )   
  => ["NetLiquidation", "InitMarginReq", "DayTradesRemaining"] 
> sub = ib.subscribe(:Alert, :AccountSummary){ |msg| puts msg.to_human  } 
> request_id = C.send_message :RequestAccountSummary, tags: ags.join(',')  
 <AccountValue: DF167347, <InitMarginReq=0.00 EUR>
 <AccountValue: DF167347, <NetLiquidation=0.00 EUR>
 <AccountValue: DU167348, <DayTradesRemaining=-1 USD>
 <AccountValue: DU167348, <InitMarginReq=49838.14 EUR>
 <AccountValue: DU167348, <NetLiquidation=926441.24 EUR>
 <AccountValue: DU167349, <DayTradesRemaining=-1 USD>
 <AccountValue: DU167349, <InitMarginReq=90168.53 EUR>
 <AccountValue: DU167349, <NetLiquidation=958049.83 EUR>
> ib.send_message :CancelAccountSummary, id: request_id               
  => true 
> ib.unsubscribe sub

If the managed-accounts-plugin is used, the method get_account_data requests the TWS and assigns :AccountValues and :PortfolioValues to IB::Account.

ib = Connection.new
ib.activate_plugin 'managed-accounts'
#--> W: Workflow::  -> gateway_mode      # transition to gateway-mode
ib.initialize_managed_accounts!            
#--> W: Workflow:: gateway_mode -> ready
#--> W: Workflow:: ready -> account_based_operations
ib.get_account_data                       # populates ib.clients

#  or

u= ib.clients.first
ib.get_account_data u                       #  update account specific data

Then AccountValues, Contracts and PortfolioValues are available through

puts u.portfolio_values.as_table
┌────────────┬──────────────────────────┬──────┬─────────┬──────────┬───────────┬────────────┬──────────┐
                                       pos   entry    market    value      unrealized  realized 
╞════════════╪══════════════════════════╪══════╪═════════╪══════════╪═══════════╪════════════╪══════════╡
 DU4035276   Future: DAX 20240920 EUR    -1  18399.6  18729.68  -18729.68     -330.08           
 DU4035276   Stock: DBK EUR IBIS        800   10.511    15.296    12236.8      3828.0           
 DU4035276   Stock: F USD NYSE          500   14.204     13.45     6725.0     -377.05           
 DU4035276   Stock: IFX EUR IBIS        400   32.361    35.265    14106.0      1161.6           
 DU4035276   Stock: LNZ EUR VSE         228   45.949      33.1     7546.8    -2929.54           
 DU4035276   Stock: TKA EUR IBIS        500    8.871     4.037     2018.5     -2417.0           
 DU4035276   Stock: TLT USD NASDAQ     -200   90.772     93.51   -18702.0     -547.56           
 DU4035276   Stock: TUI1 EUR IBIS       500   13.051     6.738     3369.0     -3156.4           
└────────────┴──────────────────────────┴──────┴─────────┴──────────┴───────────┴────────────┴──────────┘
puts u.contracts.to_human
  <Future: DAX 20240920 EUR>
  <Stock: DBK EUR IBIS>
  <Stock: F USD NYSE>
  <Stock: IFX EUR IBIS>
  <Stock: LNZ EUR VSE>
  <Stock: TKA EUR IBIS>
  <Stock: TLT USD NASDAQ>
  <Stock: TUI1 EUR IBIS>

u.account_values.size         => 234
u.account_values.keys
 => [:AccountType, :AccountCode, :AccountReady, :Cushion, :DayTradesRemaining,
 :"DayTradesRemainingT+1", :"DayTradesRemainingT+2", :"DayTradesRemainingT+3",
 :"DayTradesRemainingT+4", :"Leverage-S", :LookAheadNextChange,
 (...)
 :StockMarketValue, :OptionMarketValue, :FutureOptionValue, :FuturesPNL,
 :NetLiquidationByCurrency, :UnrealizedPnL, :RealizedPnL, :ExchangeRate,
 :FundValue, :NetDividend, :MutualFundValue, :MoneyMarketFundValue,
 :CorporateBondValue, :TBondValue, :TBillValue, :WarrantValue, :FxCashBalance,
 :AccountOrGroup, :RealCurrency, :IssuerOptionValue] 

To access specific entries, :account_data_scan is available. It takes a regular expression as argument:

puts u.account_data_scan( /MaintMarginReq$/  ).map &:to_human
  => <FullMaintMarginReq=44052.56 EUR>
     <LookAheadMaintMarginReq=44052.56 EUR> 
     <MaintMarginReq=44052.56 EUR> 
Tags: