from random import randint import numpy as np from otree.api import * c = Currency doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'practice' players_per_group = None num_rounds = 5 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): player_id = models.StringField() invest_amount = models.FloatField() asset_change = models.FloatField() invest_return = models.FloatField() endow = models.FloatField() new_endow = models.FloatField() state = models.IntegerField() c_return = models.FloatField() pos = models.BooleanField() r1 = models.FloatField() r2 = models.FloatField() r3 = models.FloatField() r4 = models.FloatField() r5 = models.FloatField() e1 = models.FloatField() e2 = models.FloatField() e3 = models.FloatField() e4 = models.FloatField() e5 = models.FloatField() def set_values(player, p=35, mgood=0.10, sgood=0.10, mbad=-0.05, sbad=0.05): subsession = player.subsession rng = randint(1, 100) # Set Endowment if player.round_number == 1: endow = 500 else: prev_play = player.in_round(player.round_number - 1) endow = prev_play.new_endow player.endow = endow # Set State if player.round_number == 1: if rng >= 51: state = 1 else: state = 0 else: prev_play = player.in_round(player.round_number - 1) if rng >= p: state = prev_play.state else: if prev_play.state == 1: state = 0 else: state = 1 player.state = state # Set Asset Shift state = player.state if state == 1: asset = round(float(np.random.normal(mgood, sgood, 1)), 4) else: asset = round(float(np.random.normal(mbad, sbad, 1)), 4) player.asset_change = round(asset * 100, 3) if asset < 0: player.pos = False else: player.pos = True if subsession.round_number == 1: participant = player.participant participant.r1 = round(100 * asset, 3) + 100 player.r1 = participant.r1 elif subsession.round_number == 2: participant = player.participant participant.r2 = round(participant.r1 * asset, 3) + participant.r1 player.r1 = participant.r1 player.r2 = participant.r2 elif subsession.round_number == 3: participant = player.participant participant.r3 = round(participant.r2 * asset, 3) + participant.r2 player.r1 = participant.r1 player.r2 = participant.r2 player.r3 = participant.r3 elif subsession.round_number == 4: participant = player.participant participant.r4 = round(participant.r3 * asset, 3) + participant.r3 player.r1 = participant.r1 player.r2 = participant.r2 player.r3 = participant.r3 player.r4 = participant.r4 elif subsession.round_number == 5: participant = player.participant participant.r5 = round(participant.r4 * asset, 3) + participant.r4 player.r1 = participant.r1 player.r2 = participant.r2 player.r3 = participant.r3 player.r4 = participant.r4 player.r5 = participant.r5 # PAGES class Introduction(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Invest(Page): form_model = 'player' form_fields = ['invest_amount'] def vars_for_template(player: Player): set_values(player) class Results(Page): def vars_for_template(player: Player): player.invest_return = round((player.endow * (player.invest_amount / 100)) * (player.asset_change / 100), 2) en = round(player.endow + player.invest_return, 2) player.new_endow = en player.c_return = round(player.new_endow - 500, 2) subsession = player.subsession if subsession.round_number == 1: participant = player.participant participant.e1 = en player.e1 = participant.e1 elif subsession.round_number == 2: participant = player.participant participant.e2 = en player.e1 = participant.e1 player.e2 = participant.e2 elif subsession.round_number == 3: participant = player.participant participant.e3 = en player.e1 = participant.e1 player.e2 = participant.e2 player.e3 = participant.e3 elif subsession.round_number == 4: participant = player.participant participant.e4 = en player.e1 = participant.e1 player.e2 = participant.e2 player.e3 = participant.e3 player.e4 = participant.e4 elif subsession.round_number == 5: participant = player.participant participant.e5 = en player.e1 = participant.e1 player.e2 = participant.e2 player.e3 = participant.e3 player.e4 = participant.e4 player.e5 = participant.e5 class Final(Page): def is_displayed(player: Player): return player.round_number == 5 page_sequence = [ Introduction, Invest, Results, Final ]