Several message-calls use :id, :ticker_id or :request_id to distinguish between separate requests.
You can either specify the id or delegate it to IB-Ruby.

To delegate, omit the specification of an :id of any kind.

ib = IB::Connection.new( host: 'localhost:7697' ) do |gw|
 gw.subscribe( :ContractData ){ |m| puts  m.contract.as_table  }
 gw.subscribe(:ContractDataEnd){|m| puts "finished with request-id: #{m.request_id}"}
end
ib.activate_plugin 'symbols'
ib.try_connection!
ib.send_message :RequestContractData, contract: IB::Symbols::Stocks.aapl
 => 171 
 ┌───────┬────────┬────────┬──────────┬───────────────┬───────┬────────┬──────────┐
         symbol  con_id  exchange  trading-class  right  strike  currency 
 ╞═══════╪════════╪════════╪══════════╪═══════════════╪═══════╪════════╪══════════╡
  Stock  AAPL    265598   SMART         NMS                        USD    
 └───────┴────────┴────────┴──────────┴───────────────┴───────┴────────┴──────────┘
  finished with request-id: 171

The :send_message-method returns the generated »request_id«.

If request_id is included in the parameter list to :send_message, the autogeneration mechanism is overridden.

Examples using this feature

List of Messages supporting auto-generated request_id’s

:RequestAccountSummary
:RequestPositionsMulti
:RequestAccountUpdatesMulti
:RequestContractDetails = :RequestContractData
:RequestExecutions
:RequestFundamentalData
:RequestHeadTimeStamp
:RequestHistogramData
:RequestHistoricalData
:RequestRealTimeBars
:RequestCalculateImpliedVolatility = :CalculateImpliedVolatility 
                                   = :RequestImpliedVolatility 

:RequestCalculateOptionPrice = :CalculateOptionPrice 
                             = :RequestOptionPrice 

:RequestScannerSubscription 
:RequestSecurityDefinitionOptionParameters = :ReqSecDefOptParams  
                                           = :RequestOptionChainDefinition 
Tags: