from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import itertools author = 'eoy' doc = """ Basic stock market simulation """ class Constants(BaseConstants): name_in_url = 'option_game' players_per_group = None num_rounds = 8 endowment = c(100) class Subsession(BaseSubsession): pass def creating_session(self): if self.round_number == 1: treatment = itertools.cycle(['control', 'treatment']) for p in self.get_players(): p.is_treatment = next(treatment) p.rand_num = random.randint(1, 6) else: for p in self.get_players(): p.is_treatment = p.in_round(1).is_treatment p.rand_num = random.randint(1, 6) class Group(BaseGroup): pass class Player(BasePlayer): custom_payoff = models.FloatField(initial=0) keep_portfolio = models.BooleanField(initial=False) is_treatment = models.StringField() earning_A = models.FloatField(initial=0) earning_B = models.FloatField(initial=0) earning_C = models.FloatField(initial=0) rand_num = models.IntegerField(initial=7) option_1 = models.FloatField(label="A Hissesine yüzde kaç yatırırsınız? (Zar 4'ten küçük gelirse A hissesi %20 değerlenir. Aksi halde %20 değer kaybeder.)", initial=0) option_2 = models.FloatField(label="B Hissesine yüzde kaç yatırırsınız? (Zar 4'ten küçük gelirse B hissesi %20 değer kaybeder. Aksi halde %20 değerlenir.)", initial=0) option_3 = models.FloatField(label="Tahvile yüzde kaç yatırırsınız? (Tahvil, zar (2,3,4,5) gelirse %10 değerlenir. Aksi halde %5 değer kaybeder.", initial=0) # perc_option_1 = models.IntegerField(label="A Hissesine yüzde kaç yatırırsınız? (Zar 4'ten küçük gelirse A hissesi %20 değerlenir. Aksi halde %20 değer kaybeder.)", initial=0) # perc_option_2 = models.IntegerField(label="B Hissesine yüzde kaç yatırırsınız? (Zar 4'ten küçük gelirse B hissesi %20 değer kaybeder. Aksi halde %20 değerlenir.)", initial=0) # perc_option_3 = models.IntegerField(label="Tahvile yüzde kaç yatırırsınız? (Tahvil, zar (2,3,4,5) gelirse %10 değerlenir. Aksi halde %5 değer kaybeder.", initial=0) def set_payoffs(self): if not self.keep_portfolio: # updates options for percentage if we dont keep portfolio if self.round_number == 1: budget = 100 else: budget = self.in_round(self.round_number - 1).custom_payoff self.option_1 = self.option_1 * budget/100 self.option_2 = self.option_2 * budget/100 self.option_3 = self.option_3 * budget/100 if self.rand_num <= 3: print("option A won and B loss") self.earning_A = self.option_1 * 1.20 self.earning_B = self.option_2 * 0.80 else: print("option B won and A loss") self.earning_A = self.option_1 * 0.80 self.earning_B = self.option_2 * 1.20 if self.rand_num in [2, 3, 4, 5]: self.earning_C = self.option_3 * 1.05 else: self.earning_C = self.option_3 * 0.90 if self.is_treatment == 'control': self.earning_C = 0 print(f"A:{self.earning_A} - B:{self.earning_B} - C:{self.earning_C}") # self.payoff = self.earning_A + self.earning_B + self.earning_C print(self.custom_payoff) self.custom_payoff = self.earning_A + self.earning_B + self.earning_C print(self.custom_payoff)