from otree.api import (
models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer,
Currency as c, currency_range, Page, WaitPage
)
cu = c
doc = '\nIn a common value auction game, players simultaneously bid on the item being\nauctioned.
\nPrior to bidding, they are given an estimate of the actual value of the item.\nThis actual value is revealed after the bidding.
\nBids are private. The player with the highest bid wins the auction, but\npayoff depends on the bid amount and the actual value.
\n'
class Constants(BaseConstants):
name_in_url = 'auction_asset_two_realized'
players_per_group = None
num_rounds = 1
min_allowable_bid = c(0)
max_allowable_bid = c(12.5)
instructions_template = 'auction_asset_two_realized/instructions.html'
def creating_session(subsession):
pass
class Subsession(BaseSubsession):
creating_session = creating_session
def set_winner_Type2(group):
import random
players = group.get_players()
playerbidnumber = max([p.id_in_group for p in players])
allbids = []
firstcount = 0
othercount = 0
while firstcount < playerbidnumber:
freshplayer = firstcount + 1
currentperson = group.get_player_by_id(freshplayer)
while othercount < currentperson.number_Type2:
allbids.append(currentperson.bid_amount_type2)
othercount = othercount + 1
firstcount = firstcount + 1
othercount = 0
bidsinorder = sorted(allbids, reverse=True)
counter = 0
bidslots = 0
endcheck = 0
totalbids = 0
for p in players:
if p.bid_amount_type2 > 0:
totalbids = totalbids + p.number_Type2
if totalbids < playerbidnumber*2:
for p in players:
if p.bid_amount_type2 > 0 and p.number_Type2 > 0:
p.owned_type2 = p.number_Type2
counter = counter + p.number_Type2
else:
p.owned_type2 = 1
counter = counter + 1
players_with_marginal_bid = [p for p in players if p.bid_amount_type2 == 0 or p.number_Type2 == 0]
while counter < playerbidnumber*2:
receiver = random.choice(players)
if receiver.owned_type2 < 4:
receiver.owned_type2 = receiver.owned_type2 + 1
counter = counter + 1
endcheck = 3
if totalbids >= playerbidnumber*2:
for p in players:
if p.bid_amount_type2 > bidsinorder[playerbidnumber*2-1]:
p.owned_type2 = p.number_Type2
counter = counter + p.number_Type2
elif p.bid_amount_type2 == bidsinorder[playerbidnumber*2-1]:
p.owned_type2 = p.number_Type2
counter = counter + p.number_Type2
players_with_marginal_bid = [
p for p in players if p.bid_amount_type2 == bidsinorder[playerbidnumber*2-1]
]
else:
p.owned_type2 = 0
endcheck = 1
if counter > playerbidnumber*2:
while counter > playerbidnumber*2:
winner = random.choice(
players_with_marginal_bid
) # if tie, winner is chosen at random
winner.owned_type2 = winner.owned_type2 - 1
if winner.owned_type2 > - 1:
counter = counter - 1
else:
winner.owned_type2 = 0
for p in players:
if endcheck == 1:
p.auction_spending2 = p.owned_type2*bidsinorder[playerbidnumber*2-1]
p.asset2auctionprice = bidsinorder[playerbidnumber*2-1]
if endcheck == 2:
p.auction_spending2 = p.owned_type2*bidsinorder[bidslots-1]
p.asset2auctionprice = bidsinorder[bidslots-1]
if endcheck == 3:
p.auction_spending2 = 0
p.asset2auctionprice = 0
p.initial_spending = p.auction_spending2
p.available_funds = p.available_funds - p.initial_spending
def my_function(group):
players = group.get_players()
for p in players:
set_this_data(p)
def create_outcome(group):
import random
players = group.get_players()
asset2gen = random.random()
if asset2gen < .1:
group.asset2outcome = "Asset 2 gained 90 cents."
for p in players:
p.available_funds = p.available_funds + .9*p.owned_type2
p.asset2earningschange = .9*p.owned_type2
p.asset2endvalue = 2.5
else:
group.asset2outcome = "Asset 2 lost 10 cents."
for p in players:
p.available_funds = p.available_funds + -.1*p.owned_type2
p.asset2earningschange = -.1*p.owned_type2
p.asset2endvalue = 2.5
def round1display(group):
players = group.get_players()
for p in players:
pull_round1data(p)
class Group(BaseGroup):
item_value = models.CurrencyField(doc='Common value of the item to be auctioned random for treatment')
highest_bid = models.CurrencyField()
u = models.IntegerField()
asset2outcome = models.StringField()
set_winner_Type2 = set_winner_Type2
my_function = my_function
create_outcome = create_outcome
round1display = round1display
def set_this_data(player):
participant = player.participant
participant.vars['type2'] = player.owned_type2
participant.vars['funds'] = 12.50
participant.vars['bankedaccount'] = player.available_funds
participant.vars['asset2value'] = player.asset2endvalue
participant.vars['asset2auctionprice'] = player.asset2auctionprice
participant.vars['purchasehistory2'] = player.purchasehistory2
def pull_round1data(player):
participant = player.participant
player.previousearnings = participant.vars['round1earnings']
player.bankedaccountprev = participant.vars['round1bankedaccount']
player.available_fundsprev = participant.vars['round1availablefunds']
player.owned_type1prev = participant.vars['round1ownedtype1']
player.asset1valueprev = participant.vars['round1asset1value']
class Player(BasePlayer):
bid_amount_type2 = models.CurrencyField(label='Bid amount for assets', max=Constants.max_allowable_bid, min=0)
number_Type2 = models.IntegerField(label='Number of assets to purchase (maximum)', max=4, min=0)
initial_spending = models.CurrencyField()
owned_type2 = models.IntegerField(initial=0)
auction_spending2 = models.CurrencyField()
available_funds = models.CurrencyField(initial=12.5)
asset2endvalue = models.CurrencyField()
asset2auctionprice = models.CurrencyField()
purchasehistory2 = models.LongStringField(initial='Nothing')
previousearnings = models.CurrencyField(initial=0)
bankedaccountprev = models.CurrencyField()
available_fundsprev = models.CurrencyField()
owned_type1prev = models.IntegerField()
asset1valueprev = models.CurrencyField()
asset2earningschange = models.CurrencyField(initial=0)
set_this_data = set_this_data
pull_round1data = pull_round1data