Any financial asset is a IB::Contract
. Its defined by its attributes
c = IB::Contract.new
c.invariant_attributes
=> {:con_id => 0, :right => "", :include_expired => false}
s = IB::Stock.new symbol: 'GE'
s.invariant_attributes
=> { :con_id => 0, :right => "", :symbol => 'GE', :include_expired => false,
:sec_type => "STK", :currency => "USD", :exchange => "SMART"}
*invariant_attributes just strip timestamps from the output
Depending on the security-type different attributes are required to identify an asset. To ease the access to most common assets IB-Ruby defines default attributes (as shown above).
Required Attributes
We create contracts to fetch informations or to specify an asset to trade with.
These are
basic requirements to achieve this goal:
Security | Necessary Attributes | Default Attributes | Occasionally Required Attributes |
---|---|---|---|
Stocks | :symbol, :exchange, :currency | exchange: ‘SMART’, :currency: ‘USD’ | :primary_exchange, :trading_class |
Forex | (+) | exchange: ‘IDEALPRO’ | |
Future | (+) :expiry | multiplier | |
Option | (+) :strike, :right | multiplier, trading_class | |
Contract | :con_id, :exchange |
Any contract is fully identified by its con_id
and its exchange
.
A IB::Stock
may be defined by its :symbol
and :currency
or :exchange
. In rare occasions, :primary_exchange
and :trading_class
have to be specified, too.
a = Stock.new symbol: 'aapl'
# defines the _normal_ apple share, traded at several venues in _USD_.
a = Stock.new symbol: 'aapl', currency: 'CHF'
# specifies the stock traded at the EBS in swiss franc.
A IB::Future
requires :symbol
, :exchange
and :expiry
.
f= IB::Future.new symbol: 'ES', exchange: 'GLOBEX', expiry: 202103
An IB::Option
needs the specification of :symbol
, :exchange
, :strike
, :right
and :expiry
IB::Option.new(symbol:'abc', strike:-1. ...)
. RequestContractData
To verify the contract, a :RequestContractData
-message is submitted to the TWS.
ib = IB::Connection.new
ib.try_connetion!
ib.received = true
ib.send__message :RequestContractData, :contract => #{some contract}
# wait until the :ContractDataEnd message returned
ib.wait_for :ContractDataEnd
the_contract = ib.recieved[:ContractData].first
If this is performed with the Apple-Stock, as defined above:
ib = IB::Connection.current
ib.send_message :RequestContractData, :contract => IB::Stock.new( symbol: 'AAPL' )
ib.received[:ContractData].first.to_human
=> "<Contract <Stock: AAPL USD NASDAQ>
<ContractDetails APPLE INC, market-name:NMS, category:Computers, industry:Technology / Computers, ev_multiplier:, convertible:false, cupon:0.0, md_size_multiplier:100, min_tick:0.01, next_option_partial:false price_magnifier:1, puttable:false, sec_id-list:{:ISIN=>\"US0378331005\"}, valid exchanges: SMART,AMEX,NYSE,CBOE,PHLX,ISE,CHX,ARCA,ISLAND,DRCTEDGE,BEX,BATS,EDGEA,CSFBALGO,JEFFALGO,BYX,IEX,EDGX,FOXRIVER,PEARL,TPLUS1,NYSENAT,LTSE,MEMX,PSX, order types: ACTIVETIM,AD,ADJUST,ALERT,ALGO,ALLOC,AON,AVGCOST,BASKET,BENCHPX,COND,CONDORDER,DARKONLY,DARKPOLL,DAY,DEACT,DEACTDIS,DEACTEOD,DIS,GAT,GTC,GTD,GTT,HID,IBKRATS,ICE,IMB,IOC,LIT,LMT,LOC,MIT,MKT,MOC,MTL,NGCOMB,NODARK,NONALGO,OCA,OPG,OPGREROUT,PEGBENCH,POSTONLY,PREOPGRTH,REL,RPI,RTH,SCALE,SCALEODD,SCALERST,SNAPMID,SNAPMKT,SNAPREL,STP,STPLMT,SWEEP,TRAIL,TRAILLIT,TRAILLMT,TRAILMIT,WHATIF >>"
The response is a IB::ContractData
object. It holds any information about the successful request
z= ib.received[:ContractData].first
z.methods
=> [:contract_detail, :contract, :to_human, :buffer, :valid?, :load, data, ...
:request_id, ...]
z.contract.to_human
=> "<Stock: AAPL USD NASDAQ>"
Usually ContractData
-Objects are just transfer container to initialize IB::Contracts
.
For that purpose IB-Ruby provides Verify