PrioCountriesAll.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package tests;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.time.LocalDateTime;
  7. import java.time.format.DateTimeFormatter;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.stream.Collectors;
  11. import com.google.common.collect.Lists;
  12. import data.GuiMysql;
  13. import objects.League;
  14. import objects.SoccerMatch;
  15. import objects.Team;
  16. import objects.TeamResults;
  17. public class PrioCountriesAll {
  18. Connection conn;
  19. private ArrayList<League> prioLeagues;
  20. public void runTest() {
  21. float bank = 1000;
  22. float betAmount = 1;
  23. final float betLevel = 0.01f;
  24. final ArrayList<SoccerMatch> matches = getMatches();
  25. for (int i = 0; i < matches.size();) {
  26. final SoccerMatch soccerMatch = matches.get(i);
  27. final List<SoccerMatch> matchesThisDate = matches.stream()
  28. .filter(p -> p.getGameDate().format(DateTimeFormatter.ISO_DATE)
  29. .equals(soccerMatch.getGameDate().format(DateTimeFormatter.ISO_DATE)))
  30. .collect(Collectors.toList());
  31. final int matchesThisDateCount = matchesThisDate.size();
  32. betAmount = bank * betLevel;
  33. int gamesBettedOn = 0;
  34. int winsThisDay = 0;
  35. final float startBank = bank;
  36. for (final SoccerMatch sm : matchesThisDate) {
  37. final int leagueId = sm.getHomeTeam().getTeamLeagueId();
  38. final League activeLeague = prioLeagues.stream().filter(p -> p.getLeagueId() == leagueId).findFirst().get();
  39. final int betOnThisMatch = checkIfBet(sm, activeLeague);
  40. if (betOnThisMatch > 0) {
  41. gamesBettedOn++;
  42. if (betOnThisMatch == 1) { // Spela på hemma lag
  43. bank = bank - betAmount;
  44. if (sm.getHomeScore() > sm.getAwayScore()) {
  45. bank += betAmount * sm.getOdds1();
  46. winsThisDay++;
  47. }
  48. } else if (betOnThisMatch == 2) { // Spela på borta lag
  49. bank = bank - betAmount;
  50. if (sm.getAwayScore() > sm.getHomeScore()) {
  51. bank += betAmount * sm.getOdds2();
  52. winsThisDay++;
  53. }
  54. } else if (betOnThisMatch == 3) { // Spela på bort och hemma
  55. bank = bank - betAmount*2;
  56. if (sm.getHomeScore() > sm.getAwayScore()) {
  57. bank += betAmount * sm.getOdds1();
  58. winsThisDay++;
  59. }
  60. if (sm.getAwayScore() > sm.getHomeScore()) {
  61. bank += betAmount * sm.getOdds2();
  62. winsThisDay++;
  63. }
  64. }
  65. }
  66. }
  67. System.out.println(matchesThisDate.get(0).getGameDate() + " result " + (bank - startBank) + " current bank: " + bank +
  68. " bet on " + gamesBettedOn + "/" + matchesThisDateCount + " wins " + winsThisDay);
  69. i += matchesThisDate.size();
  70. }
  71. }
  72. private int checkIfBet(SoccerMatch sm, League league) {
  73. int returnValue = 0;
  74. final float betMarginDecimal = 1 + (league.getBetMargin() / 100f);
  75. final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResults(sm.getHomeTeam().getTeamId(), league.getLookback(), true);
  76. final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResults(sm.getAwayTeam().getTeamId(), league.getLookback(), false);
  77. final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
  78. final float drawPercent = (homeTeamResults.getDraws() + awayTeamResults.getDraws()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
  79. final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
  80. final float homeOdds = 100 / homeWinPercent;
  81. final float drawOdds = 100 / drawPercent;
  82. final float awayOdds = 100 / awayWinPercent;
  83. if (homeOdds * betMarginDecimal <= sm.getOdds1()) {
  84. returnValue += 1;
  85. }
  86. if (awayOdds * betMarginDecimal <= sm.getOdds2()) {
  87. returnValue += 2;
  88. }
  89. return returnValue;
  90. }
  91. private ArrayList<SoccerMatch> getMatches() {
  92. int i = 0;
  93. final ArrayList<SoccerMatch> matches = Lists.newArrayList();
  94. prioLeagues = getPrioLeagues();
  95. final ArrayList<String> leagueIds = Lists.newArrayList();
  96. prioLeagues.forEach(p -> leagueIds.add(String.valueOf(p.getLeagueId())));
  97. final String sql = "SELECT res.*, " +
  98. "hTeam.name as homeTeamName, aTeam.name as awayTeamName " +
  99. "FROM SoccerResults as res " +
  100. "Join Team as hTeam ON res.homeTeam = hTeam.id " +
  101. "Join Team as aTeam ON res.awayTeam = aTeam.id " +
  102. "WHERE " +
  103. "res.leagueId IN (" +
  104. String.join(",", leagueIds) + ") " +
  105. "ORDER BY gameDate ASC";
  106. try {
  107. final PreparedStatement stmt = conn.prepareStatement(sql);
  108. final ResultSet rs = stmt.executeQuery();
  109. while (rs.next()) {
  110. i++;
  111. final SoccerMatch sm = new SoccerMatch();
  112. final Team homeTeam = new Team();
  113. final Team awayTeam = new Team();
  114. homeTeam.setTeamId(rs.getInt("homeTeam"));
  115. awayTeam.setTeamId(rs.getInt("awayTeam"));
  116. homeTeam.setTeamName(rs.getString("homeTeamName"));
  117. awayTeam.setTeamName(rs.getString("awayTeamName"));
  118. homeTeam.setTeamLeagueId(rs.getInt("leagueId"));
  119. awayTeam.setTeamLeagueId(rs.getInt("leagueId"));
  120. homeTeam.setCountryId(rs.getInt("countryId"));
  121. awayTeam.setCountryId(rs.getInt("countryId"));
  122. sm.setAwayScore(rs.getInt("awayScore"));
  123. sm.setHomeScore(rs.getInt("homeScore"));
  124. sm.setHomeTeam(homeTeam);
  125. sm.setAwayTeam(awayTeam);
  126. sm.setMatchId(rs.getInt("id"));
  127. sm.setOdds1(rs.getFloat("odds1"));
  128. sm.setOddsX(rs.getFloat("oddsX"));
  129. sm.setOdds2(rs.getFloat("odds2"));
  130. sm.setGameDate(LocalDateTime.parse(rs.getString("gameDate")));
  131. sm.setSeason(rs.getString("season"));
  132. matches.add(sm);
  133. }
  134. } catch (final SQLException e) {
  135. e.printStackTrace();
  136. }
  137. return matches;
  138. }
  139. private ArrayList<League> getPrioLeagues() {
  140. final String sql = "SELECT * FROM League WHERE prio = 1";
  141. final ArrayList<League> result = Lists.newArrayList();
  142. try {
  143. final PreparedStatement stat = getConnection().prepareStatement(sql);
  144. final ResultSet rs = stat.executeQuery();
  145. while (rs.next()) {
  146. result.add(new League(rs.getInt("id"), rs.getString("name"), rs.getInt("lookback"), rs.getInt("betMargin")));
  147. }
  148. } catch (final SQLException e) {
  149. e.printStackTrace();
  150. }
  151. return result;
  152. }
  153. private Connection getConnection() {
  154. if (conn == null) {
  155. conn = GuiMysql.getInstance().getDbConnection();
  156. }
  157. return conn;
  158. }
  159. }