from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Claudia Marangon' doc = """ Stock Experiment """ class Constants(BaseConstants): name_in_url = 'demo' players_per_group = None num_rounds = 3 end = 350 mid_r=[2,3,5,6,8,9,11,12,14,15,17,18,20,21] last_r=[4,7,10,13,16,19] blocked_r=[11,12,13,15,16,17,19,20,21] instr_temp = 'phase_1/Instructions.html' class Subsession(BaseSubsession): price_a = models.CurrencyField() price_b = models.CurrencyField() price_c = models.CurrencyField() state = models.StringField( choices=['Good', 'Bad'] ) stock_update = models.StringField( choices=['a', 'b', 'c'], initial='a' ) stock_action = models.StringField( choices=['a', 'b', 'c'], initial='a' ) def creating_session(self): if self.round_number==1: n = random.randint(1, 2) self.price_a = 100 self.price_b = 100 self.price_c = 100 if n == 1: #do they have to know whether they are in a good or a bad state or whether price up or down? self.state='Good' else: self.state='Bad' for p in self.get_players(): if self.round_number==1: p.cash=Constants.end p.price_bought_a=self.price_a p.price_bought_b = self.price_b p.price_bought_c = self.price_c else: prob1 = random.randint(1, 10) prob2 = random.randint(1, 10) if self.in_round(self.round_number-1).state=='Good': if prob1<9: self.state='Good' else: self.state='Bad' else: if prob1>=9: self.state = 'Good' else: self.state = 'Bad' if self.state=='Good': if prob2>7: delta_p = random.choice([5, 10, 15]) else: delta_p = -random.choice([5, 10, 15]) else: if prob2>7: delta_p = -random.choice([5, 10, 15]) else: delta_p = random.choice([5, 10, 15]) price_update = random.randint(1, 3) if price_update==1: self.stock_update='a' self.price_a = self.in_round(self.round_number-1).price_a+delta_p self.price_b = self.in_round(self.round_number-1).price_b self.price_c = self.in_round(self.round_number - 1).price_c self.stock_action = 'a' elif price_update==2: self.stock_update='b' self.price_b = self.in_round(self.round_number-1).price_b+delta_p self.price_a = self.in_round(self.round_number - 1).price_a self.price_c = self.in_round(self.round_number - 1).price_c self.stock_action = 'b' else: self.stock_update='c' self.price_c = self.in_round(self.round_number-1).price_c+delta_p self.price_b = self.in_round(self.round_number - 1).price_b self.price_a = self.in_round(self.round_number - 1).price_a self.stock_action = 'c' pass class Group(BaseGroup): pass class Player(BasePlayer): codice_lab = models.IntegerField( label="Inserisci l'ID di 2 cifre che ti รจ stato assegnato in laboratorio:" ) stock_a_buy = models.StringField( choices=["Compra", "Non Comprare"], blank=True, widget= widgets.RadioSelect, label= "Stock A" ) stock_b_buy = models.StringField( choices=["Compra", "Non Comprare"], blank=True, widget=widgets.RadioSelect, label="Stock B" ) stock_c_buy = models.StringField( choices=["Compra", "Non Comprare"], blank=True, widget=widgets.RadioSelect, label="Stock C" ) stock_a_sell = models.StringField( choices=["Vendi", "Non Vendere"], blank=True, widget=widgets.RadioSelect, label="Stock A" ) stock_b_sell = models.StringField( choices=["Vendi", "Non Vendere"], blank=True, widget=widgets.RadioSelect, label="Stock B" ) stock_c_sell = models.StringField( choices=["Vendi", "Non Vendere"], blank=True, widget=widgets.RadioSelect, label="Stock C" ) stock_a = models.IntegerField( choices=[0, 1], ) stock_b = models.IntegerField( choices=[0, 1], ) stock_c = models.IntegerField( choices=[0, 1], ) price_bought_a = models.CurrencyField() price_bought_b = models.CurrencyField() price_bought_c = models.CurrencyField() cash = models.CurrencyField() def prev_round(self): if self.round_number==1: return self.round_number else: m = self.round_number-1 return m def stock_val(self): if self.stock_a_buy=='Compra': self.stock_a=1 cash_a = - self.subsession.price_a self.price_bought_a = self.subsession.price_a elif self.stock_a_sell=='Vendi': self.stock_a = 0 cash_a = self.subsession.price_a self.price_bought_a = 0 else: self.stock_a=self.in_round(self.prev_round()).stock_a cash_a = 0 self.price_bought_a = self.in_round(self.prev_round()).price_bought_a if self.stock_b_buy=='Compra': self.stock_b=1 cash_b = - self.subsession.price_b self.price_bought_b = self.subsession.price_b elif self.stock_b_sell=='Vendi': self.stock_b = 0 cash_b = self.subsession.price_b self.price_bought_b = 0 else: self.stock_b=self.in_round(self.prev_round()).stock_b cash_b = 0 self.price_bought_b = self.in_round(self.prev_round()).price_bought_b if self.stock_c_buy=='Compra': self.stock_c=1 cash_c = - self.subsession.price_c self.price_bought_c = self.subsession.price_c elif self.stock_c_sell=='Vendi': self.stock_c = 0 cash_c = self.subsession.price_c self.price_bought_c = 0 else: self.stock_c=self.in_round(self.prev_round()).stock_c cash_c = 0 self.price_bought_c = self.in_round(self.prev_round()).price_bought_c self.cash = self.in_round(self.prev_round()).cash + cash_a + cash_b + cash_c def buy_in_r1(self): self.stock_a_buy = "Compra" self.stock_b_buy = "Compra" self.stock_c_buy = "Compra" def set_payoff(self): self.payoff = self.cash + self.stock_a * self.subsession.price_a + self.stock_b * self.subsession.price_b + self.stock_c * self.subsession.price_c pass