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_onepage' players_per_group = None num_rounds = 18 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,seed+17] # 设置每一轮的随机种子 randomBottom = 0.01 # 股票随机波动不能小于此值 ,如果为 None 不设置下限 trail_template = 'AppFlakyFish_onepage/intro_trail.html' forecast_template = 'AppFlakyFish_onepage/intro_forecast.html' sellonly_template = 'AppFlakyFish_onepage/intro_sell.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): 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(Constants.randomSeed[roundNow-1]) 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.45: 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.65: return 'up' else: return 'down' elif stock_name == 'stock_5_price': random_number = rng.random() if random_number <= 0.35: return 'up' else: return 'down' elif stock_name == 'stock_6_price': random_number = rng.random() if random_number <= 0.50: return 'up' else: return 'down' else: import os print('无此股票') os.exit(0) def change_amount(regular='regular_2'): # 根据规则判定涨跌数量 def regular_1(): # 生成0-5的随机浮点数 amount = rng.random()*0.5 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 = rng.randint(70, 120)#随机整数在100-150间 stock_2_price = rng.randint(70, 120) stock_3_price = rng.randint(70, 120) stock_4_price = rng.randint(70, 120) stock_5_price = rng.randint(70, 120) stock_6_price = rng.randint(70, 120) # stock_1_price = round(rng.random()*50+100, 2) #随机在1-3间 # stock_2_price = round(rng.random()*50+100, 2) # stock_3_price = round(rng.random()*50+100, 2) # stock_4_price = round(rng.random()*50+100, 2) # stock_5_price = round(rng.random()*50+100, 2) # stock_6_price = round(rng.random()*50+100, 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