package tests; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import objects.League; import objects.SoccerMatch; import objects.TeamSettings; public class AwayTeamWinTest extends TestClass { ArrayList recalcTeamsList = new ArrayList(); private League leagueInfo; private ArrayList matches; private ArrayList trainMatches; @Override public void runTest() { matches = getMatches(); trainMatches = getTrainMatches(); leagueInfo = getLeagueInfoById(); for (final SoccerMatch soccerMatch : matches) { final int homeTeamId = soccerMatch.getHomeTeam().getTeamId(); final int awayTeamId = soccerMatch.getAwayTeam().getTeamId(); TeamSettings awayTeamValues = getTeamValues(awayTeamId); if (awayTeamValues.getLookbackAway() <= 0 || awayTeamValues.getMarginAway() <= 0 ) { awayTeamValues = calculateTeamValues(awayTeamValues, false); } } System.out.println("Done with Away Team TEST"); } private TeamSettings calculateTeamValues(TeamSettings teamSettings, boolean isHomeTeam) { final ArrayList teamMatches; if (isHomeTeam) { teamMatches = (ArrayList) trainMatches.stream().filter(p -> p.getHomeTeam().getTeamId() == teamSettings.getTeamId()).collect(Collectors.toList()); } else { teamMatches = (ArrayList) trainMatches.stream().filter(p -> p.getAwayTeam().getTeamId() == teamSettings.getTeamId()).collect(Collectors.toList()); } float bestBankResult = startingBank; int bestBetMargin = 0; int bestLookBack = 0; final float betLevel = bettingLevel / 100f; float betAmount = startingBank * betLevel; for (int lookback = 4; lookback < 25; lookback++) { for (int margin = 1; margin < 25; margin++) { final float betMarginDecimal = 1 + (margin / 100f); float bank = startingBank; int betOnGameCount = 0; int wins = 0; for (final SoccerMatch soccerMatch : teamMatches) { final List aktuellaMatcher = trainMatches.stream().filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate())).collect(Collectors.toList()); if (soccerMatch.getHomeScore() < 0 || soccerMatch.getAwayScore() < 0) { continue; } // Hemma lagets resultat final List hemmaMatcher = aktuellaMatcher.stream().filter(p -> p.getHomeTeam().getTeamId() == teamSettings.getTeamId()).limit(lookback).collect(Collectors.toList()); final long hemmaForluster = hemmaMatcher.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count(); // borta lagets resultat final List bortaMatcher = aktuellaMatcher.stream().filter(p -> p.getAwayTeam().getTeamId() == soccerMatch.getAwayTeam().getTeamId()).limit(lookback).collect(Collectors.toList()); final long bortaVinster = bortaMatcher.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count(); final float awayWinPercent = (bortaVinster + hemmaForluster) / Float.valueOf(hemmaMatcher.size() + bortaMatcher.size()) * 100; final float awayOdds = 100 / awayWinPercent; betAmount = bank * betLevel; // Spela på borta vinst? if (awayOdds * betMarginDecimal <= soccerMatch.getOdds2()) { betOnGameCount++; bank = bank - betAmount; if (soccerMatch.getAwayScore() > soccerMatch.getHomeScore()) { wins++; bank = bank + betAmount * soccerMatch.getOdds2(); } } if (bank != startingBank && bestBankResult < bank) { bestBetMargin = margin; bestLookBack = lookback; bestBankResult = bank; } else if (bestBankResult != startingBank && bestBankResult == bank) { bestBetMargin = margin; bestLookBack = lookback; bestBankResult = bank; } } } } if (bestLookBack > 0 && teamSettings.getLookbackAway() != bestLookBack) { System.out.println("Setting lookbackAway " + bestLookBack + " and margin " + bestBetMargin + " for team " + teamSettings.getTeamName() + " with a bank of " + bestBankResult); teamSettings.setLookbackAway(bestLookBack); teamSettings.setMarginAway(bestBetMargin); } return teamSettings; } private TeamSettings getTeamValues(int teamId) { final String sql = "SELECT * FROM Team WHERE id = ?"; final TeamSettings ts = new TeamSettings(); try { final PreparedStatement stmt = getConnection().prepareStatement(sql); stmt.setInt(1, teamId); final ResultSet rs = stmt.executeQuery(); while (rs.next()) { ts.setTeamId(teamId); ts.setTeamName(rs.getString("name")); ts.setLookbackHome(rs.getInt("lookbackHome")); ts.setLookbackDraw(rs.getInt("lookbackDraw")); ts.setLookbackAway(rs.getInt("lookbackAway")); ts.setMarginHome(rs.getInt("marginHome")); ts.setMarginDraw(rs.getInt("marginDraw")); ts.setMarginAway(rs.getInt("marginAway")); } } catch (final SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ts; } private ArrayList getMatches() { final ArrayList result = new ArrayList<>(); final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName " + "FROM SoccerResults as res " + "Join Team as hTeam ON res.homeTeam = hTeam.id " + "Join Team as aTeam ON res.awayTeam = aTeam.id " + "WHERE " + "DATE(gameDate) > DATE_SUB(NOW(), INTERVAL 1 YEAR) AND " + "res.leagueId = ? " + "ORDER BY gameDate ASC"; try { final PreparedStatement stmt = getConnection().prepareStatement(sql); stmt.setInt(1, leagueId); result.addAll(super.getMatches(stmt)); } catch (final SQLException e) { e.printStackTrace(); } return result; } private ArrayList getTrainMatches() { final ArrayList result = new ArrayList<>(); final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName " + "FROM SoccerResults as res " + "Join Team as hTeam ON res.homeTeam = hTeam.id " + "Join Team as aTeam ON res.awayTeam = aTeam.id " + "WHERE " + "DATE(gameDate) < DATE_SUB(NOW(), INTERVAL 1 YEAR) AND " + "res.leagueId = ? " + "ORDER BY gameDate DESC"; try { final PreparedStatement stmt = getConnection().prepareStatement(sql); stmt.setInt(1, leagueId); result.addAll(super.getMatches(stmt)); } catch (final SQLException e) { e.printStackTrace(); } return result; } }