예제 #1
0
    def getorder(self, time, markets):
        order = None
        if self.numOfBets < 1 and self.id == 0:
            order = Order(0, self.id, 0, 'Back', 10.0, 1, 1, time)

        elif self.numOfBets < 1 and self.id == 1:
            order = Order(0, self.id, 0, 'Lay', 9.0, 1, 1, time)

        return order
예제 #2
0
    def respond(self, time, markets, trade):
        order = None
        if self.predicted == False or self.bettingPeriod == False: return order

        #print(self.predictedWinner)
        #print("LOSER: " + str(self.predictedLoser))

        if self.job == 'back_pred_winner':
            if markets[self.exchange][self.predictedWinner]['backs']['n'] > 0:
                quoteodds = max(
                    MIN_ODDS, markets[self.exchange][self.predictedWinner]
                    ['backs']['best'] - 0.1)
            else:
                quoteodds = markets[self.exchange][
                    self.predictedWinner]['backs']['worst']
            order = Order(self.exchange, self.id, self.predictedWinner, 'Back',
                          quoteodds,
                          random.randint(self.stakeLower, self.stakeHigher),
                          markets[self.exchange][self.predictedWinner]['QID'],
                          time)
            self.job = "lay_pred_loser"

        elif self.job == 'lay_pred_loser':
            if markets[self.exchange][self.predictedLoser]['lays']['n'] > 0:
                quoteodds = markets[self.exchange][
                    self.predictedLoser]['lays']['best'] + 0.1
            else:
                quoteodds = markets[self.exchange][
                    self.predictedLoser]['lays']['worst']
            order = Order(self.exchange, self.id, self.predictedLoser, 'Lay',
                          quoteodds,
                          random.randint(self.stakeLower, self.stakeHigher),
                          markets[self.exchange][self.predictedLoser]['QID'],
                          time)
            self.job = None

        if order != None:
            if (order.direction == 'Back'):
                liability = self.amountFromOrders + order.stake
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability

            elif (order.direction == 'Lay'):
                liability = self.amountFromOrders + (
                    (order.stake * order.odds) - order.stake)
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability
예제 #3
0
    def respond(self, time, markets, trade):
        order = None
        if self.numOfBets >= 10 or self.raceStarted == False or self.bettingPeriod == False:
            return order
        if self.bettingTime <= self.raceTimestep:
            if self.job == 'back_underdog':
                if markets[self.exchange][self.compInSecond]['backs']['n'] > 0:
                    quoteodds = max(
                        MIN_ODDS, markets[self.exchange][self.compInSecond]
                        ['backs']['best'] - 0.1)
                else:
                    quoteodds = markets[self.exchange][
                        self.compInTheLead]['backs']['worst']
                order = Order(
                    self.exchange, self.id, self.compInSecond,
                    'Back', quoteodds,
                    random.randint(self.stakeLower, self.stakeHigher),
                    markets[self.exchange][self.compInSecond]['QID'], time)
                self.job = "lay_leader"

            elif self.job == 'lay_leader':
                if markets[self.exchange][self.compInTheLead]['lays']['n'] > 0:
                    quoteodds = markets[self.exchange][
                        self.compInTheLead]['lays']['best'] + 0.1
                else:
                    quoteodds = markets[self.exchange][
                        self.compInTheLead]['lays']['worst']
                order = Order(
                    self.exchange, self.id, self.compInTheLead,
                    'Lay', quoteodds,
                    random.randint(self.stakeLower, self.stakeHigher),
                    markets[self.exchange][self.compInTheLead]['QID'], time)
                self.job = None

        if order != None:
            if (order.direction == 'Back'):
                liability = self.amountFromOrders + order.stake
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability

            elif (order.direction == 'Lay'):
                liability = self.amountFromOrders + (
                    (order.stake * order.odds) - order.stake)
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability
예제 #4
0
 def getInPlayOrder(self, time, markets):
     order = None
     if (self.raceTimestep % self.updateInterval) == 0:
         odds = getInPlayOdds(self.raceTimestep, self.id)
         # plotting code
         row = [self.raceTimestep]
         for i in range(len(odds)):
             row.append(odds[i])
         self.oddsData.append(row)
         ##
         #print("AGENT ID: " + str(self.id) + " " + str(self.id) + " In Play Odds Pred: " + str(row))
         winner = None
         winnerOdds = MAX_ODDS
         for i in range(len(odds)):
             quoteodds = odds[i]
             direction = 'Back'
             if quoteodds == MAX_ODDS:
                 direction = 'Lay'
                 if markets[self.exchange][i]['backs']['n'] > 0:
                     quoteodds = markets[
                         self.exchange][i]['backs']['best'] + self.layDelta
                     order = Order(
                         self.exchange, self.id, i, direction,
                         max(MIN_ODDS, quoteodds),
                         random.randint(self.stakeLower, self.stakeHigher),
                         markets[self.exchange][i]['QID'], time)
                 else:
                     continue
             elif (markets[self.exchange][i]['backs']['n'] > 0):
                 if (quoteodds <
                         markets[self.exchange][i]['backs']['best']):
                     quoteodds = quoteodds - self.backDelta
                     order = Order(
                         self.exchange, self.id, i, direction,
                         max(MIN_ODDS, quoteodds),
                         random.randint(self.stakeLower, self.stakeHigher),
                         markets[self.exchange][i]['QID'], time)
                     self.orders.append(order)
             else:
                 quoteodds = quoteodds - self.backDelta
                 order = Order(
                     self.exchange, self.id, i, direction,
                     max(MIN_ODDS, quoteodds),
                     random.randint(self.stakeLower, self.stakeHigher),
                     markets[self.exchange][i]['QID'], time)
                 self.orders.append(order)
예제 #5
0
    def respond(self, time, markets, trade):
        order = None
        if self.bettingPeriod == False: return None
        r = random.randint(0, 10)
        if (r == 0):
            c = random.randint(0, NUM_OF_COMPETITORS - 1)
            e = random.randint(0, NUM_OF_EXCHANGES - 1)
            b = random.randint(0, 1)
            delta = b = random.randint(-1, 1)
            if (b == 0):
                quoteodds = MIN_ODDS
                if markets[e][c]['lays']['n'] > 0:
                    quoteodds = markets[e][c]['lays']['best'] + delta
                    order = Order(
                        e, self.id, c, 'Back',
                        min(MAX_ODDS, max(MIN_ODDS, quoteodds)),
                        random.randint(self.stakeLower, self.stakeHigher),
                        markets[e][c]['QID'], time)
                #print("BACK MADE BY AGENT " + str(self.id))
            else:
                quoteodds = MAX_ODDS
                if markets[e][c]['backs']['n'] > 0:
                    quoteodds = markets[e][c]['backs']['best'] + delta
                    order = Order(
                        e, self.id, c, 'Lay',
                        min(MAX_ODDS, max(MIN_ODDS, quoteodds)),
                        random.randint(self.stakeLower, self.stakeHigher),
                        markets[e][c]['QID'], time)
                #print("LAY MADE BY AGENT " + str(self.id))

        if order != None:
            if (order.direction == 'Back'):
                liability = self.amountFromOrders + order.stake
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability

            elif (order.direction == 'Lay'):
                liability = self.amountFromOrders + (
                    (order.stake * order.odds) - order.stake)
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability
예제 #6
0
 def getExAnteOrder(self, time, markets):
     for i in range(len(self.exAnteOdds)):
         odds = self.exAnteOdds[i]
         direction = 'Back'
         if odds == MAX_ODDS:
             direction = 'Lay'
             if markets[self.exchange][i]['backs']['n'] > 0:
                 odds = markets[
                     self.exchange][i]['backs']['best'] + self.layDelta
             else:
                 continue
         if direction == 'Back': odds = odds - self.backDelta
         order = Order(self.exchange, self.id, i, direction,
                       max(MIN_ODDS, odds),
                       random.randint(self.stakeLower, self.stakeHigher),
                       markets[self.exchange][i]['QID'], time)
         self.orders.append(order)
예제 #7
0
    def respond(self, time, markets, trade):
        if self.bettingPeriod == False: return None
        order = None
        marketsFave = None
        lowestOdds = MAX_ODDS
        for comp in markets[self.exchange]:
            market = markets[self.exchange][comp]
            if market['backs']['n'] > 0:
                bestodds = market['backs']['best']
                if bestodds < lowestOdds:
                    lowestOdds = bestodds
                    marketsFave = comp

        if marketsFave == self.marketsFave:
            # market favourite hasn't changed therefore no need to back again
            return None

        elif marketsFave != None:
            self.marketsFave = marketsFave
            quoteodds = max(MIN_ODDS, lowestOdds - 0.1)
            order = Order(self.exchange, self.id, marketsFave, 'Back',
                          quoteodds,
                          random.randint(self.stakeLower, self.stakeHigher),
                          markets[self.exchange][marketsFave]['QID'], time)

        if order != None:
            if (order.direction == 'Back'):
                liability = self.amountFromOrders + order.stake
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability

            elif (order.direction == 'Lay'):
                liability = self.amountFromOrders + (
                    (order.stake * order.odds) - order.stake)
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability
예제 #8
0
    def respond(self, time, markets, trade):
        if self.bettingPeriod == False: return None
        order = None
        if self.raceStarted == False: return order
        if self.bettingTime <= self.raceTimestep and self.raceTimestep % self.bettingInterval == 0:
            sortedComps = sorted((self.currentRaceState.items()),
                                 key=operator.itemgetter(1))
            compInTheLead = int(sortedComps[len(sortedComps) - 1][0])
            if markets[self.exchange][compInTheLead]['backs']['n'] > 0:
                quoteodds = max(
                    MIN_ODDS,
                    markets[self.exchange][compInTheLead]['backs']['best'] -
                    0.1)
            else:
                quoteodds = markets[
                    self.exchange][compInTheLead]['backs']['worst']
            order = Order(self.exchange, self.id, compInTheLead, 'Back',
                          quoteodds,
                          random.randint(self.stakeLower, self.stakeHigher),
                          markets[self.exchange][compInTheLead]['QID'], time)

        if order != None:
            if (order.direction == 'Back'):
                liability = self.amountFromOrders + order.stake
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability

            elif (order.direction == 'Lay'):
                liability = self.amountFromOrders + (
                    (order.stake * order.odds) - order.stake)
                if liability > self.balance: return
                else:
                    self.orders.append(order)
                    self.amountFromOrders = liability
예제 #9
0
    def respond(self, t, markets, trade):
        def calculateArbOpportunities(self, opportunities, competitors):
            for i in range(len(competitors)):
                backOdds = competitors[i][0][1]
                backExchange = competitors[i][0][0]
                layOdds = competitors[i][2][1]
                layExchange = competitors[i][2][0]

                if layOdds == backOdds or backExchange == layExchange or layExchange == None or backExchange == None:
                    continue

                potentialBackWinnings = backOdds * self.backStake
                layStake = potentialBackWinnings / layOdds

                bet = [[backExchange, 'back', i, backOdds, self.backStake],
                       [layExchange, 'lay', i, layOdds, layStake]]
                opportunities.append(bet)

            if len(opportunities) < 1: return None
            else:
                r = random.randint(0, len(opportunities) - 1)
                return opportunities[r]

        # create list of best backs and lays for all competitors available on each exchange
        # if back odds are 2.06 on exchange 0 and lay odds are 2.0 for same competitor on exchange 1
        # then can back £100 on comp 1
        # and lay (100 * 1.0206) £104.04 on comp 1

        if self.inProcess == True:
            return

        competitors = []
        # list of all opportunities, each list item formatted as [(exchange, direction, competitor, odds, stake),(exchange, direction, competitor, odds, stake)]
        opportunities = []

        for c in range(NUM_OF_COMPETITORS):
            bestBack = (None, 100000)
            bestLay = (None, -1)
            worstBack = (None, -1)
            worstLay = (None, 100000)
            exchangeData = None

            for e in range(NUM_OF_EXCHANGES):
                exchange = markets[e]
                bestBackOnExchange = exchange[c]['backs']['best']
                bestLayOnExchange = exchange[c]['lays']['best']
                if bestBackOnExchange != None:
                    if (bestBackOnExchange < bestBack[1]):
                        bestBack = (e, bestBackOnExchange)
                    if (bestBackOnExchange > worstBack[1]):
                        worstBack = (e, bestBackOnExchange)
                if bestLayOnExchange != None:
                    if (bestLayOnExchange > bestLay[1]):
                        bestLay = (e, bestLayOnExchange)
                    if (bestLayOnExchange < worstLay[1]):
                        worstLay = (e, bestLayOnExchange)

            compOdds = [bestBack, worstBack, bestLay, worstLay]
            competitors.append(compOdds)

        bet = calculateArbOpportunities(self, opportunities, competitors)

        if bet != None and self.inProcess == False:
            back = bet[0]
            bExchange = back[0]
            bCompetitor = back[2]
            bOdds = back[3]
            lay = bet[1]
            lExchange = lay[0]
            lCompetitor = lay[2]
            lOdds = lay[3]
            lStake = lay[4]
            backBet = Order(bExchange, self.id, bCompetitor, 'Back', bOdds,
                            self.backStake,
                            markets[bExchange][bCompetitor]['QID'], t)
            layBet = Order(lExchange, self.id, lCompetitor, 'Lay', lOdds,
                           int(lStake), markets[lExchange][lCompetitor]['QID'],
                           time)
            t1 = time.time()

            for i in range(5):
                print("BING BING")
                time.sleep(1)

            stamp = (time.time() - t1) + t
            print(backBet)
            backBet.timestamp = stamp
            layBet.timestamp = stamp
            print(backBet)

            self.orders.append(backBet)
            self.orders.append(layBet)
            self.orderHistory.append(backBet)
            self.orderHistory.append(layBet)
            self.inProcess = True