def get_prices_at_frequency_for_contract_object(self, contract_object, freq="D"):
        """
        Get historical prices at a particular frequency

        We override this method, rather than _get_prices_at_frequency_for_contract_object_no_checking
        Because the list of dates returned by contracts_with_price_data is likely to not match (expiries)

        :param contract_object:  futuresContract
        :param freq: str; one of D, H, 15M, 5M, M, 10S, S
        :return: data
        """
        new_log = self.log.setup(instrument_code=contract_object.instrument_code, contract_date=contract_object.date)

        contract_object_with_ib_data = self.futures_contract_data.get_contract_object_with_IB_metadata(contract_object)
        if contract_object_with_ib_data is missing_contract:
            new_log.warn("Can't get data for %s" % str(contract_object))
            return futuresContractPrices.create_empty()

        price_data = self.ibconnection.broker_get_historical_futures_data_for_contract(contract_object_with_ib_data,
                                                                                       bar_freq = freq)

        if len(price_data)==0:
            new_log.warn("No IB price data found for %s" % str(contract_object))
            data = futuresContractPrices.create_empty()
        else:
            data = futuresContractPrices(price_data)

        data = futuresContractPrices(data[data.index<datetime.datetime.now()])
        data = data.remove_zero_volumes()

        return data
예제 #2
0
    def get_prices_for_contract_object(self, contract_object):
        """
        Get some prices
        (daily frequency: using IB historical data)

        We override this method, rather than _get_prices_for_contract_object_no_checking
        Because the list of dates returned by contracts_with_price_data is likely to not match (expiries)

        :param contract_object:  futuresContract
        :return: data
        """
        new_log = self.log.setup(
            instrument_code=contract_object.instrument_code,
            contract_date=contract_object.date)

        contract_object_with_ib_data = self._get_contract_object_with_IB_metadata(
            contract_object)
        if contract_object_with_ib_data is missing_contract:
            new_log.warn("Can't get data for %s" % str(contract_object))
            return futuresContractPrices.create_empty()

        price_data = self.ibconnection.broker_get_historical_futures_data_for_contract(
            contract_object_with_ib_data, bar_freq="D")

        if len(price_data) == 0:
            new_log.msg("No IB price data found for %s" % str(contract_object))
            data = futuresContractPrices.create_empty()
        else:
            data = futuresContractPrices(price_data)

        return data
예제 #3
0
    def _get_prices_for_contract_object_no_checking(self, futures_contract_object):
        """

        :param futures_contract_object: futuresContract
        :return: futuresContractPrices
        """
        self.log.label(instrument_code=futures_contract_object.instrument_code,
                       contract_date=futures_contract_object.date)

        try:
            quandl_contract = _quandlFuturesContract(futures_contract_object)
        except:
            self.log.warning("Can't parse contract object to find the QUANDL identifier")
            return futuresContractPrices.create_empty()

        try:
            contract_data = quandl.get(quandl_contract.quandl_identifier())
        except Exception as exception:
            self.log.warn("Can't get QUANDL data for %s error %s" % (quandl_contract.quandl_identifier(), exception))
            return futuresContractPrices.create_empty()

        try:
            data = quandlFuturesContractPrices(contract_data)
        except:
            self.log.error(
                "Quandl API error: data fields are not as expected %s" % ",".join(list(contract_data.columns)))
            return futuresContractPrices.create_empty()

        # apply multiplier
        factor = quandl_contract.get_dividing_factor()
        data = data / factor

        return data
예제 #4
0
    def get_prices_for_contract_object(self, contract_object):
        """
        Get some prices
        (daily frequency: using IB historical data)

        :param contract_object:  futuresContract
        :return: data
        """
        new_log = self.log.setup(
            instrument_code=contract_object.instrument_code,
            contract_date=contract_object.date)

        contract_object_with_ib_data = self._get_contract_object_with_IB_metadata(
            contract_object)
        if contract_object_with_ib_data is missing_contract:
            new_log.warn("Can't get data for %s" % str(contract_object))
            return futuresContractPrices.create_empty()

        price_data = self.ibconnection.broker_get_historical_futures_data_for_contract(
            contract_object_with_ib_data, bar_freq="D")

        if len(price_data) == 0:
            new_log.msg("No IB price data found for %s" % str(contract_object))
            data = futuresContractPrices.create_empty()
        else:
            data = futuresContractPrices(price_data)

        data = futuresContractPrices(
            data[data.index < datetime.datetime.now()])
        data = data.remove_zero_volumes()

        return data
예제 #5
0
    def get_recent_bid_ask_tick_data_for_contract_object(
            self, contract_object, trade_list_for_multiple_legs=None):
        """
        Get last few price ticks

        :param contract_object: futuresContract
        :return:
        """
        new_log = self.log.setup(
            instrument_code=contract_object.instrument_code,
            contract_date=contract_object.date_str,
        )

        contract_object_with_ib_data = (
            self.futures_contract_data.get_contract_object_with_IB_metadata(
                contract_object))
        if contract_object_with_ib_data is missing_contract:
            new_log.warn("Can't get data for %s" % str(contract_object))
            return futuresContractPrices.create_empty()

        tick_data = self.ibconnection.ib_get_recent_bid_ask_tick_data(
            contract_object_with_ib_data,
            trade_list_for_multiple_legs=trade_list_for_multiple_legs,
        )
        if tick_data is missing_contract:
            return missing_data

        tick_data_as_df = from_ib_bid_ask_tick_data_to_dataframe(tick_data)

        return tick_data_as_df
예제 #6
0
    def cancel_market_data_for_contract_object(
            self, contract_object, trade_list_for_multiple_legs=None):
        """
        Returns my encapsulation of a ticker object

        :param contract_object:
        :param trade_list_for_multiple_legs:
        :return:
        """

        new_log = self.log.setup(
            instrument_code=contract_object.instrument_code,
            contract_date=contract_object.date_str,
        )

        contract_object_with_ib_data = (
            self.futures_contract_data.get_contract_object_with_IB_metadata(
                contract_object))
        if contract_object_with_ib_data is missing_contract:
            new_log.warn("Can't get data for %s" % str(contract_object))
            return futuresContractPrices.create_empty()

        self.ibconnection.cancel_market_data_for_contract_object(
            contract_object_with_ib_data,
            trade_list_for_multiple_legs=trade_list_for_multiple_legs,
        )
    def _get_prices_for_contract_object_no_checking(self,
                                                    futures_contract_object):
        """
        Read back the prices for a given contract object

        :param contract_object:  futuresContract
        :return: data
        """
        keyname = self._keyname_given_contract_object(futures_contract_object)
        filename = self._filename_given_key_name(keyname)

        date_format = self._input_date_format
        date_time_column = self._input_date_time_column
        input_column_mapping = self._input_column_mapping
        skiprows = self._input_skiprows
        skipfooter = self._input_skipfooter

        try:
            instrpricedata = pd_readcsv(
                filename,
                date_index_name=date_time_column,
                date_format=date_format,
                input_column_mapping=input_column_mapping,
                skiprows=skiprows,
                skipfooter=skipfooter)
        except OSError:
            self.log.warning("Can't find adjusted price file %s" % filename)
            return futuresContractPrices.create_empty()

        instrpricedata = instrpricedata.groupby(level=0).last()

        instrpricedata = futuresContractPrices(instrpricedata)

        return instrpricedata
예제 #8
0
    def _get_prices_for_contract_object_no_checking(self,
                                                    futures_contract_object):
        """

        :param futures_contract_object: futuresContract
        :return: futuresContractPrices
        """
        self.log.label(instrument_code=futures_contract_object.instrument_code,
                       contract_date=futures_contract_object.date[2:4])

        try:
            barchart_contract = _barchartFuturesContract(
                futures_contract_object)
        except:
            self.log.warning(
                "Can't parse contract object to find the BARCHART identifier")
            return futuresContractPrices.create_empty()

        try:
            # contract_data = barchart.get(barchart_contract.barchart_identifier())
            contract_data = od.history(barchart_contract.barchart_identifier(),
                                       historical_type='daily')['results']
            contract_data = pd.DataFrame(contract_data)[[
                'open', 'high', 'low', 'close', 'volume'
            ]]
            contract_data.tail()
        except Exception as exception:
            self.log.warn("Can't get BARCHART data for %s error %s" %
                          (barchart_contract.barchart_identifier(), exception))
            return futuresContractPrices.create_empty()

        try:
            data = barchartFuturesContractPrices(contract_data)
        except:
            self.log.error(
                "Barchart API error: data fields are not as expected %s" %
                ",".join(list(contract_data.columns)))
            return futuresContractPrices.create_empty()

        # apply multiplier
        factor = barchart_contract.get_dividing_factor()
        data = data / factor

        return data