''' ''' from data import series from execution.executor import Executor import random from math import inf import numpy class Solver(): ''' ''' def __init__(self, series): ''' Constructor ''' self.series = series self.executor = Executor(series) self.generators = [] def add_generator(self, generator): self.generators.append(generator) def solve(self): max_signals = 3 max_strategies = 1000 self.results = [] for x in range(0, max_strategies): sig_num = random.randint(1, max_signals) strategy = [] for i in range(0, sig_num): strategy.append(random.choice(self.generators).generate()) trades = self.executor.execute(strategy) result = self.evaluate_trades(trades) result['display_name'] = ' && '.join([signal.get_text() for signal in strategy]) self.results.append(result) return self.results def evaluate_trades(self, trades): result = {} profits = [x.pnl() for x in trades] result['trades_number'] = len(trades) result['total_pnl'] = sum(profits) if len(trades) > 0: result['avg_percentage'] = sum([trade.pnl_percentage() for trade in trades]) / len(trades) else: result['avg_percentage'] = 0 gross_profit = sum([max(0, x.pnl()) for x in trades]) gross_loss = sum([min(0, x.pnl()) for x in trades]) if gross_loss != 0: result['profit_factor'] = gross_profit / (-gross_loss) else: result['profit_factor'] = inf if len(profits) > 0: mean = numpy.mean(profits) stddev = numpy.std(profits) if stddev != 0: result['sharpe'] = mean / stddev else: result['sharpe'] = 0 else: result['sharpe'] = 0 return result