def get_sport_markets( self, sport_ids, include_selections=True, WantDirectDescendentsOnly=Boolean.F.value, WantPlayMarkets=None ): """ Get the tree of events and markets for given sports/events. :param sport_ids: list of sports for which to return events/markets :param include_selections: whether to include the selections in returned data. :param WantDirectDescendentsOnly: whether to return only direct descendents of the event. :param WantPlayMarkets: whether information about real or play markets should be returned :return: all markets for the given sport, with comp and event data flattened. """ date_time_sent = datetime.datetime.utcnow() if include_selections: method = 'GetEventSubTreeWithSelections' params = self.client.readonly_types['%sRequest' % method]( _value_1=[{'EventClassifierIds': s_id} for s_id in listy_mc_list(sport_ids)], WantPlayMarkets=WantPlayMarkets, ) else: method = 'GetEventSubTreeNoSelections' params = self.client.readonly_types['%sRequest' % method]( _value_1=[{'EventClassifierIds': s_id} for s_id in listy_mc_list(sport_ids)], WantDirectDescendentsOnly=WantDirectDescendentsOnly, WantPlayMarkets=WantPlayMarkets, ) response = self.request(method, params, secure=False) if self.client.raw_response: return response data = self.process_response(response, date_time_sent, 'EventClassifiers', error_handler=err_sport_markets) return parse_deep_markets(listy_mc_list(data.get('data', []))) if data.get('data') else []
def get_markets(self, market_ids): """ Get detailed information about given market(s). :param market_ids: market id(s) to get data for. :return: market information for each market id provided. """ date_time_sent = datetime.datetime.utcnow() params = self.client.readonly_types['GetMarketInformationRequest']( _value_1=[{'MarketIds': m_id} for m_id in listy_mc_list(market_ids)] ) response = self.request('GetMarketInformation', params, secure=False) data = self.process_response(response, date_time_sent, 'Markets', error_handler=err_mkt_info) return parse_market(listy_mc_list(data.get('data', [])), {})if data.get('data') else []
def get_selection_trades(self, selection_info, currency='EUR'): """ Get the history of trades on the selection(s) specified. :param selection_info: list of dicts of selection information. :param currency: 3 letter code for currency to return trade info in. :return: trades on any selections provided from the tradeId specified. """ params = self.client.readonly_types['ListSelectionTradesRequest']( _value_1=[{ 'selectionRequests': { 'selectionId': s_i.get('selectionId'), 'fromTradeId': s_i.get('fromTradeId') } } for s_i in selection_info], currency=currency, ) date_time_sent = datetime.datetime.utcnow() response = self.request('ListSelectionTrades', params, secure=False) data = self.process_response(response, date_time_sent, 'SelectionTrades', error_handler=err_selection_trades) return [ parse_selection_trades(trd) for trd in listy_mc_list(data.get('data', [])) ] if data.get('data') else []
def get_prices(self, market_ids, ThresholdAmount=5., NumberForPricesRequired=-1, NumberAgainstPricesRequired=-1, WantMarketMatchedAmount=Boolean.T.value, WantSelectionsMatchedAmounts=Boolean.T.value, WantSelectionMatchedDetails=Boolean.T.value): """ Get prices by selection for all markets given in market_ids. :param market_ids: Markets to get prices for. :param ThresholdAmount: Minimum backers stake at a level for that level to be included. :param NumberForPricesRequired: Depth of the Back side of the book to cut off at, -1 returns all available. :param NumberAgainstPricesRequired: Depth of the Lay side of the book to cut off at, -1 returns all available. :param WantMarketMatchedAmount: whether or not the total amount matched on the market is returned. :param WantSelectionsMatchedAmounts: whether or not the total amount matched on each selection is returned. :param WantSelectionMatchedDetails: whether or not details about the last match occurring on each selection. :return: Prices for each selection in each market. """ date_time_sent = datetime.datetime.utcnow() params = self.client.readonly_types['GetPricesRequest']( _value_1=[{'MarketIds': e_id} for e_id in market_ids], ThresholdAmount=ThresholdAmount, NumberForPricesRequired=NumberForPricesRequired, NumberAgainstPricesRequired=NumberAgainstPricesRequired, WantMarketMatchedAmount=WantMarketMatchedAmount, WantSelectionsMatchedAmounts=WantSelectionsMatchedAmounts, WantSelectionMatchedDetails=WantSelectionMatchedDetails, ) response = self.request('GetPrices', params, secure=False) data = self.process_response(response, date_time_sent, 'MarketPrices', error_handler=err_prices) return [parse_market_prices(mkt) for mkt in listy_mc_list(data.get('data', []))] if data.get('data') else []
def err_sport_markets(response): err_data = [{ **get_attribs(mkt), **parse_market_classifier(mkt), **{ 'EventClassifiers': parse_event_classfiers(mkt) } } for mkt in response.get('_raw_elements', [])] response['EventClassifiers'] = listy_mc_list( response.get('EventClassifiers', [])) + err_data return response
def get_selection_changes(self, SelectionSequenceNumber): """ Poll to see if any selections have changed since the previous poll. :param SelectionSequenceNumber: sequence of the poll to check diffs from. :return: any changes to selections since the given sequence number. """ params = clean_locals(locals()) date_time_sent = datetime.datetime.utcnow() response = self.request('ListSelectionsChangedSince', params, secure=False) data = self.process_response(response, date_time_sent, 'Selections', error_handler=err_selection_changes) return [parse_selection_changes(chg) for chg in listy_mc_list(data.get('data', []))] if data.get('data') else []
def get_market_withdrawals(self, MarketId): """ Get the prices for a particular market. :param MarketId: ID of the market to check for withdrawals. :return: any withdrawals from the market. """ params = clean_locals(locals()) date_time_sent = datetime.datetime.utcnow() response = self.request('ListMarketWithdrawalHistory', params, secure=False) data = self.process_response(response, date_time_sent, 'Withdrawals', error_handler=err_withdrawals) return [parse_market_withdrawal(mkt) for mkt in listy_mc_list(data.get('data', []))] if data.get('data') else []
def get_sports(self, WantPlayMarkets=None): """ Get list of sports and their IDs. :param WantPlayMarkets: whether to return play or real markets :return: """ params = clean_locals(locals()) date_time_sent = datetime.datetime.utcnow() response = self.request('ListTopLevelEvents', params, secure=False) data = self.process_response(response, date_time_sent, 'EventClassifiers', error_handler=err_sports) return [parse_sports(sport) for sport in listy_mc_list(data.get('data', []))] if data.get('data') else []
def err_sp_events(response): err_data = [{ **get_attribs(child), **{ 'MarketTypeIds': { 'MarketTypeId': sub_child.values() } for sub_child in child } } for child in response.get('_raw_elements', [])] response['SPEnabledEvent'] = listy_mc_list( response.get('SPEnabledEvent', [])) + err_data return response
def get_single_order(self, OrderId): """ Get full detail and history about an individual order. :param order_id: id of the order we wish to get history for. :type order_id: int :return: single orders history and current status. """ params = clean_locals(locals()) date_time_sent = datetime.datetime.utcnow() response = self.request('GetOrderDetails', params, secure=True) data = self.process_response(response, date_time_sent, None) return listy_mc_list(parse_single_order(data.get('data', {})) if data.get('data') else {})
def get_markets_with_sp2(self): """ Get information defining which markets are enabled for starting-price orders. :return: information on which markets have SP. """ response = self.request('GetSPEnabledMarketsInformation', {}, secure=False, raw=True) events = response['GetSPEnabledMarketsInformationResponse'][ 'GetSPEnabledMarketsInformationResult']['SPEnabledEvent'] data = [] for event in events: market_type_ids = listy_mc_list( event['MarketTypeIds']['MarketTypeId']) market_type_ids = [int(x) for x in market_type_ids] row = { 'event_id': int(event['@eventId']), 'market_type_ids': market_type_ids } data.append(row) return data
def err_cancel_market(response): err_data = parse_classifier(response.get('_raw_elements', []), 'Order') response['Order'] = listy_mc_list(response.get('Order', [])) + err_data return response
def err_suspend_orders(response): err_data = parse_classifier(response.get('_raw_elements', []), 'Orders') response['Orders'] = listy_mc_list(response.get('Orders', [])) + err_data return response
def err_selection_trades(response): err_data = parse_selection_trades_classifier( response.get('_raw_elements', [])) response['SelectionTrades'] = listy_mc_list( response.get('SelectionTrades')) + err_data return response
def err_mkt_info(response): err_data = parse_market_classifier(response.get('_raw_elements', [])) response['Markets'] = listy_mc_list(response.get( 'Markets', [])) + err_data.get('Markets', []) return response
def err_selection_changes(response): err_data = parse_selection_sequence_classifier( response.get('_raw_elements', [])) response['Selections'] = listy_mc_list(response.get('Selections', [])) + err_data return response
def err_withdrawals(response): err_data = parse_classifier(response.get('_raw_elements', []), 'Withdrawals') response['Withdrawals'] = listy_mc_list(response.get('Withdrawals', [])) + err_data return response