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 = 'market_rounds_realized' players_per_group = None num_rounds = 9 min_allowable_bid = c(0) instructions_template = 'market_rounds_realized/instructions.html' def creating_session(subsession): pass class Subsession(BaseSubsession): creating_session = creating_session def set_winner_Type1(group): import random players = group.get_players() playerbidnumber = max([p.id_in_group for p in players]) allbids = [] allasks = [] for p in players: p.change_Type1 = 0 if group.round_number == 1: p.won_type1 = p.owned_type1 firstcount = 0 secondcount = 0 buyoffers1 = 0 selloffers1 = 0 while firstcount < playerbidnumber: freshplayer = firstcount + 1 currentbuyer = group.get_player_by_id(freshplayer) numberofbids = 0 personbidnumber = currentbuyer.number_Type1 while numberofbids < personbidnumber: allbids.append(currentbuyer.buy_amount_type1) numberofbids = numberofbids + 1 buyoffers1 = buyoffers1 + 1 firstcount = firstcount + 1 bidsinorder = sorted(allbids, reverse=True) while secondcount < playerbidnumber: newestplayer = secondcount + 1 currentseller = group.get_player_by_id(newestplayer) numberofasks = 0 personasknumber = currentseller.number_sell_Type1 while numberofasks < personasknumber: allasks.append(currentseller.sell_amount_type1) numberofasks = numberofasks + 1 selloffers1 = selloffers1 + 1 secondcount = secondcount + 1 asksinorder = sorted(allasks, reverse=False) counter = 0 bidslots = 0 highestbid = 0 lowestask = 30 if buyoffers1 > 0: highestbid = bidsinorder[0] if selloffers1 > 0: lowestask = asksinorder[0] roundtype1price = 0 sellcheck1 = 1 buycheck1 = 1 if buyoffers1 > 0 and selloffers1 > 0 and highestbid > lowestask: while counter < 1: if sellcheck1 < selloffers1 and buycheck1 < buyoffers1: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype1price = bidvaluetest group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 2 elif bidvaluetest < askvaluetest: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype1price = step2value group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 3 else: bidslots = bidslots + 1 sellcheck1 = sellcheck1 + 1 buycheck1 = buycheck1 + 1 elif sellcheck1 < selloffers1 and buycheck1 == buyoffers1: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype1price = bidvaluetest group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 4 elif bidvaluetest > askvaluetest: nextaskvalue = asksinorder[bidslots+1] if nextaskvalue == askvaluetest: roundtype1price = askvaluetest elif nextaskvalue > bidvaluetest: roundtype1price = (bidvaluetest + askvaluetest)/2 else: roundtype1price = nextaskvalue group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 5 else: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype1price = step2value group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 6 elif sellcheck1 == selloffers1 and buycheck1 < buyoffers1: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype1price = bidvaluetest group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 7 elif bidvaluetest > askvaluetest: nextbidvalue = bidsinorder[bidslots+1] if nextbidvalue == bidvaluetest: roundtype1price = bidvaluetest elif nextbidvalue < askvaluetest: roundtype1price = (bidvaluetest + askvaluetest)/2 else: roundtype1price = nextbidvalue group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 5 else: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype1price = step2value group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 9 else: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype1price = bidvaluetest group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 11 elif bidvaluetest < askvaluetest: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype1price = step2value group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 12 else: roundtype1price = (bidsinorder[bidslots] + asksinorder[bidslots])/2 group.pricetype1 = roundtype1price group.price1display = str(roundtype1price) counter = 13 elif buyoffers1 > 0 and selloffers1 > 0 and highestbid == lowestask: roundtype1price = highestbid group.pricetype1 = highestbid group.price1display = str(roundtype1price) print('counter is', counter) print('roundtype1price is ', roundtype1price) amountboughttype1 = 0 amountsoldtype1 = 0 if buyoffers1 > 0 and selloffers1 > 0 and highestbid >= lowestask: for p in players: if p.buy_amount_type1 >= roundtype1price and p.number_Type1 > 0: p.owned_type1 = p.owned_type1 + p.number_Type1 p.change_Type1 = p.number_Type1 if p.change_Type1 > 0: p.asset1change = "bought" p.displaychange1 = str(p.change_Type1) amountboughttype1 = amountboughttype1 + p.number_Type1 if buyoffers1 > 0 and selloffers1 > 0 and highestbid >= lowestask: for p in players: if p.sell_amount_type1 <= roundtype1price and p.number_sell_Type1 > 0: p.owned_type1 = p.owned_type1 - p.number_sell_Type1 p.change_Type1 = -p.number_sell_Type1 if p.change_Type1 < 0: p.asset1change = "sold" p.displaychange1 = str(p.number_sell_Type1) amountsoldtype1 = amountsoldtype1 + p.number_sell_Type1 if buyoffers1 > 0 and selloffers1 > 0 and highestbid < lowestask: roundtype1price = (highestbid + lowestask)/2 group.pricetype1 = roundtype1price print('amountboughttype1 is', amountboughttype1) print('amountsoldtype1 is', amountsoldtype1) if amountboughttype1 > amountsoldtype1: players_with_marginal_bid = [ p for p in players if p.buy_amount_type1 == roundtype1price ] while amountboughttype1 > amountsoldtype1: winner = random.choice( players_with_marginal_bid ) # if tie, winner is chosen at random if winner.change_Type1 > 0: winner.owned_type1 = winner.owned_type1 - 1 winner.change_Type1 = winner.change_Type1 - 1 winner.displaychange1 = str(winner.change_Type1) amountboughttype1 = amountboughttype1 - 1 if amountboughttype1 < amountsoldtype1: players_with_marginal_bid = [ p for p in players if p.sell_amount_type1 == roundtype1price ] while amountboughttype1 < amountsoldtype1: winner = random.choice( players_with_marginal_bid ) # if tie, winner is chosen at random if winner.change_Type1 < 0: winner.owned_type1 = winner.owned_type1 + 1 winner.change_Type1 = winner.change_Type1 + 1 if winner.change_Type1 < 0: positivechange = -winner.change_Type1 winner.displaychange1 = str(positivechange) else: winner.displaychange1 = "0" amountsoldtype1 = amountsoldtype1 - 1 for p in players: if amountsoldtype1 > 0 and amountboughttype1 > 0: p.asset1roundprice = str(roundtype1price) else: p.asset1roundprice = "None" if buyoffers1 == 0 and selloffers1 == 0: group.price1display = "None: no bids or offers" elif buyoffers1 == 0 and selloffers1 > 0: group.price1display = "None: no bids" elif buyoffers1 > 0 and selloffers1 == 0: group.price1display = "None: no offers" else: group.price1display = "None: highest bid = " + str(highestbid) + " and lowest offer = " +str(lowestask) p.auction_spending1 = roundtype1price*-p.change_Type1 p.available_funds = p.available_funds + p.auction_spending1 def set_winner_Type2(group): import random players = group.get_players() playerbidnumber = max([p.id_in_group for p in players]) allbids = [] allasks = [] for p in players: p.change_Type2 = 0 if group.round_number == 1: p.won_type2 = p.owned_type2 firstcount = 0 secondcount = 0 buyoffers2 = 0 selloffers2 = 0 while firstcount < playerbidnumber: freshplayer = firstcount + 1 currentbuyer = group.get_player_by_id(freshplayer) numberofbids = 0 personbidnumber = currentbuyer.number_Type2 while numberofbids < personbidnumber: allbids.append(currentbuyer.buy_amount_type2) numberofbids = numberofbids + 1 buyoffers2 = buyoffers2 + 1 firstcount = firstcount + 1 bidsinorder = sorted(allbids, reverse=True) while secondcount < playerbidnumber: newestplayer = secondcount + 1 currentseller = group.get_player_by_id(newestplayer) numberofasks = 0 personasknumber = currentseller.number_sell_Type2 while numberofasks < personasknumber: allasks.append(currentseller.sell_amount_type2) numberofasks = numberofasks + 1 selloffers2 = selloffers2 + 1 secondcount = secondcount + 1 asksinorder = sorted(allasks, reverse=False) highestbid = 0 lowestask = 30 if buyoffers2 > 0: highestbid = bidsinorder[0] if selloffers2 > 0: lowestask = asksinorder[0] counter = 0 bidslots = 0 roundtype2price = 0 sellcheck2 = 1 buycheck2 = 1 if buyoffers2 > 0 and selloffers2 > 0 and highestbid > lowestask: while counter < 1: if sellcheck2 < selloffers2 and buycheck2 < buyoffers2: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype2price = bidvaluetest group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 2 elif bidvaluetest < askvaluetest: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype2price = step2value group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 3 else: bidslots = bidslots + 1 sellcheck2 = sellcheck2 + 1 buycheck2 = buycheck2 + 1 elif sellcheck2 < selloffers2 and buycheck2 == buyoffers2: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype2price = bidvaluetest group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 4 elif bidvaluetest > askvaluetest: nextaskvalue = asksinorder[bidslots+1] if nextaskvalue == askvaluetest: roundtype2price = askvaluetest elif nextaskvalue > bidvaluetest: roundtype2price = (bidvaluetest + askvaluetest)/2 else: roundtype2price = nextaskvalue group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 5 else: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype2price = step2value group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 6 elif sellcheck2 == selloffers2 and buycheck2 < buyoffers2: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype2price = bidvaluetest group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 7 elif bidvaluetest > askvaluetest: nextbidvalue = bidsinorder[bidslots+1] if nextbidvalue == bidvaluetest: roundtype2price = bidvaluetest elif nextbidvalue < askvaluetest: roundtype2price = (bidvaluetest + askvaluetest)/2 else: roundtype2price = nextbidvalue group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 5 else: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype2price = step2value group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 9 else: bidvaluetest = bidsinorder[bidslots] askvaluetest = asksinorder[bidslots] if bidvaluetest == askvaluetest: roundtype2price = bidvaluetest group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 11 elif bidvaluetest < askvaluetest: middlevalue = (bidsinorder[bidslots-1] + asksinorder[bidslots-1])/2 step1value = max(middlevalue, bidvaluetest) step2value = min(step1value, askvaluetest) roundtype2price = step2value group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 12 else: roundtype2price = (bidsinorder[bidslots] + asksinorder[bidslots])/2 group.pricetype2 = roundtype2price group.price2display = str(roundtype2price) counter = 13 elif buyoffers2 > 0 and selloffers2 > 0 and highestbid == lowestask: roundtype2price = highestbid group.pricetype2 = highestbid group.price2display = str(roundtype2price) print('counter is', counter) amountboughttype2 = 0 amountsoldtype2 = 0 if buyoffers2 > 0 and selloffers2 > 0 and highestbid >= lowestask: for p in players: if p.buy_amount_type2 >= roundtype2price and p.number_Type2 > 0: p.owned_type2 = p.owned_type2 + p.number_Type2 p.change_Type2 = p.number_Type2 if p.change_Type2 > 0: p.asset2change = "bought" p.displaychange2 = str(p.change_Type2) amountboughttype2 = amountboughttype2 + p.number_Type2 if buyoffers2 > 0 and selloffers2 > 0 and highestbid >= lowestask: for p in players: if p.sell_amount_type2 <= roundtype2price and p.number_sell_Type2 > 0: p.owned_type2 = p.owned_type2 - p.number_sell_Type2 p.change_Type2 = -p.number_sell_Type2 if p.change_Type2 < 0: p.asset2change = "sold" p.displaychange2 = str(p.number_sell_Type2) amountsoldtype2 = amountsoldtype2 + p.number_sell_Type2 if buyoffers2 > 0 and selloffers2 > 0 and highestbid < lowestask: roundtype2price = (highestbid + lowestask)/2 group.pricetype2 = roundtype2price if amountboughttype2 > amountsoldtype2: players_with_marginal_bid = [ p for p in players if p.buy_amount_type2 == roundtype2price ] while amountboughttype2 > amountsoldtype2: winner = random.choice( players_with_marginal_bid ) # if tie, winner is chosen at random if winner.change_Type2 > 0: winner.owned_type2 = winner.owned_type2 - 1 winner.change_Type2 = winner.change_Type2 - 1 winner.displaychange2 = str(winner.change_Type2) amountboughttype2 = amountboughttype2 - 1 if amountboughttype2 < amountsoldtype2: players_with_marginal_bid = [ p for p in players if p.sell_amount_type2 == roundtype2price ] while amountboughttype2 < amountsoldtype2: winner = random.choice( players_with_marginal_bid ) # if tie, winner is chosen at random if winner.change_Type2 < 0: winner.owned_type2 = winner.owned_type2 + 1 winner.change_Type2 = winner.change_Type2 + 1 if winner.change_Type2 < 0: positivechange = -winner.change_Type2 winner.displaychange2 = str(positivechange) else: winner.displaychange2 = "0" amountsoldtype2 = amountsoldtype2 - 1 for p in players: if amountsoldtype2 > 0 and amountboughttype2 > 0: p.asset2roundprice = str(roundtype2price) else: p.asset2roundprice = "None" if buyoffers2 == 0 and selloffers2 == 0: group.price2display = "None: no bids or offers" elif buyoffers2 == 0 and selloffers2 > 0: group.price2display = "None: no bids" elif buyoffers2 > 0 and selloffers2 == 0: group.price2display = "None: no offers" else: group.price2display = "None: highest bid = " + str(highestbid) + " and lowest offer = " +str(lowestask) p.auction_spending2 = roundtype2price*-p.change_Type2 p.available_funds = p.available_funds + p.auction_spending2 def set_end_data(group): players = group.get_players() for p in players: set_end_player_values(p) def set_start_data(group): players = group.get_players() for p in players: set_initial_player_values(p) def create_outcome(group): import random players = group.get_players() if group.round_number == 1: for p in players: p.purchasehistory = "Original auction price for Asset 1 = " + str(p.asset1initialprice) p.purchasehistory = p.purchasehistory + ". You won " + str(p.won_type1) + " units in the auction" if group.pricetype1 > 0: p.purchasehistory = p.purchasehistory + ". Period 1 price was " + p.asset1roundprice else: p.purchasehistory = p.purchasehistory + ". Period 1 price was None" p.purchasehistory = p.purchasehistory + ". You " + p.asset1change + " " + p.displaychange1 + " in this round." else: for p in players: if group.pricetype1 > 0: p.purchasehistory = p.purchasehistory + " Period " + str(p.round_number) + " price was " + p.asset1roundprice else: p.purchasehistory = p.purchasehistory + " Period " + str(p.round_number) + " price was None" p.purchasehistory = p.purchasehistory + ". You " + p.asset1change + " " + p.displaychange1 + " in this round." if group.round_number == 1: for p in players: p.purchasehistory2 = "Original auction price for Asset 2 = " + str(p.asset2initialprice) p.purchasehistory2 = p.purchasehistory2 + ". You won " + str(p.won_type2) + " units in the auction" if group.pricetype2 > 0: p.purchasehistory2 = p.purchasehistory2 + ". Period 1 price was " + p.asset2roundprice else: p.purchasehistory2 = p.purchasehistory2 + ". Period 1 price was None." p.purchasehistory2 = p.purchasehistory2 + ". You " + p.asset2change + " " + p.displaychange2 + " in this round." else: for p in players: if group.pricetype2 > 0: p.purchasehistory2 = p.purchasehistory2 + " Period " + str(p.round_number) + " price was " + p.asset2roundprice else: p.purchasehistory2 = p.purchasehistory2 + " Period " + str(p.round_number) + " price was None" p.purchasehistory2 = p.purchasehistory2 + ". You " + p.asset2change + " " + p.displaychange2 + " in this round." asset1gen = random.random() asset2gen = random.random() if asset1gen > .5: group.asset1outcome = "Asset 1 earned 25 cents." for p in players: p.asset1earningschange = .25*p.owned_type1 p.bankedaccount = p.bankedaccount + .25*p.owned_type1 else: group.asset1outcome = "Asset 1 lost 25 cents." for p in players: p.asset1earningschange = -.25*p.owned_type1 p.bankedaccount = p.bankedaccount - .25*p.owned_type1 if asset2gen < .1: group.asset2outcome = "Asset 2 earned 90 cents." for p in players: p.asset2earningschange = .9*p.owned_type2 p.bankedaccount = p.bankedaccount + .9*p.owned_type2 else: group.asset2outcome = "Asset 2 lost 10 cents." for p in players: p.asset2earningschange = -.1*p.owned_type2 p.bankedaccount = p.bankedaccount - .1*p.owned_type2 def set_final_data(group): players = group.get_players() for p in players: set_final_round3data(p) class Group(BaseGroup): pricetype1 = models.CurrencyField(doc='Common value of the item to be auctioned random for treatment', initial=0) pricetype2 = models.CurrencyField(initial=0) u = models.IntegerField() price1display = models.StringField(initial='None') price2display = models.StringField(initial='None') asset1outcome = models.StringField() asset2outcome = models.StringField() set_winner_Type1 = set_winner_Type1 set_winner_Type2 = set_winner_Type2 set_end_data = set_end_data set_start_data = set_start_data create_outcome = create_outcome set_final_data = set_final_data def set_initial_player_values(player): participant = player.participant player.owned_type1 = participant.vars['type1'] player.owned_type2 = participant.vars['type2'] player.available_funds = participant.vars['funds'] player.bankedaccount = participant.vars['bankedaccount'] player.asset1value = participant.vars['asset1value'] player.asset2value = participant.vars['asset2value'] player.asset1initialprice = participant.vars['asset1auctionprice'] player.asset2initialprice = participant.vars['asset2auctionprice'] player.purchasehistory = participant.vars['purchasehistory'] player.purchasehistory2 = participant.vars['purchasehistory2'] def set_end_player_values(player): participant = player.participant participant.vars['type1'] = player.owned_type1 participant.vars['type2'] = player.owned_type2 participant.vars['funds'] = player.available_funds participant.vars['bankedaccount'] = player.bankedaccount participant.vars['asset1value'] = player.asset1value participant.vars['asset2value'] = player.asset2value participant.vars['asset1auctionprice'] = player.asset1initialprice participant.vars['asset2auctionprice'] = player.asset2initialprice participant.vars['purchasehistory'] = player.purchasehistory participant.vars['purchasehistory2'] = player.purchasehistory2 def set_final_round3data(player): participant = player.participant player.round3earnings = player.bankedaccount + player.available_funds + player.owned_type2*player.asset2value + player.owned_type1*player.asset1value participant.vars['round3earnings'] = player.round3earnings class Player(BasePlayer): buy_amount_type1 = models.CurrencyField(doc='Amount bidded by the player', label="Price you're willing to pay for Type 1 Assets", min=0) number_Type1 = models.IntegerField(label='Number of Type 1 Assets to purchase at your specified price', min=0) sell_amount_type1 = models.CurrencyField(label="Price you're willing to sell Type 1 Assets for", min=0) number_sell_Type1 = models.IntegerField(label='Number of Type 1 units to sell at your specified sale price', min=0) buy_amount_type2 = models.CurrencyField(label="Price you're willing to pay for Type 2 Assets", min=0) number_Type2 = models.IntegerField(label='Number of Type 2 Assets to purchase at your specified price', min=0) initial_spending = models.CurrencyField() owned_type1 = models.IntegerField(initial=0) owned_type2 = models.IntegerField(initial=0) auction_spending1 = models.CurrencyField() auction_spending2 = models.CurrencyField() available_funds = models.CurrencyField(initial=12.5) sell_amount_type2 = models.CurrencyField(label="Price you're willing to sell Type 2 assets for", min=0) number_sell_Type2 = models.IntegerField(label='Number of Type 2 assets to sell at your specified sale price', min=0) change_Type1 = models.IntegerField(initial=0) change_Type2 = models.IntegerField(initial=0) asset1value = models.CurrencyField() asset2value = models.CurrencyField() bankedaccount = models.CurrencyField() purchasehistory = models.LongStringField() asset1initialprice = models.CurrencyField() asset2initialprice = models.CurrencyField() asset1roundprice = models.StringField(initial='None') asset2roundprice = models.StringField(initial='None') asset1change = models.StringField(initial='traded') asset2change = models.StringField(initial='traded') displaychange1 = models.StringField(initial='0') displaychange2 = models.StringField(initial='0') purchasehistory2 = models.LongStringField() won_type1 = models.IntegerField(initial=0) won_type2 = models.IntegerField(initial=0) round3earnings = models.CurrencyField() asset1earningschange = models.CurrencyField(initial=0) asset2earningschange = models.CurrencyField(initial=0) set_initial_player_values = set_initial_player_values set_end_player_values = set_end_player_values set_final_round3data = set_final_round3data