Skip to content
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
163 lines (116 sloc) 4.25 KB
@author: jev kuznetsov
Demonstrate submitting an combo order
As an example a three legged order of SPY,XLE and APPL is being submitted.
taken from IB Api example at
from time import sleep
from ib.ext.ComboLeg import ComboLeg
from ib.ext.Contract import Contract
from ib.opt import ibConnection
from ib.ext.Order import Order
# sign function
sign = lambda a: (a>0) - (a<0)
def createContract(symbol):
''' create contract object '''
c = Contract()
c.m_symbol = symbol
c.m_secType= "STK"
c.m_exchange = "SMART"
c.m_currency = "USD"
return c
def createOrder(orderId,shares,limit = None, transmit=0):
create order object
orderId : The order Id. You must specify a unique value.
When the order status returns, it will be identified by this tag.
This tag is also used when canceling the order.
shares: number of shares to buy or sell. Negative for sell order.
limit : price limit, None for MKT order
transmit: transmit immideatelly from tws
action = {-1:'SELL',1:'BUY'}
o = Order()
o.m_orderId = orderId
o.m_action = action[sign(shares)]
o.m_totalQuantity = abs(shares)
o.m_transmit = transmit
if limit is not None:
o.m_orderType = 'LMT'
o.m_lmtPrice = limit
o.m_orderType = 'MKT'
return o
class MessageHandler(object):
''' class for handling incoming messages '''
def __init__(self,tws):
''' create class, provide ibConnection object as parameter '''
self.nextValidOrderId = None
self.reqId = -1 # last request Id
self.conId = None # container for received contract details
def contractDetails(self,msg):
print('got cotract details:')
self.reqId = msg.reqId
self.conId = msg.contractDetails.m_summary.m_conId
def nextValidIdHandler(self,msg):
''' handles NextValidId messages '''
self.nextValidOrderId = msg.orderId
def debugHandler(self,msg):
""" function to print messages """
def printFull(c):
""" prints full details of a conttract"""
keys = [k for k in dir(c) if k[0] != '_']
for key in keys:
print(key, getattr(c,key))
#-----------Main script-----------------
if 'tws' not in locals(): #
tws = ibConnection() # create connection object
handler = MessageHandler(tws) # message handling class
tws.connect() # connect to API
sleep(1) # wait for nextOrderId to come in
orderId = handler.nextValidOrderId # numeric order id, must be unique.
print('Next valid order id: ', orderId)
#----------------- create contracts
symbols = ['SPY','XLE']
contracts = [createContract(symbol) for symbol in symbols]
#----------------- get contract data
contractIds = []
for requestId, contract in enumerate(contracts):
print('Requesting ', contract.m_symbol)
sleep(1) # wait for data to come in
# safety check that request ids match
assert handler.reqId == requestId, 'Request and data do not match'
# ------------create contract legs
# for simplicity, I just set each leg to buy 1 share
legs = []
for conId in contractIds:
leg = ComboLeg()
leg.m_conId = conId
leg.m_ratio = 1
leg.m_action = "BUY"
leg.m_exchange = "SMART"
#-------- create a contract with required legs
contract = Contract()
contract.m_symbol = "USD"
contract.m_secType = "BAG"
contract.m_exchange = "SMART"
contract.m_currency = "USD"
contract.m_comboLegs = legs
#----- create and place order
print('Placing order')
order = createOrder(orderId,shares=1) # create order
tws.placeOrder(orderId, contract, order) # place order
sleep(1) # wait before disconnecting
print('All done')
You can’t perform that action at this time.