HomeDrawAwayTest.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package tests;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.time.format.DateTimeFormatter;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.stream.Collectors;
  9. import com.google.common.collect.Lists;
  10. import data.GuiMysql;
  11. import objects.League;
  12. import objects.SoccerMatch;
  13. import objects.TeamResults;
  14. public class HomeDrawAwayTest extends TestClass {
  15. private ArrayList<League> prioLeagues;
  16. private float activeOdds1;
  17. private float activeOddsX;
  18. private float activeOdds2;
  19. @Override
  20. public void runTest() {
  21. float betAmount;
  22. float bank = startingBank;
  23. final float betLevel = bettingLevel / 100.0f;
  24. float homeBank = startingBank;
  25. float drawBank = startingBank;
  26. float awayBank = startingBank;
  27. final ArrayList<SoccerMatch> matches = getMatches();
  28. for (int i = 0; i < matches.size(); i++) {
  29. final SoccerMatch soccerMatch = matches.get(i);
  30. final List<SoccerMatch> matchesThisDate = matches.stream().filter(
  31. p -> p.getGameDate().format(DateTimeFormatter.ISO_DATE)
  32. .equals(soccerMatch.getGameDate().format(DateTimeFormatter.ISO_DATE)))
  33. .collect(Collectors.toList());
  34. final int matchesThisDateCount = matchesThisDate.size();
  35. betAmount = bank * betLevel;
  36. int gamesBettedOn = 0;
  37. int winsThisDay = 0;
  38. final float startBank = bank;
  39. for (final SoccerMatch sm : matchesThisDate) {
  40. final int leagueId = sm.getHomeTeam().getTeamLeagueId();
  41. final League activeLeague = prioLeagues.stream().filter(p -> p.getLeagueId() == leagueId).findFirst()
  42. .get();
  43. final String betOnThisMatch = checkWhatBet(sm, activeLeague);
  44. if (!"NoBet".equals(betOnThisMatch)) {
  45. if (betOnThisMatch.contains("1")) { // Spela p� hemma lag
  46. gamesBettedOn++;
  47. bank = bank - betAmount;
  48. final float homeBetAmount = (homeBank * betLevel);
  49. homeBank -= homeBetAmount;
  50. if (sm.getHomeScore() > sm.getAwayScore()) {
  51. bank += betAmount * sm.getOdds1();
  52. homeBank += homeBetAmount * sm.getOdds1();
  53. winsThisDay++;
  54. }
  55. }
  56. if (betOnThisMatch.contains("2")) { // Spela p� borta lag
  57. gamesBettedOn++;
  58. bank = bank - betAmount;
  59. final float awayBetAmount = (awayBank * betLevel);
  60. awayBank -= awayBetAmount;
  61. if (sm.getAwayScore() > sm.getHomeScore()) {
  62. bank += betAmount * sm.getOdds2();
  63. awayBank += awayBetAmount * sm.getOdds2();
  64. winsThisDay++;
  65. }
  66. }
  67. if (betOnThisMatch.contains("X")) { // Spela p� Lika
  68. gamesBettedOn++;
  69. bank = bank - betAmount;
  70. final float drawBetAmount = (drawBank * betLevel);
  71. drawBank -= drawBetAmount;
  72. if (sm.getHomeScore() == sm.getAwayScore()) {
  73. bank += betAmount * sm.getOddsX();
  74. drawBank += drawBetAmount * sm.getOddsX();
  75. winsThisDay++;
  76. }
  77. }
  78. }
  79. System.out.println("Match between " + sm.getHomeTeam().getTeamName() + " - "
  80. + sm.getAwayTeam().getTeamName() + " result "
  81. + sm.getHomeScore() + " - " + sm.getAwayScore() + " Betted on " + betOnThisMatch + " at odds "
  82. + sm.getOdds1() + ", "
  83. + sm.getOddsX() + ", " + sm.getOdds2() + " Bet Amount: " + betAmount + " calc odds: "
  84. + activeOdds1 + ", " + activeOddsX
  85. + ", " + activeOdds2);
  86. }
  87. System.out.println(matchesThisDate.get(0).getGameDate() + " result " + (bank - startBank)
  88. + " current bank: " + bank + " bet on "
  89. + gamesBettedOn + "/" + matchesThisDateCount + " wins " + winsThisDay);
  90. i += matchesThisDate.size();
  91. }
  92. System.out.println(
  93. "Final bank " + bank + " homeBank " + homeBank + " drawBank " + drawBank + " awayBank " + awayBank);
  94. }
  95. private String checkWhatBet(SoccerMatch sm, League activeLeague) {
  96. String result = "NoBet";
  97. final float betMarginHomeDecimal = 1 + (activeLeague.getBetMarginHome() / 100f);
  98. final float betMarginDrawDecimal = 1 + (activeLeague.getBetMarginDraw() / 100f);
  99. final float betMarginAwayDecimal = 1 + (activeLeague.getBetMarginAway() / 100f);
  100. final int lookbackHome = activeLeague.getLookbackHome();
  101. final int lookbackDraw = activeLeague.getLookbackDraw();
  102. final int lookbackAway = activeLeague.getLookbackAway();
  103. if (lookbackHome > 0) {
  104. final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResultsTest(sm.getHomeTeam().getTeamId(),
  105. activeLeague.getLookbackHome(), true, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
  106. final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResultsTest(sm.getAwayTeam().getTeamId(),
  107. activeLeague.getLookbackHome(), false, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
  108. final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses())
  109. / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
  110. final float homeOdds = 100 / homeWinPercent;
  111. activeOdds1 = homeOdds * betMarginHomeDecimal;
  112. if (activeLeague.getBetMarginHome() > 0 && homeOdds * betMarginHomeDecimal <= sm.getOdds1()) {
  113. if (result.equals("NoBet")) {
  114. result = "1";
  115. } else {
  116. result += "1";
  117. }
  118. }
  119. }
  120. if (lookbackDraw > 0) {
  121. final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResultsTest(sm.getHomeTeam().getTeamId(),
  122. activeLeague.getLookbackDraw(), true, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
  123. final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResultsTest(sm.getAwayTeam().getTeamId(),
  124. activeLeague.getLookbackDraw(), false, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
  125. final float drawWinPercent = (homeTeamResults.getDraws() + awayTeamResults.getDraws())
  126. / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
  127. final float drawOdds = 100 / drawWinPercent;
  128. activeOddsX = drawOdds * betMarginDrawDecimal;
  129. if (activeLeague.getBetMarginDraw() > 0 && drawOdds * betMarginDrawDecimal <= sm.getOddsX()) {
  130. if (result.equals("NoBet")) {
  131. result = "X";
  132. } else {
  133. result += "X";
  134. }
  135. }
  136. }
  137. if (lookbackAway > 0) {
  138. final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResultsTest(sm.getHomeTeam().getTeamId(),
  139. activeLeague.getLookbackAway(), true, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
  140. final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResultsTest(sm.getAwayTeam().getTeamId(),
  141. activeLeague.getLookbackAway(), false, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
  142. final float awayWinPercent = (awayTeamResults.getWins() + homeTeamResults.getLosses())
  143. / Float.valueOf(awayTeamResults.getCount() + homeTeamResults.getCount()) * 100;
  144. final float awayOdds = 100 / awayWinPercent;
  145. activeOdds2 = awayOdds * betMarginAwayDecimal;
  146. if (activeLeague.getBetMarginHome() > 0 && awayOdds * betMarginAwayDecimal <= sm.getOdds2()) {
  147. if (result.equals("NoBet")) {
  148. result = "2";
  149. } else {
  150. result += "2";
  151. }
  152. }
  153. }
  154. return result;
  155. }
  156. public ArrayList<SoccerMatch> getMatches() {
  157. final ArrayList<SoccerMatch> matches = new ArrayList<>();
  158. prioLeagues = getPrioLeagues();
  159. final ArrayList<String> leagueIds = Lists.newArrayList();
  160. prioLeagues.forEach(p -> leagueIds.add(String.valueOf(p.getLeagueId())));
  161. final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
  162. + "FROM SoccerResults as res "
  163. + "Join Team as hTeam ON res.homeTeam = hTeam.id " + "Join Team as aTeam ON res.awayTeam = aTeam.id "
  164. + "WHERE "
  165. + "DATE(gameDate) > '2021-07-01' AND " + "homeScore >= 0 AND " + "awayScore >= 0 AND "
  166. + "res.leagueId IN ("
  167. + String.join(",", leagueIds) + ") " + "ORDER BY gameDate ASC";
  168. PreparedStatement stmt;
  169. try {
  170. stmt = getConnection().prepareStatement(sql);
  171. matches.addAll(super.getMatches(stmt));
  172. } catch (final SQLException e) {
  173. e.printStackTrace();
  174. }
  175. return matches;
  176. }
  177. private ArrayList<League> getPrioLeagues() {
  178. final String sql = "SELECT * FROM League WHERE prio = 1";
  179. final ArrayList<League> result = Lists.newArrayList();
  180. try {
  181. final PreparedStatement stat = getConnection().prepareStatement(sql);
  182. final ResultSet rs = stat.executeQuery();
  183. while (rs.next()) {
  184. result.add(new League(rs.getInt("id"), rs.getString("name"), rs.getInt("scoringDiffLastGame"),
  185. rs.getInt("scoringTotal"),
  186. rs.getInt("winLossRatioHomeAndAway"), rs.getInt("winLossRatio")));
  187. }
  188. } catch (final SQLException e) {
  189. e.printStackTrace();
  190. }
  191. return result;
  192. }
  193. }