Package: ezIBpy
ezIBpy: Pythonic Wrapper for IbPyezIBpy is a Pythonic wrapper for theIbPylibrary by@blampe,
that was developed to speed up the development of
trading software that relies onInteractive Brokersfor market data and order execution.Changelog »Version 1.12.67 now supports multiple/FA accounts!Option to specify IB account upon connect. Alternatively, you can…Get info usinggetAccount('DUXXXXXX'),getPositions('DUXXXXXX'),getPortfolio('DUXXXXXX'), orgetOrders('DUXXXXXX')Submit order to a specific account by specifingaccount=DUXXXXXXincreateOrder(),placeOrder(),createBracketOrder(),createTrailingStopOrder(),createStopOrder(), andcreateTargetOrder()methodsNOTEStarting with release 9.73, Interactive Brokers is officially supporting a newPython 3 API client.
Although this is great news, I don’t see ezIBpy becoming obsolete anytime soon since IB’s API isn’t Pythonic or or abstracted enough IMO.I do have plans to drop IbPy in favor of IB’s official Python API, although I don’t have a timetable for this transision.If you’re a developer and interested in helping converting ezIBpy to work with IB’s Python API - please let me know :)Code Examples* Make sure you have the latest version of
Interactive Brokers’TWSorIB Gatewayinstalled and running on the machine.Market Data*** YOU MUST HAVE ACTIVE MARKET DATA SUBSCRIPTION TO USE THESE METHODS ***Request Market DataRequest Market DepthRequest Historical DataOrder ExecutionSubmit an OrderSubmit a Bracket OrderMoving Stop ManuallyBracket Order with Trailing StopCombo OrdersOther StuffUsing Custom CallbacksAccount InformationLoggingRequest Market Data:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()# connect to IB (7496/7497 = TWS, 4001 = IBGateway)ibConn.connect(clientId=100,host="localhost",port=4001)# create some contracts using dedicated methodsstk_contract=ibConn.createStockContract("AAPL")fut_contract=ibConn.createFuturesContract("ES",expiry="201606")cont_fut_contract=ibConn.createContinuousFuturesContract("CL","NYMEX")csh_contract=ibConn.createCashContract("EUR",currency="USD")opt_contract=ibConn.createOptionContract("AAPL",expiry="20160425",strike=105.0,otype="PUT")# ...or using a contract tupleoil_contract=ibConn.createContract(("CL","FUT","NYMEX","USD","201606",0.0,""))# request market data for all created contractsibConn.requestMarketData()# wait 30 secondstime.sleep(30)# cancel market data request & disconnectibConn.cancelMarketData()ibConn.disconnect()Request Market Depth:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# create a contract & request market depthcontract=ibConn.createCashContract("EUR",currency="USD")ibConn.requestMarketDepth()# wait 30 secondstime.sleep(30)# cancel market data request & disconnectibConn.cancelMarketData()ibConn.disconnect()Request Historical Data:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# create a contractcontract=ibConn.createStockContract("AAPL")# request 30 days of 1 minute data and save it to ~/DesktopibConn.requestHistoricalData(resolution="1 min",lookback="2 D",csv_path='~/Desktop/')# wait until stopped using Ctrl-ctry:whileTrue:time.sleep(1)except(KeyboardInterrupt,SystemExit):# cancel request & disconnectibConn.cancelHistoricalData()ibConn.disconnect()Submit an Order:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# create a contractcontract=ibConn.createFuturesContract("ES",exchange="GLOBEX",expiry="201609")# create an orderorder=ibConn.createOrder(quantity=1)# use price=X for LMT orders# submit an order (returns order id)orderId=ibConn.placeOrder(contract,order)# to submit an order to a specific account (ie DUXXXXXX), use:# orderId = ibConn.placeOrder(contract, order, account="DUXXXXXX")# let order filltime.sleep(1)# see the positionsprint("Positions")print(ibConn.positions)# disconnectibConn.disconnect()Submit a Bracket Order:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# create a contractcontract=ibConn.createFuturesContract("ES",exchange="GLOBEX",expiry="201609")# submit a bracket order (entry=0 = MKT order)order=ibConn.createBracketOrder(contract,quantity=1,entry=0,target=2200.,stop=1900.)# to submit bracket order to a specific account (ie DUXXXXXX), use:# order = ibConn.createBracketOrder(contract, quantity=1, entry=0, target=2200., stop=1900., account="DUXXXXXX")# let order filltime.sleep(1)# see the positionsprint("Positions")print(ibConn.positions)# disconnectibConn.disconnect()Submit a Bracket Order & Move Stop Manually:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# create a contractcontract=ibConn.createFuturesContract("ES",exchange="GLOBEX",expiry="201609")# submit a bracket order (entry=0 = MKT order)order=ibConn.createBracketOrder(contract,quantity=1,entry=0,target=2200.,stop=1900.)# let order filltime.sleep(1)# see the positionsprint("Positions")print(ibConn.positions)# move the stoporder['stopOrderId']=ibConn.modifyStopOrder(orderId=order['stopOrderId'],parentId=order['entryOrderId'],newStop=2000,quantity=-1)# disconnectibConn.disconnect()Submit a Bracket Order with a Trailing Stop:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# create a contractcontract=ibConn.createFuturesContract("ES",exchange="GLOBEX",expiry="201609")# submit a bracket order (entry=0 = MKT order)order=ibConn.createBracketOrder(contract,quantity=1,entry=0,target=2200.,stop=1900.)# let order filltime.sleep(1)# see the positionsprint("Positions")print(ibConn.positions)# create a trailing stop that's triggered at 2190symbol=ibConn.contractString(contract)ibConn.createTriggerableTrailingStop(symbol,-1,triggerPrice=2190,trailAmount=10,# for trail using fixed amount# trailPercent  = 10, # for trail using percentageparentId=order['entryOrderId'],stopOrderId=order["stopOrderId"],ticksize=0.25# see note)# ticksize is needed to rounds the stop price to nearest allowed tick size,# so you won't try to buy ES at 2200.128230 :)# NOTE: the stop trigger/trailing is done by the software,# so your script needs to keep running for this functionality to work# disconnect# ibConn.disconnect()Submit a Combo Orders:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# create contracts for an bear call spreadcontract_to_sell=ibConn.createOptionContract("AAPL",expiry=20161118,strike=105.,otype="CALL")contract_to_buy=ibConn.createOptionContract("AAPL",expiry=20161118,strike=100.,otype="CALL")# create combo legsleg1=ibConn.createComboLeg(contract_to_sell,"SELL",ratio=1)leg2=ibConn.createComboLeg(contract_to_buy,"BUY",ratio=1)# build a bag contract with these legscontract=ibConn.createComboContract("AAPL",[leg1,leg2])# create & place order (negative price means this is a credit spread)order=ibConn.createOrder(quantity=1,price=-0.25)orderId=ibConn.placeOrder(contract,order)# let order filltime.sleep(1)# see the positionsprint("Positions")print(ibConn.positions)# disconnectibConn.disconnect()Custom Callback:importezibpyimporttime# define custom callbackdefibCallback(caller,msg,**kwargs):ifcaller=="handleOrders":order=ibConn.orders[msg.orderId]iforder["status"]=="FILLED":print(">>> ORDER FILLED")# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# assign the custom callbackibConn.ibCallback=ibCallback# create a contractcontract=ibConn.createStockContract("AAPL")# create & place orderorder=ibConn.createOrder(quantity=100)orderId=ibConn.placeOrder(contract,order)# let order filltime.sleep(1)# see the positionsprint("Positions")print(ibConn.positions)# disconnectibConn.disconnect()* SeeThis Gistfor more examples.Account Information:importezibpyimporttime# initialize ezIBpyibConn=ezibpy.ezIBpy()ibConn.connect(clientId=100,host="localhost",port=4001)# available variables (auto-updating)print("Market Data")print(ibConn.marketData)print("Market Depth")print(ibConn.marketDepthData)print("Account Information")print(ibConn.account)print("Positions")print(ibConn.positions)print("Portfolio")print(ibConn.portfolio)print("Contracts")print(ibConn.contracts)print("Orders (by TickId)")print(ibConn.orders)print("Orders (by Symbol)")print(ibConn.symbol_orders)# subscribe to account/position updatesibConn.requestPositionUpdates(subscribe=False)ibConn.requestAccountUpdates(subscribe=False)# disconnectibConn.disconnect()Logging:ezIBpy logs via the standardPython logging facilitiesunder the logger nameezibpyat the level ofERRORby default.You can change the log level:importloggingimportezibpy# after ezibpy is imported, we can silence error logginglogging.getLogger('ezibpy').setLevel(logging.CRITICAL)# initialize with new logging configrationibConn=ezibpy.ezIBpy()...Or log to a file:importloggingimportezibpy# after ezibpy is imported, we can change the logging handler to filelogger=logging.getLogger('ezibpy')logger.addHandler(logging.FileHandler('path/to/ezibpy.log'))logger.setLevel(logging.INFO)logger.propagate=False# do not also log to stderr# initialize with new logging configrationibConn=ezibpy.ezIBpy()...InstallationInstall ezIBpy usingpip:$pipinstallezibpy--upgrade--no-cache-dirRequirementsPython>=3.4Pandas(tested to work with >=0.23.0)dateutil(tested to with with >=2.5.1)IbPy2(tested to work with >=0.8.0)Latest Interactive Brokers’TWSorIB Gatewayinstalled and running on the machineTo-Do:In regards to Options, ezIBpy currently supports market
data retrieval and order execution.If you want to add more functionality (such as news retreival, etc)
be my guest and please submit a pull request.Legal StuffezIBpy is licensed under theApache License, Version 2.0. A copy of which is included in LICENSE.txt.
ezIBpy is not a product of Interactive Brokers, nor is it affiliated with Interactive Brokers.P.S.I’m very interested in your experience with ezIBpy. Please drop me an note with any feedback you have.Ran Aroussi