def save(self, force_insert=False, force_update=False, using=None, update_fields=None): self.sim_round = current_sim_day(self.simulation_id)['sim_round'] self.sim_day = current_sim_day(self.simulation_id)['sim_day'] models.Model.save(self, force_insert, force_update, using, update_fields)
def save(self, force_insert=False, force_update=False, using=None, update_fields=None): self.sim_round = current_sim_day(self.stock.simulation_id)['sim_round'] self.sim_day = current_sim_day(self.stock.simulation_id)['sim_day'] if self.pk is None: self.state = self.SUBMITTED if self.state == self.SUBMITTED: models.Model.save(self, force_insert, force_update, using, update_fields) check_matching_orders.apply_async([self.id]) else: models.Model.save(self, force_insert, force_update, using, update_fields)
def update_mssql_time(simulation_id): current = current_sim_day(simulation_id) conn = pymssql.connect(settings.MSSQL_HOST, settings.MSSQL_USER, settings.MSSQL_PASSWORD, settings.MSSQL_DATABASE) cursor = conn.cursor() cursor.execute("UPDATE MARMIX_SIMULATION SET CURRENT_DAY=%d, CURRENT_ROUND=%d WHERE SIMULATIONID=%d", (current['sim_day'], current['sim_round'], simulation_id)) conn.commit() conn.close()
def get_financials(self, obj): clock = current_sim_day(obj.ticker.simulation_id) current_financials = CompanyFinancial.objects.filter( company=obj).filter(sim_date__lte=clock['sim_round'] * 100 + clock['sim_day']).filter( sim_round__gt=0).filter(sim_day__gt=0) serializer = NestedFinancialsSerializer(current_financials, many=True) return serializer.data
def next_tick(simulation_id): simulation = Simulation.objects.select_related('ticker').get(pk=simulation_id) last_clock = current_sim_day(simulation_id) clock = True # We have two sorts of clocks: internal or external if simulation.simulation_type == Simulation.LIVE: # The clock is external current_round, current_day = clock_erpsim(simulation_id) if not current_round or not current_day: clock = False else: # The clock is internal if last_clock['timestamp'] < timezone.now()-datetime.timedelta(seconds=simulation.ticker.day_duration): current_round = last_clock['sim_round'] current_day = last_clock['sim_day']+1 else: current_round = last_clock['sim_round'] current_day = last_clock['sim_day'] if clock: if last_clock['sim_round'] != 0: # We push the clock if last_clock['sim_day'] != current_day: cleanup_open_orders.apply_async(args=[simulation_id, last_clock['sim_round'], last_clock['sim_day']]) if last_clock['sim_day'] == simulation.ticker.nb_days: if last_clock['sim_round'] == simulation.ticker.nb_rounds: simulation.state = Simulation.FINISHED if simulation.simulation_type == Simulation.INTRO or simulation.simulation_type == Simulation.ADVANCED: prepare_dividends_payments.apply_async([simulation.id, current_round]) sim_day = SimDay(simulation=simulation, sim_round=last_clock['sim_round'], sim_day=last_clock['sim_day'], state=Simulation.FINISHED) sim_day.save() else: simulation.state = Simulation.PAUSED if simulation.simulation_type == Simulation.INTRO or simulation.simulation_type == Simulation.ADVANCED: prepare_dividends_payments.apply_async([simulation.id, current_round]) sim_day = SimDay(simulation=simulation, sim_round=last_clock['sim_round']+1, sim_day=0, state=simulation.state) sim_day.save() simulation.save() else: sim_day = SimDay(simulation=simulation, sim_round=current_round, sim_day=current_day, state=simulation.state) sim_day.save() stocks = Stock.objects.all().filter(simulation_id=simulation.id) for stock in stocks: liquidity_trader_order.apply_async(args=[simulation.id, stock.id]) market_maker.apply_async(args=[simulation.id]) if simulation.simulation_type == Simulation.INDEXED: update_mssql_time(simulation.id) print("Next tick processed: SIM: %s - R%sD%s @ %s" % (sim_day.simulation_id, sim_day.sim_round, sim_day.sim_day, sim_day.timestamp)) else: # First start of the simulation sim_day = SimDay(simulation=simulation, sim_round=1, sim_day=1, state=simulation.state) sim_day.save() stocks = Stock.objects.all().filter(simulation_id=simulation.id) for stock in stocks: liquidity_trader_order.apply_async(args=[simulation.id, stock.id])
def get(self, request, *args, **kwargs): team = self.request.user.get_team orders = Order.objects.all().filter( stock__simulation_id=team.current_simulation_id).filter( team=team).select_related('stock', 'transaction') clock = current_sim_day(team.current_simulation_id) return render(request, 'stocks/transactionline_list.html', { 'orders': orders, 'team': team, 'clock': clock })
def get(self, request, *args, **kwargs): team = self.request.user.get_team tl = TransactionLine.objects.select_related( 'stock', 'transaction').filter( transaction__simulation_id=team.current_simulation_id).filter( team_id=team.id).filter( asset_type=TransactionLine.DIVIDENDS).order_by( '-transaction__sim_round', 'stock__symbol') clock = current_sim_day(team.current_simulation_id) return render(request, 'stocks/dividends_list.html', { 'transactions': tl, 'clock': clock })
def get_shares(self, obj): clock = current_sim_day(obj.ticker.simulation_id) #print("Clock %s" % clock) if clock['sim_round'] == 0: round = 1 #elif clock['sim_state'] == Simulation.FINISHED: # print("We are in finished state!") # round = clock['sim_round'] + 1 else: round = clock['sim_round'] current_shares = CompanyShare.objects.filter(company=obj).filter(sim_round__lt=round).filter(sim_round__gt=0) serializer = NestedSharesSerializer(current_shares, many=True) return serializer.data
def get_shares(self, obj): clock = current_sim_day(obj.ticker.simulation_id) #print("Clock %s" % clock) if clock['sim_round'] == 0: round = 1 #elif clock['sim_state'] == Simulation.FINISHED: # print("We are in finished state!") # round = clock['sim_round'] + 1 else: round = clock['sim_round'] current_shares = CompanyShare.objects.filter(company=obj).filter( sim_round__lt=round).filter(sim_round__gt=0) serializer = NestedSharesSerializer(current_shares, many=True) return serializer.data
def get_financials(self, obj): clock = current_sim_day(obj.ticker.simulation_id) current_financials = CompanyFinancial.objects.filter(company=obj).filter(sim_date__lte=clock['sim_round']*100+clock['sim_day']).filter(sim_round__gt=0).filter(sim_day__gt=0) serializer = NestedFinancialsSerializer(current_financials, many=True) return serializer.data
def get(self, request, *args, **kwargs): team = self.request.user.get_team orders = Order.objects.all().filter(stock__simulation_id=team.current_simulation_id).filter(team=team).select_related('stock', 'transaction') clock = current_sim_day(team.current_simulation_id) return render(request, 'stocks/transactionline_list.html', {'orders': orders, 'team': team, 'clock': clock})
def get(self, request, *args, **kwargs): team = self.request.user.get_team tl = TransactionLine.objects.select_related('stock', 'transaction').filter(transaction__simulation_id=team.current_simulation_id).filter( team_id=team.id).filter(asset_type=TransactionLine.DIVIDENDS).order_by('-transaction__sim_round', 'stock__symbol') clock = current_sim_day(team.current_simulation_id) return render(request, 'stocks/dividends_list.html', {'transactions': tl, 'clock': clock})