The Basics

The API offers the :RequestMarketData message to address the gathering of market-related information

> ib =  IB::Connection.current
> ib.send_message :RequestMarketData, contract: IB::Symbols::Stocks.wfc, snapshot: true
# or
> ib.send_message :RequestMarketData, contract: IB::Symbols::Stocks.wfc, ticklist: [106,107]

where items in :ticklist further specify the request (details in messages/outgoing/request_marketdata). Most significant are:

 100 - Option Volume (stocks) -> returned Tick-IDs: 29, 30
 101 - Option Open Interest (stocks)             -> 27, 28
 104 - Historical Volatility                     -> 23
 105 - Average Opt Volume
 106 - Option Implied Volatility (impvolat)      -> 24
 107                             (climpvlt)        
 411 - Realtime Historical Volatility            -> 58

The example dir contains a simple market-data script.

Verbose solution using :send_message and :subscribe

ib = IB::Connection.new
ib.activate_plugin :symbols, :verify
ib.try_connection!
     
contracts = [ IB::Symbols::Futures.mini_dax, 
              Stock.new( symbol: :sie, currency: :eur ) ].map{|y| y.verify.first}

subscription = ib.subscribe(:TickPrice, :TickSize, :TickString) do |msg|
   puts contracts.find{ |x| x.con_id == msg.ticker_id }.symbol + ": " + msg.to_human 
end

contracts.each do | c |
   ib.send_message :RequestMarketData, :id => c.con_id, :contract => c
end
													 
STDIN.gets  # press a key to finish the script
contracts.each { |c| ib.send_message :CancelMarketData, :id => c.con_id  }
ib.unsubscribe subscription

This small script follows the paradigm of IB-Ruby. It sends messages and responses accordingly to the received information.

The market-price plugin

Fetching the actual market-price of an asset is a common task. IB-Ruby provides a plugin which adds current data to :bars and misc attributes of the used IB::Contract.

ib = IB::Connection.new
ib.activate_plugin :market_price
ib.try_connection!

s = Stock.new symbol: 'FMG', currency: :aud
s.market_price => 0.2197e2
s.bars   => [{:bid=>0.2197e2, :ask=>0.2198e2, :close=>0.2159e2, :last=>0.2197e2}]
s.misc   => {:delayed=>0.2197e2}

More Details in Contracts/Market-Data

Tags: