from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): #个人随机版本 name_in_url = 'AppFlakyFish_timeout_noseed' players_per_group = None num_rounds = 17 # import datetime as dt # hour = dt.datetime.now().strftime('%H') # minute = dt.datetime.now().strftime('%M') # second = dt.datetime.now().strftime('%S') # seed = float(hour)+float(minute)+float(second) # randomSeed = [1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.8,10.8,118,1234,133,143,153,163,173] # 设置每一轮的随机种子 # randomSeed = [seed,seed+1,seed+2,seed+3,seed+4,seed+5,seed+6,seed+7,seed+8,seed+9,seed+10,seed+11,seed+12,seed+13,seed+14,seed+15,seed+16] # 设置每一轮的随机种子 randomBottom = 10 # 股票随机波动不能小于此值 ,如果为 None 不设置下限 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass # stock_1_price = models.FloatField(min=0) # stock_2_price = models.FloatField(min=0) # stock_3_price = models.FloatField(min=0) # stock_4_price = models.FloatField(min=0) # stock_5_price = models.FloatField(min=0) # stock_6_price = models.FloatField(min=0) # # def update_stock_price(self): # import random # # roundNow = self.round_number # rng = random.Random() # # def generate_random(stock_name): # # 根据规则生成每轮的随机变化量 # # input :{ stock_name:string变量,指定股票的名称如'stock_1'} # # output:{ generated_amount:c变量,股票变更的值} # def is_up_or_down(stock_name): # # 根据规则判定涨或跌 # # input :{ stock_name:string变量,指定股票的名称如'stock_1'} # # output:{ up_or_down:string变量,股票变更的方向,如'up'} # if stock_name == 'stock_1_price': # random_number = rng.random() # if random_number <= 0.65: # return 'up' # else: # return 'down' # # elif stock_name == 'stock_2_price': # random_number = rng.random() # if random_number <= 0.55: # return 'up' # else: # return 'down' # # elif stock_name == 'stock_3_price': # random_number = rng.random() # if random_number <= 0.50: # return 'up' # else: # return 'down' # # elif stock_name == 'stock_4_price': # random_number = rng.random() # if random_number <= 0.50: # return 'up' # else: # return 'down' # # elif stock_name == 'stock_5_price': # random_number = rng.random() # if random_number <= 0.45: # return 'up' # else: # return 'down' # # elif stock_name == 'stock_6_price': # random_number = rng.random() # if random_number <= 0.35: # return 'up' # else: # return 'down' # # else: # import os # print('无此股票') # os.exit(0) # # def change_amount(regular='regular_1'): # # 根据规则判定涨跌数量 # def regular_1(): # # 生成0-5的随机浮点数 # amount = rng.random()*5.0 # amount = round(amount, 2) # return amount # # def regular_2(): # # 生成1,3,5的随机整数 # values = [1.0, 3.0, 5.0] # amount = rng.choice(values) # return amount # # if regular == 'regular_1': # return regular_1() # else: # return regular_2() # # direction = is_up_or_down(stock_name) # amount = change_amount() # if direction == 'up': # return amount # else: # return -amount # # if self.round_number == 1: # ## 设置股票初始价格 # stock_1_price = round(rng.random()*30+20, 2) #随机在20-50间 # stock_2_price = round(rng.random()*30+20, 2) # stock_3_price = round(rng.random()*30+20, 2) # stock_4_price = round(rng.random()*30+20, 2) # stock_5_price = round(rng.random()*30+20, 2) # stock_6_price = round(rng.random()*30+20, 2) # else: # stock_1_price = self.in_round(self.round_number - 1).stock_1_price # newPrice = stock_1_price + generate_random(stock_name='stock_1_price') # if Constants.randomBottom is not None: # if newPrice 5: self.stock_1_amount = self.in_round(self.round_number - 1).stock_1_amount def update_stock_2_amount(self): if self.round_number == 5 and self.stock_2_amount is None: self.stock_2_amount = 0 elif self.round_number > 5: self.stock_2_amount = self.in_round(self.round_number - 1).stock_2_amount def update_stock_3_amount(self): if self.round_number == 5 and self.stock_3_amount is None: self.stock_3_amount = 0 elif self.round_number > 5: self.stock_3_amount = self.in_round(self.round_number - 1).stock_3_amount def update_stock_4_amount(self): if self.round_number == 5 and self.stock_4_amount is None: self.stock_4_amount = 0 elif self.round_number > 5: self.stock_4_amount = self.in_round(self.round_number - 1).stock_4_amount def update_stock_5_amount(self): if self.round_number == 5 and self.stock_5_amount is None: self.stock_5_amount = 0 elif self.round_number > 5: self.stock_5_amount = self.in_round(self.round_number - 1).stock_5_amount def update_stock_6_amount(self): if self.round_number == 5 and self.stock_6_amount is None: self.stock_6_amount = 0 elif self.round_number > 5: self.stock_6_amount = self.in_round(self.round_number - 1).stock_6_amount def update_money(self): if self.round_number == 1: money = 1000000.0 else: money = self.in_round(self.round_number - 1).money self.money = money def force_waitpage_timeout_seconds(self): # 计算北京时间 from datetime import datetime from datetime import timedelta from datetime import timezone SHA_TZ = timezone( timedelta(hours=8), name='Asia/Shanghai', ) utc_now = datetime.utcnow().replace(tzinfo=timezone.utc) beijing_now = utc_now.astimezone(SHA_TZ) # 把当前北京时间距离第二天9点的间隔转换成秒 beijing_now_hour=beijing_now.strftime('%H') beijing_now_minute=beijing_now.strftime('%M') beijing_now_second=beijing_now.strftime('%S') timeout_seconds=(23-float(beijing_now_hour)+9)*3600+(60-float(beijing_now_minute))*60+(60-float(beijing_now_second))*1 return timeout_seconds