from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) doc = """ This is two-period repeated Myerson's auction in the single buyer case. Mirrokni et al.,2020 . """ class Constants(BaseConstants): name_in_url = 'Static_mechanism' players_per_group = None num_rounds = 1 instructions_template = 'Static_mechanism/instructions.html' # Initial amount allocated to each player max_value = c(32) min_value = c(2) mean_value = c(6) endowment = c(100) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): reserve_m_1 = models.CurrencyField(initial=8) # reserve price in Myerson's in period 1 reserve_m_2 = models.CurrencyField(initial=8) # reserve price in Myerson's in period 2 value_1 = models.CurrencyField() # value in period 1 value_2 = models.CurrencyField() # value in Myerson's in period 2 get_1 = models.IntegerField() # Trade happened in period 1 get_2 = models.IntegerField() # Trade happened in period 2 profit_1 = models.CurrencyField() # Buyer's profit in period 1 profit_2 = models.CurrencyField() # Buyer's profit in period 2 profit = models.CurrencyField() # Buyer's profit in total account_1 = models.CurrencyField() # account in the end of period 1 account_2 = models.CurrencyField() # account in the end of period 2 revenue = models.CurrencyField() revenue_1 = models.CurrencyField() # Seller's revenue in period 1 revenue_2 = models.CurrencyField() # Seller's revenue in period 2 bid_1 = models.CurrencyField( min=0, max=Constants.max_value, doc="""Set a bid for period 1""", label="Please enter an amount from 0 to 32:", ) bid_2 = models.CurrencyField( min=0, max=Constants.max_value, doc="""Set a bid for period 2""", label="Please enter an amount from 0 to 32:", ) def get_value_1(self): import random random1 = random.randint(0,15) if random1 < 8: self.value_1 = 2 elif random1 < 12 : self.value_1 = 4 elif random1 < 14: self.value_1 = 8 elif random1 < 15 : self.value_1 = 16 else: self.value_1 = 32 def get_result_1(self): if self.bid_1 >= self.reserve_m_1: self.get_1 = 1 else: self.get_1 = 0 self.profit_1 = self.get_1 * (self.value_1 - self.reserve_m_1) self.account_1 = Constants.endowment + self.profit_1 self.revenue_1 = self.get_1 * self.reserve_m_1 def get_value_2(self): import random random2 = random.randint(0,15) if random2 < 8: self.value_2 = 2 elif random2 < 12: self.value_2 = 4 elif random2 < 14: self.value_2 = 8 elif random2 < 15: self.value_2 = 16 else: self.value_2 = 32 def get_result_2(self): if self.bid_2 >= self.reserve_m_2: self.get_2 = 1 else: self.get_2 = 0 self.profit_2 = self.get_2 * (self.value_2 - self.reserve_m_2) self.profit = self.profit_1 + self.profit_2 self.account_2 = self.account_1 + self.profit_2 self.revenue_2 = self.get_2 * self.reserve_m_2 self.revenue= self.revenue_1 + self.revenue_2