async def get_option_chain_details( self, underlying: Contract, min_expiry=None, max_expiry=None, min_strike=None, max_strike=None, kind=None, exchange=None, ) -> List[ContractDetails]: chains = await self._client.reqSecDefOptParamsAsync( underlying.symbol, "", underlying.secType, underlying.conId ) chain = one(chains) strikes = [ strike for strike in chain.strikes if (min_strike or -np.inf) <= strike <= (max_strike or np.inf) ] expirations = sorted( exp for exp in chain.expirations if (pd.Timestamp(min_expiry or pd.Timestamp.min) <= pd.Timestamp(exp)) and (pd.Timestamp(exp) <= pd.Timestamp(max_expiry or pd.Timestamp.max)) ) rights = [kind] if kind is not None else ["P", "C"] contracts = [ ib_insync.Option( underlying.symbol, expiration, strike, right, exchange or "SMART", ) for right in rights for expiration in expirations for strike in strikes ] qualified = await self._client.qualifyContractsAsync(*contracts) details = await asyncio.gather( *[self._client.reqContractDetailsAsync(contract=c) for c in qualified] ) return [x for d in details for x in d]
def get_option_chain(self): """ Handle interactions with API and raise related exceptions here """ self.connect_to_gateway() under = ib_insync.Index(self.config['SYMBOL'], 'CBOE') [under] = self.ib.qualifyContracts(under) self.ib.reqMarketDataType(2) [ticker] = self.ib.reqTickers(under) underValue = ticker.marketPrice() logger.info("Underlying value: {}".format(underValue)) chains = self.ib.reqSecDefOptParams(under.symbol, '', under.secType, under.conId) chain = next(c for c in chains if c.tradingClass == self.config['TRADING_CLASS'] and c.exchange == 'SMART') strikes = [strike for strike in chain.strikes if underValue*0.9 < strike < underValue*1.1] expirations = sorted(exp for exp in chain.expirations)[:3] logger.debug(expirations) rights = ['P', 'C'] contracts = [ib_insync.Option( self.config['SYMBOL'], expiration, strike, right, 'SMART', tradingClass=self.config['TRADING_CLASS']) for right in rights for expiration in expirations for strike in strikes] contracts = self.ib.qualifyContracts(*contracts) logger.info('Found {} contracts'.format(len(contracts))) tickers = self.ib.reqTickers(*contracts) self.save_option_chain(tickers) self.ib.disconnect()
def branco_strategy1(ib, db, accid): try: cnt = ibsync.Stock('VXX', 'SMART', 'USD') ib.qualifyContracts(cnt) pricevxx = ib.reqTickers(cnt)[0].marketPrice() chains = ib.reqSecDefOptParams(cnt.symbol, '', cnt.secType, cnt.conId) chain = next(c for c in chains if c.tradingClass == cnt.symbol and c.exchange == cf.myprefexchange) lexps = [] for e in chain.expirations: lexps.append(int(e)) desiredexpiration = (date.today() + timedelta(days=15)).strftime('%Y%m%d') expiration = min(lexps, key=lambda x: abs(int(x) - int(desiredexpiration))) strikes = [ strike for strike in chain.strikes if (pricevxx * 0.9 < strike < pricevxx * 1.1) ] contracts = [ ibsync.Option('VXX', expiration, strike, "C", 'SMART', tradingClass='VXX') for strike in strikes ] ib.qualifyContracts(*contracts) greeks = [ ibutil.get_greeks(ib, contract).modelGreeks for contract in contracts ] deltas = [greek.delta for greek in list(filter(None, greeks))] ishort = int( min(range(len(deltas)), key=lambda i: abs(deltas[i] - 0.7))) ilong = int(min(range(len(deltas)), key=lambda i: abs(deltas[i] - 0.3))) #combo = ibsync.Contract() #combo.symbol = "VXX" #combo.secType = "BAG" #combo.exchange = "SMART" #combo.currency = "USD" #leg1 = ibsync.ComboLeg () #leg1.conId = contracts[ishort] #leg1.ratio = 1 #leg1.action = "SELL" #leg1.exchange = "SMART" #leg2 = ibsync.ComboLeg() #leg2.conId = contracts[ilong] #leg2.ratio = 1 #leg2.action = "BUY" #leg2.exchange = "SMART" #combo.comboLegs = [] #combo.comboLegs.append(leg1) #combo.comboLegs.append(leg2) #order = ibsync.order.LimitOrder("BUY", 1, 1, tif="GTC", transmit=False) #trade = ib.placeOrder(combo, order) combo = ibsync.Contract(symbol='VXX', secType='BAG', exchange='SMART', currency='USD', comboLegs=[ ibsync.ComboLeg(conId=contracts[ishort], ratio=1, action='SELL', exchange='SMART'), ibsync.ComboLeg(conId=contracts[ilong], ratio=1, action='BUY', exchange='SMART') ]) trade = tradelimitorder(ib, db, combo, 1, 1, "BRANCO_1") order = ibsync.LimitOrder(action='SELL', totalQuantity=1, lmtPrice=1, transmit=False, account=accid) trade = ib.placeOrder(combo, order) print(trade) except Exception as err: # error_handling(err) raise
# get the connection IDs with open(root_path + 'var.yml') as f: data = yaml.safe_load(f) HOST = data["COMMON"]["HOST"] PORT = data[MARKET.upper()]["PORT"] CID = data["COMMON"]["CID"] # make the contract chains df_chains = pd.read_pickle(data_path + 'df_chains.pkl') puts = [ ib.Option(symbol=s, lastTradeDateOrContractMonth=e, strike=k, right='P', exchange=x) for s, e, k, x in zip(df_chains.symbol, df_chains.expiry, df_chains.strike, ['NSE' if MARKET.upper() == 'NSE' else 'SMART'] * len(df_chains)) ] calls = [ ib.Option(symbol=s, lastTradeDateOrContractMonth=e, strike=k, right='C', exchange=x) for s, e, k, x in zip(df_chains.symbol, df_chains.expiry, df_chains.strike, ['NSE' if MARKET.upper() == 'NSE' else 'SMART'] *
def placeOrders(): wb = xw.Book.caller() callingWorksheet = wb.sheets.active.name # Get the Excel cell address where "Positions to Close" table begins cellAddress = wb.sheets(callingWorksheet).tables[ callingWorksheet + 'OrderListTable'].data_body_range(1, 1).address # Pick up the "Positions to Close" ordersFromXL = wb.sheets(callingWorksheet).tables[ callingWorksheet + 'OrderListTable'].data_body_range.options(ndim=2).value # If the first cell of the "Positions to Close" is empty, raise error if ordersFromXL[0][0] == None or ordersFromXL[0][0].strip() == "": raise ValueError("No Orders to Submit") # Start a new IB connection ib = ibi.IB() ib.connect('127.0.0.1', getIbConnectionPort(callingWorksheet), clientId=4) # Place orders one at a time for order in ordersFromXL: # Create the entryOrder object if order[2].upper() == "LMT": entryOrder = ibi.LimitOrder( order[1], abs(int(order[6])), order[5], account=getSheetNameDict().get(callingWorksheet)) elif order[2].upper() == "MKT": entryOrder = ibi.MarketOrder( order[1], abs(int(order[6])), account=getSheetNameDict().get(callingWorksheet)) else: raise ValueError("Incorrect Order Type in " + order[0]) # Create the contract object if order[7].upper() == "STK": contract = ibi.Stock(order[8], 'SMART', 'USD', primaryExchange='NYSE') elif order[7].upper() == "OPT": contract = ibi.Option(order[8], "20" + order[9].strftime("%y%m%d"), order[10], order[11], 'SMART', multiplier=100, currency='USD') ib.qualifyContracts(contract) else: raise ValueError("Incorrect instrument type") ib.qualifyContracts(contract) trade = ib.placeOrder(contract, entryOrder) assert trade in ib.trades() # Disconnect from IB after placing the orders ib.disconnect()
if __name__ == '__main__': try: import besuga_ib_utilities as ibutil myib = ibsync.IB() mydb = ibutil.dbconnect("localhost", "besuga", "xarnaus", "Besuga8888") acc = input("triar entre 'besugapaper', 'xavpaper', 'mavpaper1', 'mavpaper2'") if acc == "besugapaper": rslt = execute_query(mydb,"SELECT connHost, connPort, connAccId FROM connections WHERE connName = 'besugapaper7498'") elif acc == "xavpaper": rslt = execute_query(mydb, "SELECT connHost, connPort, connAccId FROM connections WHERE connName = 'xavpaper7497'") elif acc == "mavpaper1": rslt = execute_query(mydb, "SELECT connHost, connPort, connAccId FROM connections WHERE connName = 'mavpaper1'") elif acc == "mavpaper2": rslt = execute_query(mydb, "SELECT connHost, connPort, connAccId FROM connections WHERE connName = 'mavpaper2'") else: sys.exit("Unknown account!!") myib.connect(rslt[0][0], rslt[0][1], 3) myaccId = rslt[0][2] #opt = ibsync.Stock(symbol="SHOP", exchange="SMART", currency="USD") opt = ibsync.Option(symbol="SHOP", exchange="SMART", currency="USD", lastTradeDateOrContractMonth = "20190726", strike = "310", right = "P") #myib.qualifyContracts(opt) print(get_greeks(myib, opt, "lastGreeks")) ibutil.dbcommit(mydb) ibutil.dbdisconnect(mydb) myib.disconnect() except Exception as err: error_handling(err) raise