@Override public List<TimePointStats> start(UserOutput output) { Thread.currentThread().setName("Main engine execution thread"); double result = 1; initPopulation(); TimePoint timePoint = new TimePoint(engineSettings.startTimePoint); List<TimePointStats> timePointStats = new ArrayList<>(); while (engineSettings.endTimePoint.compareTo(timePoint) >= 0) { TimePointStats stat = executeTimePoint(timePoint); if (stat != null) { timePointStats.add(stat); result *= (stat.getPercentEarned() / 100 + 1); profitRecorder.recordProfit(stat.getPercentEarned()); output.reportProfitForTimePoint(timePoint, (result - 1) * 100, stat.getPercentEarned()); Debug.d("Time:", timePoint, "Percent earned so far:", (result - 1) * 100); } timePoint = timePoint.next(); } if (!engineSettings.executionOnly) { savePopulation(); } Debug.d( "Profit:", profitRecorder.getProfit(), "Drawdown:", profitRecorder.getMaxDrawdown(), "Profit / DD:", profitRecorder.getProfit() / profitRecorder.getMaxDrawdown()); return timePointStats; }
private TimePointStats executeTimePoint(TimePoint timePoint) { List<ProgramData> programDataList = data.prepareProgramDataList(timePoint); if (programDataList.isEmpty()) return null; Debug.d("Starting TimePoint:", timePoint); TimePointResult timePointResult = timePointExecutor.execute( timePoint, programDataList, population, !engineSettings.executionOnly); TimePointStats timePointStats = TimePointStats.getNewStats(timePoint); for (DataSetResult dataSetResult : timePointResult.listDataSetResults()) { Prediction prediction = dataSetResult.getCumulativePrediction(); Debug.d("Prediction for:", dataSetResult.getName(), prediction); Double actualChange = data.getActualChange(dataSetResult.getName(), timePoint); if (!actualChange.isNaN()) { Debug.d("Actual change:", actualChange); printPercentEarned(dataSetResult.getName(), actualChange, prediction); timePointStats.update(dataSetResult.getName(), actualChange, prediction); } } if (!engineSettings.executionOnly) { updatePopulation(); } Debug.d("Finished TimePoint:", timePoint); return timePointStats; }