Skip to main content

Pythonic Wrapper for IbPy

Project description

ezIBpy: Pythonic Wrapper for Troy Melhase’s IbPy

© Ran Aroussi

ezIBpy is a Pythonic wrapper for Troy Melhase’s IbPy library, that was developed to speed up the development of trading software that relies on Interactive Brokers for market data and order execution.

ezIBpy was originally developed by Ran Aroussi for Native Alpha’s quantitative trading team to streamline the development of their in-house trading strategies.

Code Examples

* Make sure you have the latest version of Interactive Brokers’ TWS or IB Gateway installed and running on the machine.

Market Data

Order Execution

Request Market Data:

import ezibpy
import time

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()

# connect to IB (7496/7497 = TWS, 4001 = IBGateway)
ibConn.connect(clientId=100, host="localhost", port=4001)

# create some contracts using dedicated methods
stk_contract = ibConn.createStockContract("AAPL")
fut_contract = ibConn.createFutureContract("ES", expiry="201606")
csh_contract = ibConn.createCashContract("EUR", currency="USD")
opt_contract = ibConn.createOptionContract("AAPL", expiry="20160425", strike=105.0, otype="PUT")

# ...or using a contract tuple
oil_contract = ibConn.createContract(("CL", "FUT", "NYMEX", "USD", "201606", 0.0, ""))

# request market data for all created contracts
ibConn.requestMarketData()

# wait 30 seconds
time.sleep(30)

# cancel market data request & disconnect
ibConn.cancelMarketData()
ibConn.disconnect()

Request Market Depth:

import ezibpy
import time

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()
ibConn.connect(clientId=100, host="localhost", port=4001)

# create a contract & request market depth
contract = ibConn.createCashContract("EUR", currency="USD")
ibConn.requestMarketDepth()

# wait 30 seconds
time.sleep(30)

# cancel market data request & disconnect
ibConn.cancelMarketData()
ibConn.disconnect()

Request Historical Data:

import ezibpy
import time
import sys

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()
ibConn.connect(clientId=100, host="localhost", port=4001)

# create a contract
contract = ibConn.createStockContract("AAPL")

# request 30 days of 1 minute data and save it to ~/Desktop
ibConn.requestHistoricalData(resolution="1 min", lookback="2 D", csv_path='~/Desktop/')

# wait until stopped using Ctrl-c
try:
    while True:
        time.sleep(1)

except (KeyboardInterrupt, SystemExit):
    # cancel request & disconnect
    ibConn.cancelHistoricalData()
    ibConn.disconnect()

Submit an Order:

import ezibpy
import time

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()
ibConn.connect(clientId=100, host="localhost", port=4001)

# create a contract
contract = ibConn.createFutureContract("ES", exchange="GLOBEX", expiry="201609")

# create an order
order = ibConn.createOrder(quantity=1) # use price=X for LMT orders

# submit an order (returns order id)
orderId = ibConn.placeOrder(contract, order)

# let order fill
time.sleep(1)

# see the positions
print("Positions")
print(ibConn.positions)

# disconnect
ibConn.disconnect()

Submit a Bracket Order:

import ezibpy
import time

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()
ibConn.connect(clientId=100, host="localhost", port=4001)

# create a contract
contract = ibConn.createFutureContract("ES", exchange="GLOBEX", expiry="201609")

# submit a bracket order (entry=0 = MKT order)
order = ibc.createBracketOrder(contract, quantity=1, entry=0, target=2200., stop=1900.)

# let order fill
time.sleep(1)

# see the positions
print("Positions")
print(ibConn.positions)

# disconnect
ibConn.disconnect()

Submit a Bracket Order & Move Stop Manually:

import ezibpy
import time

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()
ibConn.connect(clientId=100, host="localhost", port=4001)

# create a contract
contract = ibConn.createFutureContract("ES", exchange="GLOBEX", expiry="201609")

# submit a bracket order (entry=0 = MKT order)
order = ibc.createBracketOrder(contract, quantity=1, entry=0, target=2200., stop=1900.)

# let order fill
time.sleep(1)

# see the positions
print("Positions")
print(ibConn.positions)

# move the stop
order['stopOrderId'] = ibConn.modifyStopOrder(orderId=order['stopOrderId'],
            parentId=order['entryOrderId'], newStop=2000, quantity=-1)


# disconnect
ibConn.disconnect()

Submit a Bracket Order with a Trailing Stop:

import ezibpy
import time

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()
ibConn.connect(clientId=100, host="localhost", port=4001)

# create a contract
contract = ibConn.createFutureContract("ES", exchange="GLOBEX", expiry="201609")

# submit a bracket order (entry=0 = MKT order)
order = ibc.createBracketOrder(contract, quantity=1, entry=0, target=2200., stop=1900.)

# let order fill
time.sleep(1)

# see the positions
print("Positions")
print(ibConn.positions)

# create a trailing stop that's triggered at 2190
symbol = ibConn.contractString(contract)

ibConn.createTriggerableTrailingStop(symbol, -1,
            triggerPrice  = 2190,
            trailAmount   = 10, # for trail using fixed amount
            # trailPercent  = 10, # for trail using percentage
            parentId      = 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()

Other stuff:

import ezibpy
import time

# initialize ezIBpy
ibConn = ezibpy.ezIBpy()
ibConn.connect(clientId=100, host="localhost", port=4001)

# subscribe to account/position updates
ibConn.requestPositionUpdates(subscribe=True)
ibConn.requestAccountUpdates(subscribe=True)

# wait 30 seconds
time.sleep(30)

# 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 updates
ibConn.requestPositionUpdates(subscribe=False)
ibConn.requestAccountUpdates(subscribe=False)

# disconnect
ibConn.disconnect()

Installation

First, install Troy Melhase’s IbPy:

$ pip install --user git+https://github.com/blampe/IbPy/archive/master.zip

Then, install ezIBpy using pip:

$ pip install --user git+https://github.com/ranaroussi/ezibpy/archive/master.zip

Requirements

  • Python >=3.4

  • Pandas (tested to work with >=0.18.1)

  • IbPy (tested to work with >=0.7.2-9.00)

  • Latest Interactive Brokers’ TWS or IB Gateway installed and running on the machine

To-Do:

In regards to Options, ezIBpy currently supports market data retrieval and order execution. IV, Greeks, and other Option-related data isn’t being procesed by ezIBpy.

If you want to add this functionality, be my guest and please submit a pull request.

P.S.

I’m very interested in your experience with ezIBpy. Please drop me an note with any feedback you have.

Ran Aroussi

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ezIBpy-1.12.6.tar.gz (18.8 kB view details)

Uploaded Source

File details

Details for the file ezIBpy-1.12.6.tar.gz.

File metadata

  • Download URL: ezIBpy-1.12.6.tar.gz
  • Upload date:
  • Size: 18.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for ezIBpy-1.12.6.tar.gz
Algorithm Hash digest
SHA256 baca18e58bf9f3be3a237bbc58a50fa4820039f9cc06f5bdf8c3ad9a8de18e86
MD5 a28373244a8832eaa767c683e5051f7c
BLAKE2b-256 f56c3f020115b9a111b3a93140fb0172263fa5131880a65b2f8f9d3bbbcfffbb

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page