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
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
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
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)
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
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)
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
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
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