import json import betfair from betfair import Betfair client = Betfair('eTnX7n6jsiaoGA9g', ('certs/client-2048.crt', 'certs/client-2048.key')) print 'Logging in' client.login('*****@*****.**', 'wyeslsc10') print 'Keeping alive' client.keep_alive() account_details = client.get_account_details() print account_details a = account_details.currency_code print a from betfair.models import MarketFilter event_types = client.list_event_types(MarketFilter(text_query='tennis')) print event_types print event_types[0] print event_types[0].event_type print(len(event_types)) # 2 print(event_types[0].event_type.name) # 'Tennis' tennis_event_type = event_types[0] markets = client.list_market_catalogue( MarketFilter(event_type_ids=[tennis_event_type.event_type.id])) print markets[0].market_name # 'Djokovic Tournament Wins'
import json import betfair from betfair import Betfair client = Betfair('eTnX7n6jsiaoGA9g', ('certs/client-2048.crt', 'certs/client-2048.key')) print 'Logging in' client.login('*****@*****.**', 'wyeslsc10') print 'Keeping alive' client.keep_alive() account_details = client.get_account_details() print account_details a = account_details.currency_code print a from betfair.models import MarketFilter event_types = client.list_event_types(MarketFilter(text_query='tennis')) print event_types print event_types[0] print event_types[0].event_type print(len(event_types)) # 2 print(event_types[0].event_type.name) # 'Tennis' tennis_event_type = event_types[0] markets = client.list_market_catalogue(MarketFilter(event_type_ids=[tennis_event_type.event_type.id])) print markets[0].market_name # 'Djokovic Tournament Wins' client.logout()
class Container(object, metaclass=Singleton): interested_types = ['WIN'] refresh_interval = 1 pre_match_interval = 30 historic_data_url = r'https://historicdata.betfair.com/api/GetMyData' def __init__(self, sandbox_key=False): self.selected_events = {} self.markets = {} self.client = None self.sandbox_key = sandbox_key # if true use sandbox,, if false use prod self.do_login() def do_login(self): __location = os.path.realpath( os.path.join(os.getcwd(), os.path.dirname(__file__))) username = config.get('Betfair', 'username') password = config.get('Betfair', 'password') certfile = config.get('Betfair', 'cert_file') devkey = config.get('Betfair', 'dev_app') prodkey = config.get('Betfair', 'prod_app') full_certfile = os.path.join(__location, certfile) self.client = Betfair(prodkey if not self.sandbox_key else devkey, full_certfile) self.client.login(username, password) def get_all_races(self): # Get all games, even those with no scores API feed, search 2 hours in the past delta = datetime.timedelta(seconds=60 * 70) to_time = datetime.datetime.now() + delta event_types = self.client.list_event_types( MarketFilter(text_query='horse')) horse_racing_id = event_types[0].event_type.id countries = config.get('Scraping', 'countries').split() events = self.client.list_events( filter=MarketFilter(event_type_ids=[horse_racing_id], market_countries=countries, market_start_time=TimeRange(to=to_time))) # market_type_codes=self.interested_types) if len(events) == 0: return [], [] # TODO: shouldn't these be returned as defaultdict? markets = defaultdict(list) for m in self.client.list_market_catalogue( MarketFilter(event_ids=[e.event.id for e in events], market_start_time=TimeRange(to=to_time), market_type_codes=self.interested_types), market_projection=[ MarketProjection['RUNNER_DESCRIPTION'], MarketProjection['EVENT'], MarketProjection['MARKET_DESCRIPTION'], MarketProjection['MARKET_START_TIME'] ]): markets[m.event.id].append((m.market_id, m)) return events, markets def get_single_race(self, market_id): events = self.client.list_events(filter=MarketFilter( market_ids=[market_id])) if len(events) == 0: return [], [] # TODO: shouldn't these be returned as defaultdict? markets = defaultdict(list) for m in self.client.list_market_catalogue( MarketFilter(market_ids=[market_id]), market_projection=[ MarketProjection['RUNNER_DESCRIPTION'], MarketProjection['EVENT'], MarketProjection['MARKET_DESCRIPTION'], MarketProjection['MARKET_START_TIME'] ]): markets[m.event.id].append((m.market_id, m)) return events, markets def update_markets(self, events, markets): pp = PriceProjection(price_data=[ 'EX_BEST_OFFERS', 'EX_TRADED', 'SP_AVAILABLE', 'SP_TRADED' ]) market_ids = [] for m in markets.values(): for r in m: market_ids.append(r[0]) markets_resp = [] for market_list in _split_list(market_ids): markets_resp.extend( self.client.list_market_book(market_ids=market_list, price_projection=pp)) return markets_resp def get_single_market(self, market_id): pp = PriceProjection( price_data=['EX_BEST_OFFERS', 'SP_AVAILABLE', 'SP_TRADED']) markets = self.client.list_market_book(market_ids=[market_id], price_projection=pp) return markets def place_limit_order(self, market, selection, stake, odds, side='BACK', persist='LAPSE', strategy=None): persist = config.getboolean("Betting", "persist") persist = 'LAPSE' if persist == False else 'PERSIST' bet = LimitOrder( size=max(2, stake) if side == 'BACK' else stake, # stake is minimum 2 GBP price=odds, persistence_type=persist) order = PlaceInstruction(order_type='LIMIT', selection_id=int(selection), side=side, limit_order=bet) return self.client.place_orders(market, [order], customer_ref="MRE-{}-{}".format( market, selection), strategy_ref=strategy) def place_fill_or_kill(self, market, selection, stake, odds, side='BACK', strategy=None): bet = LimitOrder( size=max(2, stake) if side == 'BACK' else stake, price=odds, persistence_type='LAPSE', time_in_force='FILL_OR_KILL', min_fill_size=max(2, stake) if side == 'BACK' else stake) order = PlaceInstruction(order_type='LIMIT', selection_id=int(selection), side=side, limit_order=bet) return self.client.place_orders(market, [order], customer_ref="MRE-{}-{}".format( market, selection), strategy_ref=strategy) def welcome_message(self): acc = self.client.get_account_details() first_name = acc['first_name'] acc = self.client.get_account_funds() funds = acc.available_to_bet_balance return "Welcome %s, your account balance is %s" % (first_name, funds) def get_open_orders(self): """ Get current unfilled orders by market :return: dictionary of list of orders """ projection = OrderProjection['EXECUTABLE'] orders = self.client.list_current_orders(order_projection=projection) orders_by_market = defaultdict(list) for o in orders.current_orders: orders_by_market[o.market_id].append(o) return orders_by_market def replace_orders(self, market, bet_ids, new_prices): """ Replace current orders with new prices :param market: :param bet_ids: :param new_prices: :return: """ instructions = [] for bet_id, np in zip(bet_ids, new_prices): instruction = ReplaceInstruction(bet_id=bet_id, new_price=np) instructions.append(instruction) return self.client.replace_orders(market_id=market, instructions=instructions) def get_cleared_orders(self, from_time=datetime.datetime.today() + datetime.timedelta(-1)): orders = self.client.list_cleared_orders( event_type_ids=[7], bet_status='SETTLED', settled_date_range=TimeRange(from_=from_time)) trades_df = pd.DataFrame.from_records( [x.values() for x in orders['cleared_orders']]) total_commission = 0. if not trades_df.empty: trades_df.columns = orders['cleared_orders'][0].keys() total_commission_req = self.client.list_cleared_orders( event_type_ids=[7], bet_status='SETTLED', group_by='EVENT_TYPE', settled_date_range=TimeRange(from_=from_time)) total_commission = total_commission_req['cleared_orders'][ 0].commission return trades_df, total_commission def get_account_balance(self): result = self.client.get_account_funds() return {k: result.get(k) for k in result.keys()} def get_race_status(self, events): results = self.client.list_race_details(events) if results: return pd.DataFrame.from_records([x.values() for x in results], columns=results[0].keys()) def download_historic_data(self, start, end, countries=('GB', 'IE')): ssoid = self.client.session_token headers = {'ssoid': ssoid} d = { "sport": "Horse Racing", "plan": "Basic Plan", "fromDay": start.day, "fromMonth": start.month, "fromYear": start.year, "toDay": end.day, "toMonth": end.month, "toYear": end.year, "marketTypesCollection": ["WIN"], "countriesCollection": list(countries), "fileTypeCollection": ["M"] } response = requests.get( 'https://historicdata.betfair.com/api/DownloadListOfFiles', params=d, headers=headers) file_names = json.loads(response.text) races = [] def inner(f): race_data = requests.get( 'http://historicdata.betfair.com/api/DownloadFile', params={'filePath': f}, headers=headers) race_str = bz2.decompress(race_data.content).decode('utf8') return BetFairRace.create_from_json(race_str) pool = ThreadPool() for file in file_names: races.append(pool.apply_async(inner, args=tuple([file]))) pool.close() pool.join() return [r.get() for r in races]