public static double[] optimizeTriggers(final TimeSeries series, final String symbol, final int days,
double commissions, final double slippage, final int initialBalance, final double allocation,
final double minBuy, final double minSell, final double minStop, final double maxBuy,
final double maxSell, final double maxStop, final int generations) throws Exception {
final Asset asset = new Asset(symbol, series);
final Conditions conditions = new Conditions(new BigDecimal(commissions), new BigDecimal(slippage));
final MoneyManagementStrategy moneyManager = new FixedPercentageAllocationStrategy(allocation, asset);
FitnessFunction fitness = new FitnessFunction() {
public double evaluate(double[] x) {
double buyTrigger = x[0];
double sellTrigger = x[1];
double stopLoss = x[2];
try {
Account account = new Account(new BigDecimal(initialBalance), DateTime.now().minusDays(days));
BuyZoneModel model = new BuyZoneModel(account, asset, conditions, moneyManager, buyTrigger, sellTrigger, stopLoss);
Session tradingSession = model.generateSignals(asset.getTimeSeries().beginningOfSeries(),
asset.getTimeSeries().lastOfSeries());
//return -tradingSession.grossProfit().doubleValue();
return -tradingSession.sharpeRatio();
} catch (Exception ex) {
ex.printStackTrace();