Ejemplo n.º 1
0
    def submitOrder(self, order):
        if order.isInitial():

            ibContract = Contract()
            ibOrder = Order()

            ibContract.m_symbol = order.getInstrument()

            ibContract.m_secType = self.__marketOptions['assetType']
            ibContract.m_currency = self.__marketOptions['currency']
            ibContract.m_exchange = self.__marketOptions['routing']

            ibOrder.m_totalQuantity = order.getInstrumentTraits(
            ).roundQuantity(order.getQuantity())
            if order.getAction() == (broker.Order.Action.BUY
                                     or broker.Order.Action.BUY_TO_COVER):
                ibOrder.m_action = 'BUY'
            elif order.getAction() == broker.Order.Action.SELL:
                ibOrder.m_action = 'SELL'
            elif order.getAction() == broker.Order.Action.SELL_SHORT:
                ibOrder.m_action = 'SELL'

            if order.getType() == broker.Order.Type.MARKET:
                if order.getFillOnClose():
                    ibOrder.m_orderType = 'MOC'
                else:
                    ibOrder.m_orderType = 'MKT'
            elif order.getType() == broker.Order.Type.LIMIT:
                ibOrder.m_orderType = 'LMT'
                ibOrder.m_lmtPrice = order.getInstrumentTraits().roundPrice(
                    order.getLimitPrice())
            elif order.getType() == broker.Order.Type.STOP:
                ibOrder.m_orderType = 'STP'
                ibOrder.m_auxPrice = order.getInstrumentTraits().roundPrice(
                    order.getStopPrice())
            elif order.getType() == broker.Order.Type.STOP_LIMIT:
                ibOrder.m_orderType = 'STP LMT'
                ibOrder.m_lmtPrice = order.getInstrumentTraits().roundPrice(
                    order.getLimitPrice())
                ibOrder.m_auxPrice = order.getInstrumentTraits().roundPrice(
                    order.getStopPrice())

            if order.getAllOrNone() == True:
                ibOrder.m_allOrNone = 1
            else:
                ibOrder.m_allOrNone = 0

            if order.getGoodTillCanceled() == True:
                ibOrder.m_tif = 'GTC'
            else:
                ibOrder.m_tif = 'DAY'

            self.__ib.placeOrder(self.__nextOrderId, ibContract, ibOrder)

            order.setSubmitted(self.__nextOrderId, datetime.datetime.now())

            self.__nextOrderId += 1

            self._registerOrder(order)
            # Switch from INITIAL -> SUBMITTED
            # IMPORTANT: Do not emit an event for this switch because when using the position interface
            # the order is not yet mapped to the position and Position.onOrderUpdated will get called.
            order.switchState(broker.Order.State.SUBMITTED)
        else:
            raise Exception("The order was already processed")
Ejemplo n.º 2
0
    def processMsg(self, msgId):
        """ generated source for method processMsg """
        if msgId == -1:
            return False
        if msgId == self.TICK_PRICE:
            version = self.readInt()
            tickerId = self.readInt()
            tickType = self.readInt()
            price = self.readDouble()
            size = 0
            if version >= 2:
                size = self.readInt()
            if version >= 3:
                canAutoExecute = self.readInt()
            self.eWrapper().tickPrice(tickerId, tickType, price,
                                      canAutoExecute)
            if version >= 2:
                #  not a tick
                if tickType == 1:
                    #  BID
                    sizeTickType = 0
                    #  BID_SIZE
                elif tickType == 2:
                    #  ASK
                    sizeTickType = 3
                    #  ASK_SIZE
                elif tickType == 4:
                    #  LAST
                    sizeTickType = 5
                    #  LAST_SIZE
                if sizeTickType != -1:
                    self.eWrapper().tickSize(tickerId, sizeTickType, size)
        elif msgId == self.TICK_SIZE:
            self.eWrapper().tickSize(tickerId, tickType, size)
        elif msgId == self.TICK_OPTION_COMPUTATION:
            impliedVol = self.readDouble()
            if impliedVol < 0:
                #  -1 is the "not yet computed" indicator
                impliedVol = Double.MAX_VALUE
            delta = self.readDouble()
            if abs(delta) > 1:
                #  -2 is the "not yet computed" indicator
                delta = Double.MAX_VALUE
            if version >= 6 or tickType == TickType.MODEL_OPTION:
                #  introduced in version == 5
                optPrice = self.readDouble()
                if optPrice < 0:
                    #  -1 is the "not yet computed" indicator
                    optPrice = Double.MAX_VALUE
                pvDividend = self.readDouble()
                if pvDividend < 0:
                    #  -1 is the "not yet computed" indicator
                    pvDividend = Double.MAX_VALUE
            if version >= 6:
                gamma = self.readDouble()
                if abs(gamma) > 1:
                    #  -2 is the "not yet computed" indicator
                    gamma = Double.MAX_VALUE
                vega = self.readDouble()
                if abs(vega) > 1:
                    #  -2 is the "not yet computed" indicator
                    vega = Double.MAX_VALUE
                theta = self.readDouble()
                if abs(theta) > 1:
                    #  -2 is the "not yet computed" indicator
                    theta = Double.MAX_VALUE
                undPrice = self.readDouble()
                if undPrice < 0:
                    #  -1 is the "not yet computed" indicator
                    undPrice = Double.MAX_VALUE
            self.eWrapper().tickOptionComputation(tickerId, tickType,
                                                  impliedVol, delta, optPrice,
                                                  pvDividend, gamma, vega,
                                                  theta, undPrice)
        elif msgId == self.TICK_GENERIC:
            version = self.readInt()
            tickerId = self.readInt()
            tickType = self.readInt()
            value = self.readDouble()
            self.eWrapper().tickGeneric(tickerId, tickType, value)
        elif msgId == self.TICK_STRING:
            version = self.readInt()
            tickerId = self.readInt()
            tickType = self.readInt()
            value = self.readStr()
            self.eWrapper().tickString(tickerId, tickType, value)
        elif msgId == self.TICK_EFP:
            version = self.readInt()
            tickerId = self.readInt()
            tickType = self.readInt()
            basisPoints = self.readDouble()
            formattedBasisPoints = self.readStr()
            impliedFuturesPrice = self.readDouble()
            holdDays = self.readInt()
            futureExpiry = self.readStr()
            dividendImpact = self.readDouble()
            dividendsToExpiry = self.readDouble()
            self.eWrapper().tickEFP(tickerId, tickType, basisPoints,
                                    formattedBasisPoints, impliedFuturesPrice,
                                    holdDays, futureExpiry, dividendImpact,
                                    dividendsToExpiry)
        elif msgId == self.ORDER_STATUS:
            version = self.readInt()
            id = self.readInt()
            status = self.readStr()
            filled = self.readInt()
            remaining = self.readInt()
            avgFillPrice = self.readDouble()

            permId = 0
            if version >= 2:
                permId = self.readInt()
            if version >= 3:
                parentId = self.readInt()
            if version >= 4:
                lastFillPrice = self.readDouble()
            if version >= 5:
                clientId = self.readInt()
            if version >= 6:
                whyHeld = self.readStr()
            self.eWrapper().orderStatus(id, status, filled, remaining,
                                        avgFillPrice, permId, parentId,
                                        lastFillPrice, clientId, whyHeld)
        elif msgId == self.ACCT_VALUE:
            version = self.readInt()
            key = self.readStr()
            val = self.readStr()
            cur = self.readStr()
            accountName = None
            if version >= 2:
                accountName = self.readStr()
            self.eWrapper().updateAccountValue(key, val, cur, accountName)
        elif msgId == self.PORTFOLIO_VALUE:
            version = self.readInt()
            contract = Contract()
            if version >= 6:
                contract.m_conId = self.readInt()
            contract.m_symbol = self.readStr()
            contract.m_secType = self.readStr()
            contract.m_expiry = self.readStr()
            contract.m_strike = self.readDouble()
            contract.m_right = self.readStr()
            if version >= 7:
                contract.m_multiplier = self.readStr()
                contract.m_primaryExch = self.readStr()
            contract.m_currency = self.self.readStr()
            if version >= 2:
                contract.m_localSymbol = self.self.readStr()
            position = self.readInt()
            marketPrice = self.readDouble()
            marketValue = self.readDouble()
            averageCost = 0.0
            unrealizedPNL = 0.0
            realizedPNL = 0.0
            if version >= 3:
                averageCost = self.readDouble()
                unrealizedPNL = self.readDouble()
                realizedPNL = self.readDouble()
            if version >= 4:
                accountName = self.readStr()
            if version == 6 and self.m_parent.serverVersion() == 39:
                contract.m_primaryExch = self.readStr()
            self.eWrapper().updatePortfolio(contract, position, marketPrice,
                                            marketValue, averageCost,
                                            unrealizedPNL, realizedPNL,
                                            accountName)
        elif msgId == self.ACCT_UPDATE_TIME:
            version = self.readInt()
            timeStamp = self.readStr()
            self.eWrapper().updateAccountTime(timeStamp)
        elif msgId == self.ERR_MSG:
            version = self.readInt()
            if version < 2:
                msg = self.readStr()
                self.m_parent.error(msg)
            else:
                id = self.readInt()
                errorCode = self.readInt()
                errorMsg = self.readStr()
                self.m_parent.error(id, errorCode, errorMsg)
        elif msgId == self.OPEN_ORDER:
            #  read version
            version = self.readInt()
            #  read order id
            order = Order()
            order.m_orderId = self.readInt()
            #  read contract fields
            if version >= 17:
                contract.m_conId = self.readInt()
            contract.m_symbol = self.readStr()
            contract.m_secType = self.readStr()
            contract.m_expiry = self.readStr()
            contract.m_strike = self.readDouble()
            contract.m_right = self.readStr()
            contract.m_exchange = self.readStr()
            contract.m_currency = self.readStr()
            if version >= 2:
                contract.m_localSymbol = self.readStr()
            #  read order fields
            order.m_action = self.readStr()
            order.m_totalQuantity = self.readInt()
            order.m_orderType = self.readStr()
            if version < 29:
                order.m_lmtPrice = self.readDouble()
            else:
                order.m_lmtPrice = self.readDoubleMax()
            if version < 30:
                order.m_auxPrice = self.readDouble()
            else:
                order.m_auxPrice = self.readDoubleMax()
            order.m_tif = self.readStr()
            order.m_ocaGroup = self.readStr()
            order.m_account = self.readStr()
            order.m_openClose = self.readStr()
            order.m_origin = self.readInt()
            order.m_orderRef = self.readStr()
            if version >= 3:
                order.m_clientId = self.readInt()
            if version >= 4:
                order.m_permId = self.readInt()
                if version < 18:
                    #  will never happen
                    #  order.m_ignoreRth =
                    self.readBoolFromInt()
                else:
                    order.m_outsideRth = self.readBoolFromInt()
                order.m_hidden = self.readInt() == 1
                order.m_discretionaryAmt = self.readDouble()
            if version >= 5:
                order.m_goodAfterTime = self.readStr()
            if version >= 6:
                #  skip deprecated sharesAllocation field
                self.readStr()
            if version >= 7:
                order.m_faGroup = self.readStr()
                order.m_faMethod = self.readStr()
                order.m_faPercentage = self.readStr()
                order.m_faProfile = self.readStr()
            if version >= 8:
                order.m_goodTillDate = self.readStr()
            if version >= 9:
                order.m_rule80A = self.readStr()
                order.m_percentOffset = self.readDoubleMax()
                order.m_settlingFirm = self.readStr()
                order.m_shortSaleSlot = self.readInt()
                order.m_designatedLocation = self.readStr()
                if self.m_parent.serverVersion() == 51:
                    self.readInt()
                    #  exemptCode
                elif version >= 23:
                    order.m_exemptCode = self.readInt()
                order.m_auctionStrategy = self.readInt()
                order.m_startingPrice = self.readDoubleMax()
                order.m_stockRefPrice = self.readDoubleMax()
                order.m_delta = self.readDoubleMax()
                order.m_stockRangeLower = self.readDoubleMax()
                order.m_stockRangeUpper = self.readDoubleMax()
                order.m_displaySize = self.readInt()
                if version < 18:
                    #  will never happen
                    #  order.m_rthOnly =
                    self.readBoolFromInt()
                order.m_blockOrder = self.readBoolFromInt()
                order.m_sweepToFill = self.readBoolFromInt()
                order.m_allOrNone = self.readBoolFromInt()
                order.m_minQty = self.readIntMax()
                order.m_ocaType = self.readInt()
                order.m_eTradeOnly = self.readBoolFromInt()
                order.m_firmQuoteOnly = self.readBoolFromInt()
                order.m_nbboPriceCap = self.readDoubleMax()
            if version >= 10:
                order.m_parentId = self.readInt()
                order.m_triggerMethod = self.readInt()
            if version >= 11:
                order.m_volatility = self.readDoubleMax()
                order.m_volatilityType = self.readInt()
                if version == 11:
                    receivedInt = self.readInt()
                    order.m_deltaNeutralOrderType = ("NONE" if
                                                     (receivedInt
                                                      == 0) else "MKT")
                else:
                    #  version 12 and up
                    order.m_deltaNeutralOrderType = self.readStr()
                    order.m_deltaNeutralAuxPrice = self.readDoubleMax()
                    if version >= 27 and not Util.StringIsEmpty(
                            order.m_deltaNeutralOrderType):
                        order.m_deltaNeutralConId = self.readInt()
                        order.m_deltaNeutralSettlingFirm = self.readStr()
                        order.m_deltaNeutralClearingAccount = self.readStr()
                        order.m_deltaNeutralClearingIntent = self.readStr()
                order.m_continuousUpdate = self.readInt()
                if self.m_parent.serverVersion() == 26:
                    order.m_stockRangeLower = self.readDouble()
                    order.m_stockRangeUpper = self.readDouble()
                order.m_referencePriceType = self.readInt()
            if version >= 13:
                order.m_trailStopPrice = self.readDoubleMax()
            if version >= 30:
                order.m_trailingPercent = self.readDoubleMax()
            if version >= 14:
                order.m_basisPoints = self.readDoubleMax()
                order.m_basisPointsType = self.readIntMax()
                contract.m_comboLegsDescrip = self.readStr()
            if version >= 29:
                comboLegsCount = self.readInt()
                if comboLegsCount > 0:
                    contract.m_comboLegs = []
                    i = 0
                    while i < comboLegsCount:
                        conId = self.readInt()
                        ratio = self.readInt()
                        action = self.readStr()
                        exchange = self.readStr()
                        openClose = self.readInt()
                        shortSaleSlot = self.readInt()
                        designatedLocation = self.readStr()
                        exemptCode = self.readInt()
                        comboLeg = ComboLeg(conId, ratio, action, exchange,
                                            openClose, shortSaleSlot,
                                            designatedLocation, exemptCode)
                        contract.m_comboLegs.append(comboLeg)
                        i += 1
                orderComboLegsCount = self.readInt()
                if orderComboLegsCount > 0:
                    order.m_orderComboLegs = []
                    i = 0
                    while i < orderComboLegsCount:
                        price = self.readDoubleMax()
                        orderComboLeg = OrderComboLeg(price)
                        order.m_orderComboLegs.append(orderComboLeg)
                        i += 1
            if version >= 26:
                smartComboRoutingParamsCount = self.readInt()
                if smartComboRoutingParamsCount > 0:
                    order.m_smartComboRoutingParams = []
                    i = 0
                    while i < smartComboRoutingParamsCount:
                        tagValue = TagValue()
                        tagValue.m_tag = self.readStr()
                        tagValue.m_value = self.readStr()
                        order.m_smartComboRoutingParams.add(tagValue)
                        i += 1
            if version >= 15:
                if version >= 20:
                    order.m_scaleInitLevelSize = self.readIntMax()
                    order.m_scaleSubsLevelSize = self.readIntMax()
                else:
                    #  int notSuppScaleNumComponents =
                    self.readIntMax()
                    order.m_scaleInitLevelSize = self.readIntMax()
                order.m_scalePriceIncrement = self.readDoubleMax()
            if version >= 28 and order.m_scalePriceIncrement > 0.0 and order.m_scalePriceIncrement != Double.MAX_VALUE:
                order.m_scalePriceAdjustValue = self.readDoubleMax()
                order.m_scalePriceAdjustInterval = self.readIntMax()
                order.m_scaleProfitOffset = self.readDoubleMax()
                order.m_scaleAutoReset = self.readBoolFromInt()
                order.m_scaleInitPosition = self.readIntMax()
                order.m_scaleInitFillQty = self.readIntMax()
                order.m_scaleRandomPercent = self.readBoolFromInt()
            if version >= 24:
                order.m_hedgeType = self.readStr()
                if not Util.StringIsEmpty(order.m_hedgeType):
                    order.m_hedgeParam = self.readStr()
            if version >= 25:
                order.m_optOutSmartRouting = self.readBoolFromInt()
            if version >= 19:
                order.m_clearingAccount = self.readStr()
                order.m_clearingIntent = self.readStr()
            if version >= 22:
                order.m_notHeld = self.readBoolFromInt()
            if version >= 20:
                if self.readBoolFromInt():
                    underComp = UnderComp()
                    underComp.m_conId = self.readInt()
                    underComp.m_delta = self.readDouble()
                    underComp.m_price = self.readDouble()
                    contract.m_underComp = underComp
            if version >= 21:
                order.m_algoStrategy = self.readStr()
                if not Util.StringIsEmpty(order.m_algoStrategy):
                    algoParamsCount = self.readInt()
                    if algoParamsCount > 0:
                        order.m_algoParams = []
                        i = 0
                        while i < algoParamsCount:
                            tagValue.m_tag = self.readStr()
                            tagValue.m_value = self.readStr()
                            order.m_algoParams.append(tagValue)
                            i += 1

            orderState = OrderState()
            if version >= 16:
                order.m_whatIf = self.readBoolFromInt()
                orderState.m_status = self.readStr()
                orderState.m_initMargin = self.readStr()
                orderState.m_maintMargin = self.readStr()
                orderState.m_equityWithLoan = self.readStr()
                orderState.m_commission = self.readDoubleMax()
                orderState.m_minCommission = self.readDoubleMax()
                orderState.m_maxCommission = self.readDoubleMax()
                orderState.m_commissionCurrency = self.readStr()
                orderState.m_warningText = self.readStr()
            self.eWrapper().openOrder(order.m_orderId, contract, order,
                                      orderState)
        elif msgId == self.NEXT_VALID_ID:
            version = self.readInt()
            orderId = self.readInt()
            self.eWrapper().nextValidId(orderId)
        elif msgId == self.SCANNER_DATA:
            contract = ContractDetails()
            version = self.readInt()
            tickerId = self.readInt()
            numberOfElements = self.readInt()
            ctr = 0
            while ctr < numberOfElements:
                rank = self.readInt()
                if version >= 3:
                    contract.m_summary.m_conId = self.readInt()
                contract.m_summary.m_symbol = self.readStr()
                contract.m_summary.m_secType = self.readStr()
                contract.m_summary.m_expiry = self.readStr()
                contract.m_summary.m_strike = self.readDouble()
                contract.m_summary.m_right = self.readStr()
                contract.m_summary.m_exchange = self.readStr()
                contract.m_summary.m_currency = self.readStr()
                contract.m_summary.m_localSymbol = self.readStr()
                contract.m_marketName = self.readStr()
                contract.m_tradingClass = self.readStr()
                distance = self.readStr()
                benchmark = self.readStr()
                projection = self.readStr()
                legsStr = None
                if version >= 2:
                    legsStr = self.readStr()
                self.eWrapper().scannerData(tickerId, rank, contract, distance,
                                            benchmark, projection, legsStr)
                ctr += 1
            self.eWrapper().scannerDataEnd(tickerId)
        elif msgId == self.CONTRACT_DATA:
            if version >= 3:
                reqId = self.readInt()
            contract.m_summary.m_symbol = self.readStr()
            contract.m_summary.m_secType = self.readStr()
            contract.m_summary.m_expiry = self.readStr()
            contract.m_summary.m_strike = self.readDouble()
            contract.m_summary.m_right = self.readStr()
            contract.m_summary.m_exchange = self.readStr()
            contract.m_summary.m_currency = self.readStr()
            contract.m_summary.m_localSymbol = self.readStr()
            contract.m_marketName = self.readStr()
            contract.m_tradingClass = self.readStr()
            contract.m_summary.m_conId = self.readInt()
            contract.m_minTick = self.readDouble()
            contract.m_summary.m_multiplier = self.readStr()
            contract.m_orderTypes = self.readStr()
            contract.m_validExchanges = self.readStr()
            if version >= 2:
                contract.m_priceMagnifier = self.readInt()
            if version >= 4:
                contract.m_underConId = self.readInt()
            if version >= 5:
                contract.m_longName = self.readStr()
                contract.m_summary.m_primaryExch = self.readStr()
            if version >= 6:
                contract.m_contractMonth = self.readStr()
                contract.m_industry = self.readStr()
                contract.m_category = self.readStr()
                contract.m_subcategory = self.readStr()
                contract.m_timeZoneId = self.readStr()
                contract.m_tradingHours = self.readStr()
                contract.m_liquidHours = self.readStr()
            if version >= 8:
                contract.m_evRule = self.readStr()
                contract.m_evMultiplier = self.readDouble()
            if version >= 7:
                secIdListCount = self.readInt()
                if secIdListCount > 0:
                    contract.m_secIdList = []
                    while i < secIdListCount:
                        tagValue.m_tag = self.readStr()
                        tagValue.m_value = self.readStr()
                        contract.m_secIdList.append(tagValue)
                        i += 1
            self.eWrapper().contractDetails(reqId, contract)
        elif msgId == self.BOND_CONTRACT_DATA:
            if version >= 3:
                reqId = self.readInt()
            contract.m_summary.m_symbol = self.readStr()
            contract.m_summary.m_secType = self.readStr()
            contract.m_cusip = self.readStr()
            contract.m_coupon = self.readDouble()
            contract.m_maturity = self.readStr()
            contract.m_issueDate = self.readStr()
            contract.m_ratings = self.readStr()
            contract.m_bondType = self.readStr()
            contract.m_couponType = self.readStr()
            contract.m_convertible = self.readBoolFromInt()
            contract.m_callable = self.readBoolFromInt()
            contract.m_putable = self.readBoolFromInt()
            contract.m_descAppend = self.readStr()
            contract.m_summary.m_exchange = self.readStr()
            contract.m_summary.m_currency = self.readStr()
            contract.m_marketName = self.readStr()
            contract.m_tradingClass = self.readStr()
            contract.m_summary.m_conId = self.readInt()
            contract.m_minTick = self.readDouble()
            contract.m_orderTypes = self.readStr()
            contract.m_validExchanges = self.readStr()
            if version >= 2:
                contract.m_nextOptionDate = self.readStr()
                contract.m_nextOptionType = self.readStr()
                contract.m_nextOptionPartial = self.readBoolFromInt()
                contract.m_notes = self.readStr()
            if version >= 4:
                contract.m_longName = self.readStr()
            if version >= 6:
                contract.m_evRule = self.readStr()
                contract.m_evMultiplier = self.readDouble()
            if version >= 5:
                if secIdListCount > 0:
                    contract.m_secIdList = []
                    while i < secIdListCount:
                        tagValue.m_tag = self.readStr()
                        tagValue.m_value = self.readStr()
                        contract.m_secIdList.append(tagValue)
                        i += 1
            self.eWrapper().bondContractDetails(reqId, contract)
        elif msgId == self.EXECUTION_DATA:
            if version >= 7:
                reqId = self.readInt()
            #  read contract fields
            if version >= 5:
                contract.m_conId = self.readInt()
            contract.m_symbol = self.readStr()
            contract.m_secType = self.readStr()
            contract.m_expiry = self.readStr()
            contract.m_strike = self.readDouble()
            contract.m_right = self.readStr()
            if version >= 9:
                contract.m_multiplier = self.readStr()
            contract.m_exchange = self.readStr()
            contract.m_currency = self.readStr()
            contract.m_localSymbol = self.readStr()
            exec_ = Execution()
            exec_.m_orderId = orderId
            exec_.m_execId = self.readStr()
            exec_.m_time = self.readStr()
            exec_.m_acctNumber = self.readStr()
            exec_.m_exchange = self.readStr()
            exec_.m_side = self.readStr()
            exec_.m_shares = self.readInt()
            exec_.m_price = self.readDouble()
            if version >= 2:
                exec_.m_permId = self.readInt()
            if version >= 3:
                exec_.m_clientId = self.readInt()
            if version >= 4:
                exec_.m_liquidation = self.readInt()
            if version >= 6:
                exec_.m_cumQty = self.readInt()
                exec_.m_avgPrice = self.readDouble()
            if version >= 8:
                exec_.m_orderRef = self.readStr()
            if version >= 9:
                exec_.m_evRule = self.readStr()
                exec_.m_evMultiplier = self.readDouble()
            self.eWrapper().execDetails(reqId, contract, exec_)
        elif msgId == self.MARKET_DEPTH:
            version = self.readInt()
            id = self.readInt()
            position = self.readInt()
            operation = self.readInt()
            side = self.readInt()
            price = self.readDouble()
            size = self.readInt()
            self.eWrapper().updateMktDepth(id, position, operation, side,
                                           price, size)
        elif msgId == self.MARKET_DEPTH_L2:
            version = self.readInt()
            id = self.readInt()
            position = self.readInt()
            marketMaker = self.readStr()
            operation = self.readInt()
            side = self.readInt()
            price = self.readDouble()
            size = self.readInt()
            self.eWrapper().updateMktDepthL2(id, position, marketMaker,
                                             operation, side, price, size)
        elif msgId == self.NEWS_BULLETINS:
            version = self.readInt()
            newsMsgId = self.readInt()
            newsMsgType = self.readInt()
            newsMessage = self.readStr()
            originatingExch = self.readStr()
            self.eWrapper().updateNewsBulletin(newsMsgId, newsMsgType,
                                               newsMessage, originatingExch)
        elif msgId == self.MANAGED_ACCTS:
            version = self.readInt()
            accountsList = self.readStr()
            self.eWrapper().managedAccounts(accountsList)
        elif msgId == self.RECEIVE_FA:
            version = self.readInt()
            faDataType = self.readInt()
            xml = self.readStr()
            self.eWrapper().receiveFA(faDataType, xml)
        elif msgId == self.HISTORICAL_DATA:
            if version >= 2:
                startDateStr = self.readStr()
                endDateStr = self.readStr()
                completedIndicator = "finished"
                completedIndicator += "-" + startDateStr + "-" + endDateStr
            itemCount = self.readInt()
            ctr = 0
            while ctr < itemCount:
                date = self.readStr()
                open = self.readDouble()
                high = self.readDouble()
                low = self.readDouble()
                close = self.readDouble()
                volume = self.readInt()
                WAP = self.readDouble()
                hasGaps = self.readStr()
                barCount = -1
                if version >= 3:
                    barCount = self.readInt()
                self.eWrapper().historicalData(
                    reqId, date, open, high, low, close, volume, barCount, WAP,
                    Boolean.valueOf(hasGaps).booleanValue())
                ctr += 1
            #  send end of dataset marker
            self.eWrapper().historicalData(reqId, completedIndicator, -1, -1,
                                           -1, -1, -1, -1, -1, False)
        elif msgId == self.SCANNER_PARAMETERS:
            self.eWrapper().scannerParameters(xml)
        elif msgId == self.CURRENT_TIME:
            # int version =
            self.readInt()
            time = self.readLong()
            self.eWrapper().currentTime(time)
        elif msgId == self.REAL_TIME_BARS:
            # int version =
            self.readInt()
            reqId = self.readInt()
            time = self.readLong()
            open = self.readDouble()
            high = self.readDouble()
            low = self.readDouble()
            close = self.readDouble()
            volume = self.readLong()
            wap = self.readDouble()
            count = self.readInt()
            self.eWrapper().realtimeBar(reqId, time, open, high, low, close,
                                        volume, wap, count)
        elif msgId == self.FUNDAMENTAL_DATA:
            # int version =
            self.readInt()
            reqId = self.readInt()
            data = self.readStr()
            self.eWrapper().fundamentalData(reqId, data)
        elif msgId == self.CONTRACT_DATA_END:
            # int version =
            self.readInt()
            reqId = self.readInt()
            self.eWrapper().contractDetailsEnd(reqId)
        elif msgId == self.OPEN_ORDER_END:
            # int version =
            self.readInt()
            self.eWrapper().openOrderEnd()
        elif msgId == self.ACCT_DOWNLOAD_END:
            # int version =
            self.readInt()
            accountName = self.readStr()
            self.eWrapper().accountDownloadEnd(accountName)
        elif msgId == self.EXECUTION_DATA_END:
            # int version =
            self.readInt()
            reqId = self.readInt()
            self.eWrapper().execDetailsEnd(reqId)
        elif msgId == self.DELTA_NEUTRAL_VALIDATION:
            # int version =
            self.readInt()
            underComp = UnderComp()
            underComp.m_conId = self.readInt()
            underComp.m_delta = self.readDouble()
            underComp.m_price = self.readDouble()
            self.eWrapper().deltaNeutralValidation(reqId, underComp)
        elif msgId == self.TICK_SNAPSHOT_END:
            # int version =
            self.readInt()
            reqId = self.readInt()
            self.eWrapper().tickSnapshotEnd(reqId)
        elif msgId == self.MARKET_DATA_TYPE:
            # int version =
            self.readInt()
            marketDataType = self.readInt()
            self.eWrapper().marketDataType(reqId, marketDataType)
        elif msgId == self.COMMISSION_REPORT:
            # int version =
            self.readInt()
            commissionReport = CommissionReport()
            commissionReport.m_execId = self.readStr()
            commissionReport.m_commission = self.readDouble()
            commissionReport.m_currency = self.readStr()
            commissionReport.m_realizedPNL = self.readDouble()
            commissionReport.m_yield = self.readDouble()
            commissionReport.m_yieldRedemptionDate = self.readInt()
            self.eWrapper().commissionReport(commissionReport)
        else:
            self.m_parent.error(EClientErrors.NO_VALID_ID,
                                EClientErrors.UNKNOWN_ID.code_(),
                                EClientErrors.UNKNOWN_ID.msg())
            return False
        return True
Ejemplo n.º 3
0
def place_order(order_list):
    """ Auto-detects which args should be assigned to a new Contract or Order, then use to place order.
    Makes use of globals to set initial values, but allows args to override (ie clientId)

    To modify and order, the following parameters are needed (IB won't complain if some of these are missing, but the
    order update won't succeed):
    * orderId
    * exchange
    * totalQuantity
    * secType
    * action
    * orderType AND related paramters (ie TRAIL needs trailingPercent)
    * symbol
    * currency
    * exchange
    """
    log.debug('Starting place_order with args_list: {}'.format(order_list))
    client = connection.get_client(0)
    if client is None:
        connection.close_client(client)
        return g.error_resp[-2]
    elif client.isConnected() is False:
        return g.error_resp[-1]

    # To allow for bracketed orders (or processing a string of orders in a single request), we expect args to be a list
    if not isinstance(order_list, list):
        order_list = [order_list]

    parentId = None
    order_ids = set()
    dont_wait_order_ids = set(
    )  # Some orders aren't worth waiting for responses on
    for args in order_list:
        # If an orderId was provided, we'll be updating an existing order, so only send attributes which are updatable:
        # totalQuantity, orderType, symbol, secType, action
        # TODO consider casting unicode to utf-8 here.  Otherwise we get error(id=1, errorCode=512, errorMsg=Order Sending Error - char format require string of length 1)
        # log.debug('Processing args from order_list: {}'.format(args))
        orderId = args.get('orderId', None)
        if orderId is None:
            orderId = g.orderId
            g.orderId += 1
        order_ids.add(orderId)
        if 'goodAfterTime' in args:
            dont_wait_order_ids.add(orderId)
        contract = Contract()
        order = Order()

        # Populate contract with appropriate args
        for attr in dir(contract):
            if attr[:2] == 'm_' and attr[2:] in args:
                setattr(contract, attr, args[attr[2:]])
        # Populate order with appropriate
        order.m_clientId = client.clientId
        for attr in dir(order):
            if attr[:2] == 'm_' and attr[2:] in args:
                setattr(order, attr, args[attr[2:]])

        # If this is a bracketed order, we'll need to add in the parentId for children orders
        if parentId:
            order.m_parentId = parentId

        log.debug(
            'Placing order # {} on client # {} (connected={}): {}'.format(
                orderId, client.clientId, client.isConnected(), args))
        client.placeOrder(orderId, contract, order)
        # Assume our 1st order in the list is the parent.  Use this for remaining bracket orders and also error handling
        if not parentId:
            parentId = orderId
            log.debug('Setting child order parentId={}'.format(parentId))

    log.debug('Ignoring responses for these orderIds: {}'.format(
        dont_wait_order_ids))
    order_ids = order_ids - dont_wait_order_ids

    # Don't look for order status or errors until we actually transmit the last order, but then look for status for
    # all order_ids
    timeout = g.timeout
    resp = wait_for_responses(order_ids, client, timeout)
    connection.close_client(client)
    return resp
Ejemplo n.º 4
0
def place_order_oca(order_list):
    """ Places a Bracket-like OCA set of orders.

    The 1st item in `order_list` is to open a position, and all remaining orders in list
    are an OCA group to close the position.  IBREST creates the OCA group name by using the orderId.

    Auto-detects which args should be assigned to a new Contract or Order, then use to place order.
    Makes use of globals to set initial values, but allows args to override (ie clientId)

    To modify and order, the following parameters are needed (IB won't complain if some of these are missing, but the
    order update won't succeed):
    * orderId
    * exchange
    * totalQuantity
    * secType
    * action
    * orderType AND related paramters (ie TRAIL needs trailingPercent)
    * symbol
    * currency
    * exchange


    Setting `oca` to True implies
    """
    log.debug('Starting place_order_oca with args_list: {}'.format(order_list))
    client = connection.get_client(0)
    if client is None:
        connection.close_client(client)
        return g.error_resp[-2]
    elif client.isConnected() is False:
        return g.error_resp[-1]

    # To allow for bracketed orders (or processing a string of orders in a single request), we expect args to be a list
    if not isinstance(order_list, list):
        log.error('place_order_oca requires list of orders')
        return

    # Our 1st order in the list opens a position.  The rest close it, but are only placed once the 1st order is Filled.
    oca_list = []
    ocaGroup = None
    order_ids = set()
    dont_wait_order_ids = set(
    )  # Some orders aren't worth waiting for responses on
    for args in order_list:
        # If an orderId was provided, we'll be updating an existing order, so only send attributes which are updatable:
        # totalQuantity, orderType, symbol, secType, action
        # TODO consider casting unicode to utf-8 here.  Otherwise we get error(id=1, errorCode=512, errorMsg=Order Sending Error - char format require string of length 1)
        # log.debug('Processing args from order_list: {}'.format(args))
        orderId = args.get('orderId', None)
        if orderId is None:
            orderId = g.orderId
            g.orderId += 1
        if 'goodAfterTime' in args:
            dont_wait_order_ids.add(orderId)
        contract = Contract()
        order = Order()

        # Populate contract with appropriate args
        for attr in dir(contract):
            if attr[:2] == 'm_' and attr[2:] in args:
                setattr(contract, attr, args[attr[2:]])
        # Populate order with appropriate
        order.m_clientId = client.clientId
        for attr in dir(order):
            if attr[:2] == 'm_' and attr[2:] in args:
                setattr(order, attr, args[attr[2:]])

        # If this is a bracketed order, we'll need to add in the ocaGroup for children orders
        if ocaGroup:
            # Use our ocaGroup as the OCA group name.
            # The 1st order won't have this because its an Open order
            # All remaining orders are Close orders in an OCA group, which we'll store to file for later use
            order_ids.add(orderId)
            order.m_ocaType = 1
            order.m_ocaGroup = str(ocaGroup)
            oca_list.append((orderId, contract, order))
            # Don't actually place this OCA order just yet
            continue

        log.debug(
            'Placing Open order # {} on client # {} (connected={}): {}'.format(
                orderId, client.clientId, client.isConnected(), args))
        client.placeOrder(orderId, contract, order)
        # Assume our 1st order in the list is the parent.  Use this for remaining bracket orders and also error handling
        if not ocaGroup:
            ocaGroup = orderId
            log.debug('Setting ocaGroup={}'.format(ocaGroup))

    # The only response for placing an order is an error, so we'll check for open orders and wait for this orderId or
    # and error to show up.

    # At this point, our Open order has been placed.  Look for it to be Filled, then place OCA orders.
    # The User must set a goodTillDate on their open order to keep it from filling >1min into the future, or else this
    # function will have given up waiting for it to be filled, and not set the closing OCA group.
    resp = dict()

    timeout = 60 / 0.25

    order_ids = order_ids - dont_wait_order_ids
    # Make a 1-item set representing our Open postion order
    oca_set = set([ocaGroup])
    resp['open_resp'] = wait_for_responses(oca_set, client, timeout,
                                           ['Filled'])
    # Our open order is filled, so now place our OCA group close orders
    log.debug(
        'Placing OCA group of {} orders, ignoring responses for these orderIds: {}'
        .format(len(oca_list), dont_wait_order_ids))
    for o in oca_list:
        client.placeOrder(*o)
    # Now get responses for these new OCA orders
    resp['close_resp'] = wait_for_responses(order_ids, client, timeout)
    connection.close_client(client)
    return resp
Ejemplo n.º 5
0
 def kv2contract(m_contract):
     
     newContract = Contract()
     map(lambda x: newContract.__setattr__(x, m_contract[x].encode('ascii') if type(m_contract[x]) == unicode else m_contract[x]), m_contract.keys())
     return newContract
Ejemplo n.º 6
0
    def get_eod_options(
            self,
            contract_=Contract(),
            eod_or_bod=True,  # EOD or BOD options? 
            whatToShow_='MIDPOINT',
            endDateTime_=datetime.datetime.now(),
            numOfWeeks_=1,
            sameContract_=False):
        """
        The method returns EOD (3 min before close) and BOD data for options. It uses a different handler
        
        Contract: Specifies the contract we are querying. ib.ext.Contract 
        eod_or_bod: end of the day or beginning of the day. Boolean
        whatToShow: TRADE, MIDPOINT, BID, ASK, BID_ASK. From IB, string.
        endDateTime_: The last datetime that you would like to be queried. string in the right format
        numOfWeeks_: number of weekes we are iterating over. int
        sameContract_: For storage purposes, if it is indeed the same contract then get_conId would return the same id
        """
        # First step is to define a dictionary whill will be populated by IB API
        con = ibConnection(port=4001, clientId=998)
        #con.registerAll(self.watcher)
        #con.register(self.my_hist_data_handler, message.historicalData)
        #con.register(self.my_hist_option_eod_handler, message.historicalData)
        if eod_or_bod:
            con.register(self.my_hist_option_eod_handler,
                         message.historicalData)
        else:
            con.register(self.my_hist_option_bod_handler,
                         message.historicalData)
        # Setting up the connection
        con.connect()

        # First we should clean up the temporary dataframe of ours
        if not self.hist_data.empty:
            self.hist_data.drop(range(self.hist_data.shape[0]), inplace=True)

        # Putting the request in
        weekEnd = endDateTime_
        for i in xrange(numOfWeeks_):
            con.reqHistoricalData(
                tickerId=i,
                contract=contract_,
                endDateTime=weekEnd.strftime("%Y%m%d %H:%M:%S %Z"),
                durationStr='1 W',
                barSizeSetting='3 mins',
                whatToShow=whatToShow_,
                useRTH=0,
                formatDate=1)
            sleep(2)
            print ' - Iteration %s Completed - ' % i
            weekEnd = weekEnd - datetime.timedelta(days=7)

        # Sleep
        sleep(1)
        # Canceling the request
        con.cancelHistoricalData(tickerId=1)
        # Adding One Thing Before Storing The Contract
        self.hist_data['whatToShow'] = whatToShow_
        self.hist_data['Ticker'] = contract_.m_symbol
        self.hist_data.date = pd.to_datetime(self.hist_data.date)
        # Storing The Data
        conId = self.get_conId(sameContract=sameContract_)
        self.store_historical_data(contract_, conId)
        # Disconnecting
        print('Disconnected', con.disconnect())
Ejemplo n.º 7
0
 def __init__(self):
     self.m_summary = Contract()
     self.m_minTick = 0
     self.m_underConId = 0
Ejemplo n.º 8
0
 def __init__(self):
     """ generated source for method __init__ """
     self.m_summary = Contract()
     self.m_minTick = 0
     self.m_underConId = 0
     self.m_evMultiplier = 0
Ejemplo n.º 9
0

def historical_data_handler(msg):
    # The response data callback function
    # print (msg.reqId, msg.date, msg.open, msg.close, msg.high, msg.low)
    print(msg)


if __name__ == '__main__':
    # Establish IB connection, make sure you have the correct port, clientId
    conn = ibConnection(host='127.0.0.1', port=7497, clientId=999)

    # Register the response callback function and type of data to be returned
    conn.register(historical_data_handler, message.historicalData)
    conn.registerAll(all_message_handler)
    conn.connect()

    # Establish a Contract object and the params for the request
    req = Contract()
    req.m_secType = "CFD"
    req.m_symbol = "IBDE30"
    req.m_currency = "EUR"
    req.m_exchange = "SMART"
    req.m_primaryExch = "SMART"
    endtime = strftime('%Y%m%d %H:%M:%S')
    conn.reqHistoricalData(1, req, endtime, "14 D", "1 min", "BID", 1, 1)

    # Make sure the connection don't get disconnected prior the response data return
    sleep(5)
    conn.disconnect()
Ejemplo n.º 10
0
 def _create_contract(symbol):
     contract = Contract()
     contract.m_symbol = symbol
     contract.m_secType = 'STK'
     return contract
Ejemplo n.º 11
0
    contract.m_secType = sec_type
    contract.m_exchange = exch
    contract.m_primaryExch = prim_exch
    contract.m_currency = curr
    return contract


def create_order(order_type, quantity, action):
    order = Order()
    order.m_orderType = order_type
    order.m_totalQuantity = quantity
    order.m_action = action
    return order


contract = Contract()
contract.symbol = "FISV"
contract.secType = "OPT"
contract.exchange = "SMART"
contract.currency = "USD"


class TestWrapper(wrapper.EWrapper):
    def historicalData(self, reqId: TickerId, date: str, open: float,
                       high: float, low: float, close: float, volume: int,
                       barCount: int, WAP: float, hasGaps: int):
        super().historicalData(reqId, date, open, high, low, close, volume,
                               barCount, WAP, hasGaps)
        print("HistoricalData. ", reqId, " Date:", date, "Open:", open,
              "High:", high, "Low:", low, "Close:", close, "Volume:", volume,
              barCount, "WAP:", WAP, "HasGaps:", hasGaps)
Ejemplo n.º 12
0
from ib.opt import Connection
from ib.ext.Contract import Contract
import time
import csv

Equity = Contract()
Equity.m_secType = 'Stk'
Equity.m_exchange = 'Smart'
Equity.m_currency = 'USD'

EquityList = ['XOM', 'JNJ', 'BRK B', 'JPM','GE','T','WFC','BAC','PG','CVX','VZ','PFE','MRK','HD','C','KO','DIS','V','UNH','PEP','PM','IBM','MO','SLB','ORCL','MMM','MDT','MA','WMT','MCD','ABBV','BMY','BA','HON','CVS','SPY']
PriceList = []
PriceData = csv.writer(open('/home/ori/price.csv','wb'))

def print_message_from_ib(msg):
    print(msg)
    

def savepx(msg):
    if msg.field == 4:
        PriceList.insert(msg.tickerId,msg.price)

def main():
    conn = Connection.create(port=7496,clientId=999)
    conn.registerAll(print_message_from_ib)
    conn.connect()
    count = 0
    for ticker in EquityList:
        Equity.m_symbol = ticker
        conn.register(savepx,'TickPrice')# move this out of loop, just do it once
        conn.reqMktData(count,Equity,225,True)#true snapshot
Ejemplo n.º 13
0
 def reqMktData(self):
     contract = Contract() #
     contract.m_symbol = 'QQQQ'
     contract.m_secType = 'STK'
     contract.m_exchange = 'SMART'
     self.connection.reqMktData(1, contract, '', False)
Ejemplo n.º 14
0
 def _make_stock_contract(self, symbol):
     contract = Contract()
     contract.m_symbol = symbol
     contract.m_secType = 'STK'
     contract.m_exchange = 'SMART/ISLAND'
     return contract
Ejemplo n.º 15
0
    def __init__(self, currency, strategy=None, frequency=60):
        """
        initialize function
        :param currency: str, fx pair to trade, e.g. 'EUR'
        :param strategy: function(parameter contains self), execution strategy
        :param frequency: int, how many seconds to run strategy
        """
        # store parameters
        self.currency = currency
        self.strategy = strategy
        self.frequency = frequency

        # create contract
        self.__contract = Contract()
        self.__contract.m_symbol = currency
        self.__contract.m_secType = 'CASH'
        self.__contract.m_exchange = 'IDEALPRO'
        self.__contract.m_primaryExch = 'IDEALPRO'
        self.__contract.m_currency = 'USD'

        # create empty order
        self.__order = Order()

        # connect to IB and register callback function
        self.conn = Connection.create(port=7497, clientId=1994)
        self.conn.connect()
        # self.conn.registerAll(self.reply_handler)
        self.conn.register(self.error_handler, message.Error)
        self.conn.register(self.bar_handler, message.realtimeBar)
        self.conn.register(self.snapshot_handler, message.tickPrice)
        self.conn.register(self.valid_id_handler, message.nextValidId)
        self.conn.register(self.time_handler, message.currentTime)
        self.conn.register(self.open_order_handler, message.orderStatus)
        self.conn.register(self.position_handler, message.position)
        self.conn.register(self.market_depth_handler, message.updateMktDepth)

        # get valid request ID and order ID
        self.__req_id = 1
        self.__order_id = 1
        self.conn.reqIds(1)

        # initialise other variables
        self.debug = False
        self.stop_ind = False
        self.order_time = None
        self.current_time = None
        self.position = 0
        self.errors = []
        self.bar_data = pd.DataFrame(
            columns=['DATETIME', 'OPEN', 'CLOSE', 'HIGH', 'LOW'])
        self.bid_price = None
        self.ask_price = None
        self.open_orders = {}
        self.min_price = MIN_PRICE[currency]

        # request real time data
        self.conn.reqRealTimeBars(tickerId=self.__req_id,
                                  contract=self.__contract,
                                  barSize=5,
                                  whatToShow='MIDPOINT',
                                  useRTH=1)
        self.__req_id += 1
        self.conn.reqMktDepth(tickerId=self.__req_id,
                              contract=self.__contract,
                              numRows=1)
        self.__req_id += 1
Ejemplo n.º 16
0
def my_callback_handler(msg):
    #for reference on this /home/deep/development/IbPy/ib/ext/TickType
    #another class method tt.getField(msg.field)
    if msg.field in [
            tt.BID, tt.ASK, tt.LAST, tt.HIGH, tt.LOW, tt.OPEN, tt.CLOSE
    ]:
        print tt.getField(msg.field), msg.price
    elif msg.field in [
            tt.BID_SIZE, tt.ASK_SIZE, tt.LAST_SIZE, tt.VOLUME, tt.AVG_VOLUME
    ]:
        print tt.getField(msg.field), msg.size
    elif msg.field in [tt, LAST_TIMESTAMP]:
        print tt.getField(msg.field), msg.time


tws = ibConnection()
tws.register(my_callback_handler, message.tickSize, message.tickPrice)
tws.connect()

c = Contract()
c.m_symbol = "KSCL"
c.m_secType = "STK"
c.m_exchange = "NSE"
c.m_currency = "INR"

tws.reqMktData(5, c, "", False)
sleep(10000000)

print 'All done'

tws.disconnect()
Ejemplo n.º 17
0
        m_totalQuantity = 0
        m_orderType = ""
        m_lmtPrice = float()
        m_auxPrice = float()
        '''
        order.m_lmtPrice = price
        order.m_orderType = order_type
        order.m_totalQuantity = qty
        order.m_action = action
        # more functionalities....
        return order


# In[23]:

ng = Contract()
ng.m_symbol = "CN"
ng.m_secType = "FUT"
ng.m_exchange = "SGX"
ng.m_expiry = "20161129"
ng.m_currency = "USD"
ng.m_multiplier = 1
ng.m_tradingClass = "CN"

# In[24]:

TWS = tws(ng)

# In[25]:

TWS.connect()
Ejemplo n.º 18
0
 def processMsg(self, msgId):
     if (msgId == -1):
         return False
     if msgId == self.TICK_PRICE:
         version = self.readInt()
         tickerId = self.readInt()
         tickType = self.readInt()
         price = self.readDouble()
         size = 0
         if version >= 2:
             size = self.readInt()
         canAutoExecute = 0
         if version >= 3:
             canAutoExecute = self.readInt()
         self.eWrapper().tickPrice(tickerId, tickType, price, canAutoExecute)
         if version >= 2:
             sizeTickType = -1
             if tickType == 1:
                 sizeTickType = 0
             elif tickType == 2:
                 sizeTickType = 3
             elif tickType == 4:
                 sizeTickType = 5
             if (sizeTickType != -1):
                 self.eWrapper().tickSize(tickerId, sizeTickType, size)
     elif msgId == self.TICK_SIZE:
         version = self.readInt()
         tickerId = self.readInt()
         tickType = self.readInt()
         size = self.readInt()
         self.eWrapper().tickSize(tickerId, tickType, size)
     elif msgId == self.TICK_OPTION_COMPUTATION:
         version = self.readInt()
         tickerId = self.readInt()
         tickType = self.readInt()
         impliedVol = self.readDouble()
         if impliedVol < 0:
             impliedVol = Double.MAX_VALUE
         delta = self.readDouble()
         if abs(delta) > 1:
             delta = Double.MAX_VALUE
         modelPrice = float()
         pvDividend = float()
         if (tickType == TickType.MODEL_OPTION):
             modelPrice = self.readDouble()
             pvDividend = self.readDouble()
         else:
             modelPrice = pvDividend = Double.MAX_VALUE
         self.eWrapper().tickOptionComputation(tickerId, tickType, impliedVol, delta, modelPrice, pvDividend)
     elif msgId == self.TICK_GENERIC:
         version = self.readInt()
         tickerId = self.readInt()
         tickType = self.readInt()
         value = self.readDouble()
         self.eWrapper().tickGeneric(tickerId, tickType, value)
     elif msgId == self.TICK_STRING:
         version = self.readInt()
         tickerId = self.readInt()
         tickType = self.readInt()
         value = self.readStr()
         self.eWrapper().tickString(tickerId, tickType, value)
     elif msgId == self.TICK_EFP:
         version = self.readInt()
         tickerId = self.readInt()
         tickType = self.readInt()
         basisPoints = self.readDouble()
         formattedBasisPoints = self.readStr()
         impliedFuturesPrice = self.readDouble()
         holdDays = self.readInt()
         futureExpiry = self.readStr()
         dividendImpact = self.readDouble()
         dividendsToExpiry = self.readDouble()
         self.eWrapper().tickEFP(tickerId, tickType, basisPoints, formattedBasisPoints, impliedFuturesPrice, holdDays, futureExpiry, dividendImpact, dividendsToExpiry)
     elif msgId == self.ORDER_STATUS:
         version = self.readInt()
         id = self.readInt()
         status = self.readStr()
         filled = self.readInt()
         remaining = self.readInt()
         avgFillPrice = self.readDouble()
         permId = 0
         if version >= 2:
             permId = self.readInt()
         parentId = 0
         if version >= 3:
             parentId = self.readInt()
         lastFillPrice = 0
         if version >= 4:
             lastFillPrice = self.readDouble()
         clientId = 0
         if version >= 5:
             clientId = self.readInt()
         whyHeld = None
         if version >= 6:
             whyHeld = self.readStr()
         self.eWrapper().orderStatus(id, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld)
     elif msgId == self.ACCT_VALUE:
         version = self.readInt()
         key = self.readStr()
         val = self.readStr()
         cur = self.readStr()
         accountName = None
         if version >= 2:
             accountName = self.readStr()
         self.eWrapper().updateAccountValue(key, val, cur, accountName)
     elif msgId == self.PORTFOLIO_VALUE:
         version = self.readInt()
         contract = Contract()
         if version >= 6:
             contract.m_conId = self.readInt()
         contract.m_symbol = self.readStr()
         contract.m_secType = self.readStr()
         contract.m_expiry = self.readStr()
         contract.m_strike = self.readDouble()
         contract.m_right = self.readStr()
         if version >= 7:
             contract.m_multiplier = self.readStr()
             contract.m_primaryExch = self.readStr()
         contract.m_currency = self.readStr()
         if version >= 2:
             contract.m_localSymbol = self.readStr()
         position = self.readInt()
         marketPrice = self.readDouble()
         marketValue = self.readDouble()
         averageCost = 0.0
         unrealizedPNL = 0.0
         realizedPNL = 0.0
         if version >= 3:
             averageCost = self.readDouble()
             unrealizedPNL = self.readDouble()
             realizedPNL = self.readDouble()
         accountName = None
         if version >= 4:
             accountName = self.readStr()
         if (version == 6) and (self.m_parent.serverVersion() == 39):
             contract.m_primaryExch = self.readStr()
         self.eWrapper().updatePortfolio(contract, position, marketPrice, marketValue, averageCost, unrealizedPNL, realizedPNL, accountName)
     elif msgId == self.ACCT_UPDATE_TIME:
         version = self.readInt()
         timeStamp = self.readStr()
         self.eWrapper().updateAccountTime(timeStamp)
     elif msgId == self.ERR_MSG:
         version = self.readInt()
         if version < 2:
             msg = self.readStr()
             self.m_parent.error(msg)
         else:
             id = self.readInt()
             errorCode = self.readInt()
             errorMsg = self.readStr()
             self.m_parent.error(id, errorCode, errorMsg)
     elif msgId == self.OPEN_ORDER:
         version = self.readInt()
         order = Order()
         order.m_orderId = self.readInt()
         contract = Contract()
         if version >= 17:
             contract.m_conId = self.readInt()
         contract.m_symbol = self.readStr()
         contract.m_secType = self.readStr()
         contract.m_expiry = self.readStr()
         contract.m_strike = self.readDouble()
         contract.m_right = self.readStr()
         contract.m_exchange = self.readStr()
         contract.m_currency = self.readStr()
         if version >= 2:
             contract.m_localSymbol = self.readStr()
         order.m_action = self.readStr()
         order.m_totalQuantity = self.readInt()
         order.m_orderType = self.readStr()
         order.m_lmtPrice = self.readDouble()
         order.m_auxPrice = self.readDouble()
         order.m_tif = self.readStr()
         order.m_ocaGroup = self.readStr()
         order.m_account = self.readStr()
         order.m_openClose = self.readStr()
         order.m_origin = self.readInt()
         order.m_orderRef = self.readStr()
         if version >= 3:
             order.m_clientId = self.readInt()
         if version >= 4:
             order.m_permId = self.readInt()
             if version < 18:
                 self.readBoolFromInt()
             else:
                 order.m_outsideRth = self.readBoolFromInt()
             order.m_hidden = (self.readInt() == 1)
             order.m_discretionaryAmt = self.readDouble()
         if version >= 5:
             order.m_goodAfterTime = self.readStr()
         if version >= 6:
             self.readStr()
         if version >= 7:
             order.m_faGroup = self.readStr()
             order.m_faMethod = self.readStr()
             order.m_faPercentage = self.readStr()
             order.m_faProfile = self.readStr()
         if version >= 8:
             order.m_goodTillDate = self.readStr()
         if version >= 9:
             order.m_rule80A = self.readStr()
             order.m_percentOffset = self.readDouble()
             order.m_settlingFirm = self.readStr()
             order.m_shortSaleSlot = self.readInt()
             order.m_designatedLocation = self.readStr()
             order.m_auctionStrategy = self.readInt()
             order.m_startingPrice = self.readDouble()
             order.m_stockRefPrice = self.readDouble()
             order.m_delta = self.readDouble()
             order.m_stockRangeLower = self.readDouble()
             order.m_stockRangeUpper = self.readDouble()
             order.m_displaySize = self.readInt()
             if version < 18:
                 self.readBoolFromInt()
             order.m_blockOrder = self.readBoolFromInt()
             order.m_sweepToFill = self.readBoolFromInt()
             order.m_allOrNone = self.readBoolFromInt()
             order.m_minQty = self.readInt()
             order.m_ocaType = self.readInt()
             order.m_eTradeOnly = self.readBoolFromInt()
             order.m_firmQuoteOnly = self.readBoolFromInt()
             order.m_nbboPriceCap = self.readDouble()
         if version >= 10:
             order.m_parentId = self.readInt()
             order.m_triggerMethod = self.readInt()
         if version >= 11:
             order.m_volatility = self.readDouble()
             order.m_volatilityType = self.readInt()
             if (version == 11):
                 receivedInt = self.readInt()
                 order.m_deltaNeutralOrderType = "NONE" if (receivedInt == 0) else "MKT"
             else:
                 order.m_deltaNeutralOrderType = self.readStr()
                 order.m_deltaNeutralAuxPrice = self.readDouble()
             order.m_continuousUpdate = self.readInt()
             if (self.m_parent.serverVersion() == 26):
                 order.m_stockRangeLower = self.readDouble()
                 order.m_stockRangeUpper = self.readDouble()
             order.m_referencePriceType = self.readInt()
         if version >= 13:
             order.m_trailStopPrice = self.readDouble()
         if version >= 14:
             order.m_basisPoints = self.readDouble()
             order.m_basisPointsType = self.readInt()
             contract.m_comboLegsDescrip = self.readStr()
         if version >= 15:
             if version >= 20:
                 order.m_scaleInitLevelSize = self.readIntMax()
                 order.m_scaleSubsLevelSize = self.readIntMax()
             else:
                 self.readIntMax()
                 order.m_scaleInitLevelSize = self.readIntMax()
             order.m_scalePriceIncrement = self.readDoubleMax()
         if version >= 19:
             order.m_clearingAccount = self.readStr()
             order.m_clearingIntent = self.readStr()
         if version >= 20:
             if self.readBoolFromInt():
                 underComp = UnderComp()
                 underComp.m_conId = self.readInt()
                 underComp.m_delta = self.readDouble()
                 underComp.m_price = self.readDouble()
                 contract.m_underComp = underComp
         orderState = OrderState()
         if version >= 16:
             order.m_whatIf = self.readBoolFromInt()
             orderState.m_status = self.readStr()
             orderState.m_initMargin = self.readStr()
             orderState.m_maintMargin = self.readStr()
             orderState.m_equityWithLoan = self.readStr()
             orderState.m_commission = self.readDoubleMax()
             orderState.m_minCommission = self.readDoubleMax()
             orderState.m_maxCommission = self.readDoubleMax()
             orderState.m_commissionCurrency = self.readStr()
             orderState.m_warningText = self.readStr()
         self.eWrapper().openOrder(order.m_orderId, contract, order, orderState)
     elif msgId == self.NEXT_VALID_ID:
         version = self.readInt()
         orderId = self.readInt()
         self.eWrapper().nextValidId(orderId)
     elif msgId == self.SCANNER_DATA:
         contract = ContractDetails()
         version = self.readInt()
         tickerId = self.readInt()
         numberOfElements = self.readInt()
         ## for-while
         ctr = 0
         while ctr < numberOfElements:
             rank = self.readInt()
             if version >= 3:
                 contract.m_summary.m_conId = self.readInt()
             contract.m_summary.m_symbol = self.readStr()
             contract.m_summary.m_secType = self.readStr()
             contract.m_summary.m_expiry = self.readStr()
             contract.m_summary.m_strike = self.readDouble()
             contract.m_summary.m_right = self.readStr()
             contract.m_summary.m_exchange = self.readStr()
             contract.m_summary.m_currency = self.readStr()
             contract.m_summary.m_localSymbol = self.readStr()
             contract.m_marketName = self.readStr()
             contract.m_tradingClass = self.readStr()
             distance = self.readStr()
             benchmark = self.readStr()
             projection = self.readStr()
             legsStr = None
             if version >= 2:
                 legsStr = self.readStr()
             self.eWrapper().scannerData(tickerId, rank, contract, distance, benchmark, projection, legsStr)
             ctr += 1
         self.eWrapper().scannerDataEnd(tickerId)
     elif msgId == self.CONTRACT_DATA:
         version = self.readInt()
         reqId = -1
         if version >= 3:
             reqId = self.readInt()
         contract = ContractDetails()
         contract.m_summary.m_symbol = self.readStr()
         contract.m_summary.m_secType = self.readStr()
         contract.m_summary.m_expiry = self.readStr()
         contract.m_summary.m_strike = self.readDouble()
         contract.m_summary.m_right = self.readStr()
         contract.m_summary.m_exchange = self.readStr()
         contract.m_summary.m_currency = self.readStr()
         contract.m_summary.m_localSymbol = self.readStr()
         contract.m_marketName = self.readStr()
         contract.m_tradingClass = self.readStr()
         contract.m_summary.m_conId = self.readInt()
         contract.m_minTick = self.readDouble()
         contract.m_summary.m_multiplier = self.readStr()
         contract.m_orderTypes = self.readStr()
         contract.m_validExchanges = self.readStr()
         if version >= 2:
             contract.m_priceMagnifier = self.readInt()
         self.eWrapper().contractDetails(reqId, contract)
     elif msgId == self.BOND_CONTRACT_DATA:
         version = self.readInt()
         reqId = -1
         if version >= 3:
             reqId = self.readInt()
         contract = ContractDetails()
         contract.m_summary.m_symbol = self.readStr()
         contract.m_summary.m_secType = self.readStr()
         contract.m_cusip = self.readStr()
         contract.m_coupon = self.readDouble()
         contract.m_maturity = self.readStr()
         contract.m_issueDate = self.readStr()
         contract.m_ratings = self.readStr()
         contract.m_bondType = self.readStr()
         contract.m_couponType = self.readStr()
         contract.m_convertible = self.readBoolFromInt()
         contract.m_callable = self.readBoolFromInt()
         contract.m_putable = self.readBoolFromInt()
         contract.m_descAppend = self.readStr()
         contract.m_summary.m_exchange = self.readStr()
         contract.m_summary.m_currency = self.readStr()
         contract.m_marketName = self.readStr()
         contract.m_tradingClass = self.readStr()
         contract.m_summary.m_conId = self.readInt()
         contract.m_minTick = self.readDouble()
         contract.m_orderTypes = self.readStr()
         contract.m_validExchanges = self.readStr()
         if version >= 2:
             contract.m_nextOptionDate = self.readStr()
             contract.m_nextOptionType = self.readStr()
             contract.m_nextOptionPartial = self.readBoolFromInt()
             contract.m_notes = self.readStr()
         self.eWrapper().bondContractDetails(reqId, contract)
     elif msgId == self.EXECUTION_DATA:
         version = self.readInt()
         orderId = self.readInt()
         contract = Contract()
         if version >= 5:
             contract.m_conId = self.readInt()
         contract.m_symbol = self.readStr()
         contract.m_secType = self.readStr()
         contract.m_expiry = self.readStr()
         contract.m_strike = self.readDouble()
         contract.m_right = self.readStr()
         contract.m_exchange = self.readStr()
         contract.m_currency = self.readStr()
         contract.m_localSymbol = self.readStr()
         exec_ = Execution()
         exec_.m_orderId = orderId
         exec_.m_execId = self.readStr()
         exec_.m_time = self.readStr()
         exec_.m_acctNumber = self.readStr()
         exec_.m_exchange = self.readStr()
         exec_.m_side = self.readStr()
         exec_.m_shares = self.readInt()
         exec_.m_price = self.readDouble()
         if version >= 2:
             exec_.m_permId = self.readInt()
         if version >= 3:
             exec_.m_clientId = self.readInt()
         if version >= 4:
             exec_.m_liquidation = self.readInt()
         if version >= 6:
             exec_.m_cumQty = self.readInt()
             exec_.m_avgPrice = self.readDouble()
         self.eWrapper().execDetails(orderId, contract, exec_)
     elif msgId == self.MARKET_DEPTH:
         version = self.readInt()
         id = self.readInt()
         position = self.readInt()
         operation = self.readInt()
         side = self.readInt()
         price = self.readDouble()
         size = self.readInt()
         self.eWrapper().updateMktDepth(id, position, operation, side, price, size)
     elif msgId == self.MARKET_DEPTH_L2:
         version = self.readInt()
         id = self.readInt()
         position = self.readInt()
         marketMaker = self.readStr()
         operation = self.readInt()
         side = self.readInt()
         price = self.readDouble()
         size = self.readInt()
         self.eWrapper().updateMktDepthL2(id, position, marketMaker, operation, side, price, size)
     elif msgId == self.NEWS_BULLETINS:
         version = self.readInt()
         newsMsgId = self.readInt()
         newsMsgType = self.readInt()
         newsMessage = self.readStr()
         originatingExch = self.readStr()
         self.eWrapper().updateNewsBulletin(newsMsgId, newsMsgType, newsMessage, originatingExch)
     elif msgId == self.MANAGED_ACCTS:
         version = self.readInt()
         accountsList = self.readStr()
         self.eWrapper().managedAccounts(accountsList)
     elif msgId == self.RECEIVE_FA:
         version = self.readInt()
         faDataType = self.readInt()
         xml = self.readStr()
         self.eWrapper().receiveFA(faDataType, xml)
     elif msgId == self.HISTORICAL_DATA:
         version = self.readInt()
         reqId = self.readInt()
         startDateStr = ""
         endDateStr = ""
         completedIndicator = "finished"
         if version >= 2:
             startDateStr = self.readStr()
             endDateStr = self.readStr()
             completedIndicator += "-" + startDateStr + "-" + endDateStr
         itemCount = self.readInt()
         ## for-while
         ctr = 0
         while ctr < itemCount:
             date = self.readStr()
             open = self.readDouble()
             high = self.readDouble()
             low = self.readDouble()
             close = self.readDouble()
             volume = self.readInt()
             WAP = self.readDouble()
             hasGaps = self.readStr()
             barCount = -1
             if version >= 3:
                 barCount = self.readInt()
             self.eWrapper().historicalData(reqId, date, open, high, low, close, volume, barCount, WAP, Boolean.valueOf(hasGaps).booleanValue())
             ctr += 1
         self.eWrapper().historicalData(reqId, completedIndicator, -1, -1, -1, -1, -1, -1, -1, False)
     elif msgId == self.SCANNER_PARAMETERS:
         version = self.readInt()
         xml = self.readStr()
         self.eWrapper().scannerParameters(xml)
     elif msgId == self.CURRENT_TIME:
         self.readInt()
         time = self.readLong()
         self.eWrapper().currentTime(time)
     elif msgId == self.REAL_TIME_BARS:
         self.readInt()
         reqId = self.readInt()
         time = self.readLong()
         open = self.readDouble()
         high = self.readDouble()
         low = self.readDouble()
         close = self.readDouble()
         volume = self.readLong()
         wap = self.readDouble()
         count = self.readInt()
         self.eWrapper().realtimeBar(reqId, time, open, high, low, close, volume, wap, count)
     elif msgId == self.FUNDAMENTAL_DATA:
         self.readInt()
         reqId = self.readInt()
         data = self.readStr()
         self.eWrapper().fundamentalData(reqId, data)
     elif msgId == self.CONTRACT_DATA_END:
         self.readInt()
         reqId = self.readInt()
         self.eWrapper().contractDetailsEnd(reqId)
     else:
         self.m_parent.error(EClientErrors.NO_VALID_ID, EClientErrors.UNKNOWN_ID.code(), EClientErrors.UNKNOWN_ID.msg())
         return False
     return True
Ejemplo n.º 19
0
def get_ratios(stocks, cols):
    dl = Downloader()
    c = Contract()
    #Create empty list to store data
    l = []
    # Loop over list of stocks
    idx = 0
    for x in stocks:
        idx += 1
        for _ in range(5):

            c.m_symbol = x
            c.m_secType = 'STK'
            c.m_exchange = 'SMART'
            c.m_currency = 'USD'
            # sleep(1)
            dl.requestData(c)
            sleep(1)
            m0 = str(x)
            m = dl.tickType47value
            sleep(1)

            if dl.tickType47value:

                row = []
                row.append(m0)
                row.append(m)

                dl.cancelData()
                # sleep(0.5)

                r = row[1].split(';')

                dic = {}
                dic['Symbol'] = row[0]
                for i in r:
                    item = i.split('=')

                    if len(item) > 1:

                        dic[item[0]] = item[1]
                        if item[1] == '-99999.99':
                            dic[item[0]] = 0

                l.append(dic)
                print(row[0], ' Added ', idx, '/', len(stocks))

                break

            dl.cancelData()
            # sleep(0.5)

    if cols != None:
        df = pd.DataFrame(l)[cols]
    #print(df)
    return df


# df = get_ratios(['AAL','WYNN','SIX','MGM','MAR','HLT','WYND'],['Symbol','APENORM','AROAPCT','AROIPCT','BETA','DIVGRPCT','EPSTRENDGR','PR52WKPCT','PRICE2BK','QCURRATIO','QLTD2EQ','QPR2REV','QQUICKRATI','QTOTD2EQ','REVTRENDGR','TTMGROSMGN','TTMINTCOV','TTMNIPEREM','TTMOPMGN','TTMPAYRAT','YIELD','YLD5YAVG'])
# print(df)

# df = float(get_ratios(['AAPL'],['YIELD']).iloc[0])
#
# print(df)
Ejemplo n.º 20
0
        cnx.commit()

    Flag = 1
    logger.debug('Flag set to %s', Flag)
    print(Flag)
    return (Flag)

while Flag == 0:
    logger.debug('Flag set to %s', Flag)
    conn = Connection.create(port=4002, clientId=999)
    conn.connect()
    logger.debug('Connecting to Server')
    time.sleep(1)
    conn.register(
        reply_handler, 'HistoricalData'
    )  #By registering "HistoricalData" --the Method name only --we can eliminate all the open order garbage
    logger.debug('Registered HistoricalData Reply Handler')
    time.sleep(1)
    qqq = Contract()
    qqq.m_symbol = Table
    qqq.m_secType = 'STK'
    qqq.m_exchange = 'SMART:ISLAND'
    qqq.m_currency = 'USD'
    logger.debug('Requesting historical data')
    conn.reqHistoricalData(1, qqq, '', '1 D', '1 day', 'TRADES', 0, 1)
    logger.debug('Returned from Reply Handler')
    time.sleep(1)  #give IB time to send us messages
    logger.debug('Disconnecting from Server')
    conn.disconnect()

logger.debug('Finished Daily OHLC')
Ejemplo n.º 21
0
def contract_to_dict(contract):
    """Convert an IBPy Contract object to a dict containing any non-default values."""
    default = Contract()
    return {field: val for field, val in vars(contract).items() if val != getattr(default, field, None)}