Hi Community,
The below code is built in Python using ib_insync. The goal is the execute an option spread at the market price. Often options are illiquid so so if you buy a spread you could pay higher than midprice and if you sell a spread you could sell for less than midprice, potentially. That's why a SNAP to PRIM order is used here instead of SNAP to MID. Regardless, this code takes a few seconds to initialize and a few seconds to loop between each offset.
Is it because ib.reqMarketDataType and ib.reqTickers slows it down? Is there any way to speed this up?
##########################
from ib_insync import *
ib = IB()
ib.connect("127.0.0.1", 7497, clientId=4001)
maximum_limit_price = 11.5
spread_contract = Contract()
spread_contract.symbol = "AAPL"
spread_contract.secType = "BAG"
spread_contract.currency = "USD"
spread_contract.exchange = "SMART"
option1 = Option('AAPL', '20200327', 230.0, 'C', 'SMART', tradingClass='AAPL')
option2 = Option('AAPL', '20200327', 245.0, 'C', 'SMART', tradingClass='AAPL')
# ib.qualifyContracts(option2)
contracts = [option1, option2]
ib.qualifyContracts(*contracts)
leg1 = ComboLeg()
leg1.conId = option1.conId
leg1.ratio = 1
leg1.action = "BUY"
leg1.exchange = "SMART"
leg2 = ComboLeg()
leg2.conId = option2.conId
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "SMART"
spread_contract.comboLegs = []
spread_contract.comboLegs.append(leg1)
spread_contract.comboLegs.append(leg2)
print(spread_contract)
ib_order = Order()
ib_order.orderType = 'SNAP PRIM'
ib_order.action = 'BUY'
ib_order.totalQuantity = 5
i = 0
flag_loop = True
ib.reqMarketDataType(3)
data = ib.reqTickers(spread_contract)
offset = 0.5
while i < 15:
ib.reqMarketDataType(3)
data = ib.reqTickers(spread_contract)
limit_price = data[0].bid + offset
if limit_price < maximum_limit_price:
ib_order.auxPrice = offset
trade = ib.placeOrder(spread_contract, ib_order)
if trade.orderStatus.status == 'Filled':
print('', trade)
break
offset += 0.5
ib.sleep(2)
i += 1
The below code is built in Python using ib_insync. The goal is the execute an option spread at the market price. Often options are illiquid so so if you buy a spread you could pay higher than midprice and if you sell a spread you could sell for less than midprice, potentially. That's why a SNAP to PRIM order is used here instead of SNAP to MID. Regardless, this code takes a few seconds to initialize and a few seconds to loop between each offset.
Is it because ib.reqMarketDataType and ib.reqTickers slows it down? Is there any way to speed this up?
##########################
from ib_insync import *
ib = IB()
ib.connect("127.0.0.1", 7497, clientId=4001)
maximum_limit_price = 11.5
spread_contract = Contract()
spread_contract.symbol = "AAPL"
spread_contract.secType = "BAG"
spread_contract.currency = "USD"
spread_contract.exchange = "SMART"
option1 = Option('AAPL', '20200327', 230.0, 'C', 'SMART', tradingClass='AAPL')
option2 = Option('AAPL', '20200327', 245.0, 'C', 'SMART', tradingClass='AAPL')
# ib.qualifyContracts(option2)
contracts = [option1, option2]
ib.qualifyContracts(*contracts)
leg1 = ComboLeg()
leg1.conId = option1.conId
leg1.ratio = 1
leg1.action = "BUY"
leg1.exchange = "SMART"
leg2 = ComboLeg()
leg2.conId = option2.conId
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "SMART"
spread_contract.comboLegs = []
spread_contract.comboLegs.append(leg1)
spread_contract.comboLegs.append(leg2)
print(spread_contract)
ib_order = Order()
ib_order.orderType = 'SNAP PRIM'
ib_order.action = 'BUY'
ib_order.totalQuantity = 5
i = 0
flag_loop = True
ib.reqMarketDataType(3)
data = ib.reqTickers(spread_contract)
offset = 0.5
while i < 15:
ib.reqMarketDataType(3)
data = ib.reqTickers(spread_contract)
limit_price = data[0].bid + offset
if limit_price < maximum_limit_price:
ib_order.auxPrice = offset
trade = ib.placeOrder(spread_contract, ib_order)
if trade.orderStatus.status == 'Filled':
print('', trade)
break
offset += 0.5
ib.sleep(2)
i += 1