def get_generator(self): if self.trading_client is not None: return self.trading_client.transform() perf = None if self.perf_tracker is None: tracker = self.perf_tracker = PerformanceTracker( sim_params=self.sim_params, trading_calendar=self.trading_calendar, env=self.trading_environment, ) # Set the dt initially to the period start by forcing it to change. self.on_dt_changed(self.sim_params.start_session) # Unpacking the perf_tracker and positions if available perf = get_algo_object( algo_name=self.algo_namespace, key='cumulative_performance', ) if not self.initialized: self.initialize(*self.initialize_args, **self.initialize_kwargs) self.initialized = True # Call the simulation trading algorithm for side-effects: # it creates the perf tracker # TradingAlgorithm._create_generator(self, self.sim_params) if perf is not None: tracker.cumulative_performance = perf period = self.perf_tracker.todays_performance period.starting_cash = perf.ending_cash period.starting_exposure = perf.ending_exposure period.starting_value = perf.ending_value period.position_tracker = perf.position_tracker self.trading_client = ExchangeAlgorithmExecutor( algo=self, sim_params=self.sim_params, data_portal=self.data_portal, clock=self.clock, benchmark_source=self._create_benchmark_source(), restrictions=self.restrictions, universe_func=self._calculate_universe, ) return self.trading_client.transform()
def _init_trading_client(self): """ This replaces Ziplines `_create_generator` method. The main difference is that we are restoring performance tracker objects if available. This allows us to stop/start algos without loosing their state. """ self.state = get_algo_object( algo_name=self.algo_namespace, key='context.state_{}'.format(self.mode_name), ) if self.state is None: self.state = {} if self.perf_tracker is None: # Note from the Zipline dev: # HACK: When running with the `run` method, we set perf_tracker to # None so that it will be overwritten here. tracker = self.perf_tracker = PerformanceTracker( sim_params=self.sim_params, trading_calendar=self.trading_calendar, env=self.trading_environment, ) # Set the dt initially to the period start by forcing it to change. self.on_dt_changed(self.sim_params.start_session) new_position_tracker = tracker.position_tracker tracker.position_tracker = None # Unpacking the perf_tracker and positions if available cum_perf = get_algo_object( algo_name=self.algo_namespace, key='cumulative_performance_{}'.format(self.mode_name), ) if cum_perf is not None: tracker.cumulative_performance = cum_perf # Ensure single common position tracker tracker.position_tracker = cum_perf.position_tracker today = pd.Timestamp.utcnow().floor('1D') todays_perf = get_algo_object( algo_name=self.algo_namespace, key=today.strftime('%Y-%m-%d'), rel_path='daily_performance_{}'.format(self.mode_name), ) if todays_perf is not None: # Ensure single common position tracker if tracker.position_tracker is not None: todays_perf.position_tracker = tracker.position_tracker else: tracker.position_tracker = todays_perf.position_tracker tracker.todays_performance = todays_perf if tracker.position_tracker is None: # Use a new position_tracker if not is found in the state tracker.position_tracker = new_position_tracker if not self.initialized: # Calls the initialize function of the algorithm self.initialize(*self.initialize_args, **self.initialize_kwargs) self.initialized = True self.trading_client = ExchangeAlgorithmExecutor( algo=self, sim_params=self.sim_params, data_portal=self.data_portal, clock=self.clock, benchmark_source=self._create_benchmark_source(), restrictions=self.restrictions, universe_func=self._calculate_universe, )