コード例 #1
0
ファイル: qwerty.py プロジェクト: timofeic/bfbot
def main():
    """The brains of the bot
    Finds all the races
    """
    betfairClient = bfclient.BfClient()
    eventResponse = None
    race_list = None
    cardGenTime = 0
    login_timer = 0

    while True:
        login_rsp = auth.login(betfairClient)
        # Generate the list of available races. Limit the result to 100
        (race_list, cardGenTime) = gen_race_list(cardGenTime, race_list, betfairClient)
        # get the exchangeId, marketId for the next race and race_queue
        # refactor - turn into class, return object.
        (exchangeId, marketId, race_queue, race_list) = get_next_race(race_list)
        # determine race status, proceed if it is active.
        market_price = qwertymarket.getMarketPricesCompressed(betfairClient,
                                                            exchangeId,
                                                            marketId)
        market_status = qwertymarket.marketStatus(market_price)
        if market_status == 'CLOSED':
            logger.debug('Oops market is closed, finding the next race/market')
            time.sleep(2)
            continue
        elif market_status == 'SUSPENDED':
            logger.debug('Market is now suspended, finding the next race/market')
            time.sleep(5)
            continue
        # Great the next race is active, lets find out when it starts
        market_info = qwertymarket.getMarketInfo(betfairClient,
                                                exchangeId,
                                                marketId)
        TTL = qwertymarket.timeTillRaceStarts(market_info)
        logger.info('Time till live: %s', TTL)
        if TTL > 240: #if time till race is more than 5 minutes away
            handle_long_ttl(cardGenTime, race_list, market_info)
        elif market_price.marketPrices.delay > 0:
            logger.info("-------------Market is in-play---------------")
            time.sleep(10)
            continue
        # nested while true, why? Because we don't want it to change races if it's active.
        while True:
            try:
                collectData.collectData(betfairClient, exchangeId,
                                        marketId)
                timeId = collectData.Datastore[marketId]['timeId']
                IDgap = collectData.Datastore[marketId]['IDgap']
                if IDgap == 0:
                    time.sleep(2)
                    logger.debug('IDgap is zero')
                    continue #don't run anything else
            except IndexError:
                if handle_IndexError(betfairClient, exchangeId, marketId):
                    continue
                else:
                    break
            except ZeroDivisionError:
                logger.warning('Zero Division Exception caught.')
                break
            except bfpy.bferror.BfNetworkError:
                logger.error("Network timed out...retrying...")
                continue
            except Exception, e:
                logger.exception('Collecting data at timeId: %s', timeId)
                raise e
            try:
                play.inPlay(betfairClient, exchangeId, marketId, timeId)
                play.pastPlay(betfairClient, exchangeId, marketId, timeId)
            except play.InPlayClause as e:
                logger.debug('In Play is greater than 30 seconds, look for the next race')
                break
            except Exception as e:
                logger.exception('Running inPlay or pastPlay')
                raise e
            try:
                for fillInId in range(timeId-IDgap+1, timeId+1):
                    for selectionId in collectData.Datastore[marketId]['runnerKeys']:
                        if fillInId != timeId:
                            collectData.fillInMissingData(marketId, selectionId,
                                                        fillInId, timeId)
                        if fillInId >= 30:
                            selection.calculateTPS(marketId, selectionId, fillInId)
            except IndexError:
                if handle_IndexError(betfairClient, exchangeId, marketId):
                    continue
                else:
                    break
            except ZeroDivisionError:
                logger.warning('Zero Division Exception caught.')
                break
            except Exception, e:
                logger.exception('Filling missing data or calculating TPS at timeId: %s', timeId)
                raise e
            try:
                if timeId > 1: selection.selectionCriteria(marketId, timeId)
                for selectionId in collectData.Datastore[marketId]['selectedRunnerIds']:
                    if 'max30BP' not in collectData.Datastore[marketId][selectionId][0].keys():
                        for backCalc in range(0, timeId - IDgap+1):
                            analysis.analyse(marketId, selectionId, backCalc)
                            if backCalc == timeId - IDgap:
                                logger.info('Successful back analysis of %s to timeId %s',
                                            collectData.Datastore[marketId][selectionId]['HorseName'],
                                            backCalc)
                                collectData.Datastore[marketId][selectionId]['backCalc'] = backCalc
                    for fillInId in range(timeId-IDgap+1, timeId+1):
                        analysis.analyse(marketId, selectionId, fillInId)
            except IndexError:
                if handle_IndexError(betfairClient, exchangeId, marketId):
                    continue
                else:
                    break
            except ZeroDivisionError:
                logger.warning('Zero Division Exception caught.')
                break
            except Exception, e:
                logger.exception('Error: Running Analysis or selecting horses at timeId: %s',
                                timeId)
                logger.exception("timeId: %s", timeId)
                raise e
コード例 #2
0
ファイル: collectData.py プロジェクト: timofeic/bfbot
     if marketId in Datastore.keys():
         Datastore[marketId]['inPlayDelay'] = market_price.marketPrices.delay
     time.sleep(1)
     raise IndexError
 except Exception, e:
     collectlogger.exception('Horses dictionary failed at timeId %s', timeId)
     raise e
 if marketId not in Datastore.keys():
     Datastore[marketId] = horses
     Datastore[marketId]['runnerKeys'] = horses.keys()
     market = qwertymarket.getMarket(betfairClient,exchangeId,marketId)
     Datastore[marketId]['exchange'] = exchangeId
     Datastore[marketId]['marketLocation'] = market.market.menuPath
     Datastore[marketId]['marketName'] = market.market.name
     Datastore[marketId]['openTime'] = openTime
     market_info = qwertymarket.getMarketInfo(betfairClient,exchangeId,marketId)
     Datastore[marketId]['TTL'] = qwertymarket.timeTillRaceStarts(market_info)
     Datastore[marketId]['timeDelta'] = timeDelta
     Datastore[marketId]['marketTime'] = market.market.marketTime
     Datastore[marketId]['numHorses'] = len(market.market.runners)
     Datastore[marketId]['selectedRunnerIds'] = []
     collectlogger.info("Market Name and Location: %s | %s ",
                         Datastore[marketId]['marketName'], Datastore[marketId]['marketLocation'])
     for horseCount in range(0,len(Datastore[marketId]['runnerKeys'])):
         selectionId = market.market.runners[horseCount].selectionId
         Datastore[marketId][selectionId]['HorseName'] = market.market.runners[horseCount].name
 else:
     Datastore[marketId]['runnerKeys'] = horses.keys() #for removed runners
     Datastore[marketId]['selectedRunnerIds'] = list(set(Datastore[marketId]['selectedRunnerIds']) &
                                                     set(Datastore[marketId][runnerKeys]))
     for selectionId in Datastore[marketId][runnerKeys]:
コード例 #3
0
ファイル: test.py プロジェクト: timofeic/bfbot
 def test_time_till_market(self):
     self.market_info = getMarketInfo(self.bf_client, self.exchangeId, self.marketId)
     self.ttl = timeTillRaceStarts(self.market_info)
     self.assertIsNotNone(self.ttl)