from otree.api import * import random doc = """ In a common value auction game, players simultaneously bid on the item being auctioned.
Prior to bidding, they are given an estimate of the actual value of the item. This actual value is revealed after the bidding.
Bids are private. The player with the highest bid wins the auction, but payoff depends on the bid amount and the actual value.
""" class C(BaseConstants): NAME_IN_URL = 'common_value_auction_JAPANESE' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 15 INSTRUCTIONS_TEMPLATE = 'common_value_auction_JAPANESE/instructions.html' BID_MIN = cu(0) BID_MAX = cu(600) # Error margin for the value estimates shown to the players BID_NOISE = cu(1) class Subsession(BaseSubsession): def creating_session(self): self.group_randomly() class Group(BaseGroup): item_value = models.CurrencyField( doc="""Common value of the item to be auctioned, random for treatment""" ) # highest_bid = models.CurrencyField() number_1 = models.IntegerField() number_2 = models.IntegerField() number_3 = models.IntegerField() number_4 = models.IntegerField() class Player(BasePlayer): item_value_estimate = models.CurrencyField( doc="""Estimate of the common value, may be different for each player""" ) bid_amount0 = models.CurrencyField( min=C.BID_MIN, max=C.BID_MAX, doc="""Amount bidded by the player""", label="Bid amount", ) bid_amount1 = models.CurrencyField( min=C.BID_MIN, max=C.BID_MAX, doc="""Amount bidded by the player""", label="Bid amount", ) bid_amount2 = models.CurrencyField( min=C.BID_MIN, max=C.BID_MAX, doc="""Amount bidded by the player""", label="Bid amount", ) bid_amount3 = models.CurrencyField( min=C.BID_MIN, max=C.BID_MAX, doc="""Amount bidded by the player""", label="Bid amount", ) bid_amount4 = models.CurrencyField( min=C.BID_MIN, max=C.BID_MAX, doc="""Amount bidded by the player""", label="Bid amount", ) is_winner = models.BooleanField( initial=False, doc="""Indicates whether the player is the winner""" ) sum_of_numbers = models.IntegerField() number_entered = models.IntegerField() # FUNCTIONS def creating_session(subsession: Subsession): subsession.group_randomly(fixed_id_in_group=True) for g in subsession.get_groups(): import random item_value = random.uniform(C.BID_MIN, C.BID_MAX) g.item_value = round(item_value, 1) g.number_1 = random.randint(1,100) g.number_2 = random.randint(1,100) g.number_3 = random.randint(1, 100) g.number_4 = random.randint(1, 100) # def set_winner(group: Group): # import random # # players = group.get_players() # group.highest_bid = max([p.bid_amount for p in players]) # players_with_highest_bid = [p for p in players if p.bid_amount == group.highest_bid] # winner = random.choice( # players_with_highest_bid # ) # if tie, winner is chosen at random # winner.is_winner = True # for p in players: # set_payoff(p) def generate_value_estimate(group: Group): import random estimate = group.item_value + random.uniform(-C.BID_NOISE, C.BID_NOISE) estimate = round(estimate, 1) if estimate < C.BID_MIN: estimate = C.BID_MIN if estimate > C.BID_MAX: estimate = C.BID_MAX return estimate def set_payoff(player: Player): group = player.group # if player.is_winner: # player.payoff = group.item_value - player.bid_amount # if player.payoff < 0: # player.payoff = 0 # else: # player.payoff = 0 # PAGES class Introduction(Page): @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group player.item_value_estimate = generate_value_estimate(group) class Bid0(Page): form_model = 'player' form_fields = ['bid_amount0'] @staticmethod def vars_for_template(player: Player): if player.id_in_group == 1: number_1 = player.group.number_1 player.sum_of_numbers = number_1 return { "number_1": number_1, "sum_of_number": player.sum_of_numbers } else: number_1 = player.group.number_4 player.sum_of_numbers = number_1 return { "number_1": number_1, "sum_of_number": player.sum_of_numbers } class Bid1(Page): form_model = 'player' form_fields = ['bid_amount1'] @staticmethod def vars_for_template(player: Player): if player.id_in_group == 1: number_1 = player.group.number_1 player.sum_of_numbers = number_1 return { "number_1":number_1, "sum_of_number":player.sum_of_numbers } else: number_1 = player.group.number_4 player.sum_of_numbers = number_1 return { "number_1":number_1, "sum_of_number":player.sum_of_numbers } class Bid2(Page): form_model = 'player' form_fields = ['bid_amount2'] @staticmethod def vars_for_template(player: Player): if player.id_in_group == 1: number_1 = player.group.number_1 number_2 = player.group.number_2 player.sum_of_numbers = number_1+number_2 return { "number_1":number_1, "number_2":number_2, "sum_of_number":player.sum_of_numbers } else: number_1 = player.group.number_4 number_2 = player.group.number_3 player.sum_of_numbers = number_1+number_2 return { "number_1":number_1, "number_2":number_2, "sum_of_number":player.sum_of_numbers } class Bid3(Page): form_model = 'player' form_fields = ['bid_amount3'] @staticmethod def vars_for_template(player: Player): if player.id_in_group == 1: number_1 = player.group.number_1 number_2 = player.group.number_2 number_3 = player.group.number_3 player.sum_of_numbers = number_1+number_2+number_3 return { "number_1":number_1, "number_2":number_2, "number_3":number_3, "sum_of_number":player.sum_of_numbers } else: number_1 = player.group.number_4 number_2 = player.group.number_3 number_3 = player.group.number_2 player.sum_of_numbers = number_1+number_2+number_3 return { "number_1":number_1, "number_2":number_2, "number_3":number_3, "sum_of_number":player.sum_of_numbers } class Bid4(Page): form_model = 'player' form_fields = ['bid_amount4'] @staticmethod def vars_for_template(player: Player): if player.id_in_group == 1: number_1 = player.group.number_1 number_2 = player.group.number_2 number_3 = player.group.number_3 number_4 = player.group.number_4 player.sum_of_numbers = number_1+number_2+number_3+number_4 return { "number_1":number_1, "number_2":number_2, "number_3":number_3, "number_4":number_4, "sum_of_number":player.sum_of_numbers } else: number_1 = player.group.number_4 number_2 = player.group.number_3 number_3 = player.group.number_2 number_4 = player.group.number_1 player.sum_of_numbers = number_1+number_2+number_3+number_4 return { "number_1":number_1, "number_2":number_2, "number_3":number_3, "number_4":number_4, "sum_of_number":player.sum_of_numbers } class ResultsWaitPage(WaitPage): pass # after_all_players_arrive = set_winner class Results(Page): @staticmethod def vars_for_template(player: Player): group = player.group # return dict(is_greedy=group.item_value - player.bid_amount < 0) page_sequence = [Introduction, Bid0, Bid1, Bid2, Bid3, Bid4, ResultsWaitPage]