Beispiel #1
0
    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]
Beispiel #2
0
    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
Beispiel #4
0
# 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'] *
Beispiel #5
0
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()
Beispiel #6
0
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