To experiment with the API, a preconfigured interactive irb-console is provided
cd bin && ./console
.Install the console in your project
This is easily obtained by copying the bin-directory form the ib-api
, ib-extensions' or
ib-orientdb` gem to the project-dir
$ cd {your project}
$ ib_gem=`bundle info --path ib-extensions` # or ib-api or ib-orientdb
$ cp -r $ib_gem/bin .
Include require [your_project_name]
to the scripts.
Run the console
Without parameters it connects to a running Gateway-Application on localhost.
The GUI-Version (TWS) is addressed by calling ./console tws
from the command line..
connect.yml
.:gateway: 4002
:tws: 7496
:client_id: 2000
Edit the file and ensure that the ports chosen are equal to those specified in the API
-section of the
configuration of TWS/Gateway:
---------------------------------------------
Namespace is IB !
---------------------------------------------
06:44:03.998 Connected to server, version: 137,
connection time: 2018-03-21 06:44:03 +0000 local, 2018-03-21T06:44:03+00:00 remote.
06:44:03.999 Got message 15 (IB::Messages::Incoming::ManagedAccounts)
------------------------------- Managed Accounts ----------------------------------
Detected Accounts: DF167347 -- DU167348 -- DU167349
----> C points to the connection-instance
some basic Messages are subscribed and accordingly displayed
The IB::Connection
-Object is accessed through C
(for Gateway)
The IB::Gateway
-Object is accessed through G
C.send_message :RequestContractDetails, contract: Stock.new( symbol: 'TAP' )
=> 5878
07:10:13.389 Got message 10 (IB::Messages::Incoming::ContractData)
I, [2018-03-21T07:10:13.389943 #22286] INFO -- : <Stock: TAP USD>
07:10:13.390 Got message 52 (IB::Messages::Incoming::ContractDataEnd)
I, [2018-03-21T07:10:13.390092 #22286] INFO -- : <ContractDataEnd: request_id 5878 >
C.received.keys
=> [:ManagedAccounts, :NextValidId, :Alert, :OpenOrder, :ContractData, :ContractDataEnd]
C.received[:ContractData].to_human
=> ["<ContractDetails MOLSON COORS BEVERAGE CO - B, --> TAP, /C/ Beverages, /I/ Consumer, Non-cyclical /SC/ Brewery, md_size_multiplier:100, min_tick:0.01, price_magnifier:1, valid exchanges: SMART,AMEX,NYSE,CBOE,PHLX,ISE,CHX,ARCA,ISLAND,DRCTEDGE,BEX,BATS,EDGEA,CSFBALGO,JEFFALGO,BYX,IEX,EDGX,FOXRIVER,PEARL,NYSENAT,LTSE,MEMX,PSX; order types: ACTIVETIM,AD,ADJUST,ALERT,ALGO,ALLOC,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,RTHIGNOPG,SCALE,SCALEODD,SCALERST,SNAPMID,SNAPMKT,SNAPREL,STP,STPLMT,SWEEP,TRAIL,TRAILLIT,TRAILLMT,TRAILMIT,WHATIF >"]
C.received[:ContractData].contract.to_human
=> ["<Stock: TAP USD>"]
Array Expansion
To simplify operations with received data, arbitrary operations may be applied to array’s.
Example: After collecting End-of-Day historical data for a IB::Contract
,
the results can be inspected directly:
> eod = IB::Stock.new( symbol: 'GE' ).eod( duration: 10 )
> eod.class => Array
> eod.size => 10
> eod.first.class => IB::Bar
> eod.first.attributes.keys
=> [:time, :open, :high, :low, :close, :volume, :wap, :trades, :created_at]
> eod.close.to_f # instead of eod.close.map{|y| y.close.to_f}
=> [6.89, 7.3, 7.32, 7.35, 7.31, 7.86, 7.66, 7.36, 7.13, 7.54]