overtime-live-trading-utils 2.0.38 → 2.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +3 -3
- package/main.js +1 -1
- package/package.json +1 -1
- package/src/constants/errors.ts +1 -1
- package/src/tests/mock/MockSoccerRedis.ts +0 -1
- package/src/tests/unit/bookmakers.test.ts +1 -0
- package/src/tests/unit/markets.test.ts +1 -1
- package/src/utils/bookmakers.ts +9 -4
- package/src/utils/markets.ts +35 -30
- package/src/utils/odds.ts +2 -1
package/package.json
CHANGED
package/src/constants/errors.ts
CHANGED
|
@@ -2,4 +2,4 @@ export const ZERO_ODDS_MESSAGE = 'Returning zero odds cause bookmakers have 0 or
|
|
|
2
2
|
export const DIFF_BETWEEN_BOOKMAKERS_MESSAGE = 'Returning zero odds due to percentage difference between bookmakers';
|
|
3
3
|
export const NO_MATCHING_BOOKMAKERS_MESSAGE = 'Returning zero odds cause no matching bookmakers have been found';
|
|
4
4
|
export const ZERO_ODDS_AFTER_SPREAD_ADJUSTMENT = 'Bad odds after spread adjustment';
|
|
5
|
-
export const NO_MARKETS_FOR_LEAGUE_ID = 'No child markets for leagueID
|
|
5
|
+
export const NO_MARKETS_FOR_LEAGUE_ID = 'No child markets for leagueID';
|
|
@@ -50,7 +50,6 @@ export const mockSoccer = {
|
|
|
50
50
|
'0x80974b0005f2b5c5ea75d1717a23c7a4c907839a585aadee58d0c4baacdfc4e8',
|
|
51
51
|
'0x20e31e07d357ce06a783a29a13f5eac28664182ecd6e7bee3b41ba131cc606eb',
|
|
52
52
|
],
|
|
53
|
-
isV3: true,
|
|
54
53
|
childMarkets: [
|
|
55
54
|
{
|
|
56
55
|
gameId: '0x3030394130434633343445450000000000000000000000000000000000000000',
|
|
@@ -50,6 +50,7 @@ describe('Bookmakers', () => {
|
|
|
50
50
|
expect(hasOdds).toBe(false);
|
|
51
51
|
expect(market).toHaveProperty('errorMessage');
|
|
52
52
|
expect(market.errorMessage).toBe(DIFF_BETWEEN_BOOKMAKERS_MESSAGE);
|
|
53
|
+
expect(market).not.toHaveProperty('childMarkets');
|
|
53
54
|
});
|
|
54
55
|
|
|
55
56
|
it('Should return zero odds for moneyline as no matching bookmaker was provided', () => {
|
|
@@ -130,7 +130,7 @@ describe('Markets', () => {
|
|
|
130
130
|
);
|
|
131
131
|
|
|
132
132
|
expect(warnSpy).toHaveBeenCalled();
|
|
133
|
-
expect(warnSpy).toHaveBeenCalledWith(NO_MARKETS_FOR_LEAGUE_ID);
|
|
133
|
+
expect(warnSpy).toHaveBeenCalledWith(`${NO_MARKETS_FOR_LEAGUE_ID}: ${Number(mockSoccer.leagueId)}`);
|
|
134
134
|
|
|
135
135
|
// Restore the original implementation
|
|
136
136
|
warnSpy.mockRestore();
|
package/src/utils/bookmakers.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import * as oddslib from 'oddslib';
|
|
2
|
+
import {
|
|
3
|
+
DIFF_BETWEEN_BOOKMAKERS_MESSAGE,
|
|
4
|
+
NO_MATCHING_BOOKMAKERS_MESSAGE,
|
|
5
|
+
ZERO_ODDS_MESSAGE,
|
|
6
|
+
} from '../constants/errors';
|
|
2
7
|
|
|
3
8
|
export const getBookmakersArray = (bookmakersData: any[], sportId: any, backupLiveOddsProviders: string[]) => {
|
|
4
9
|
const sportBookmakersData = bookmakersData.find((data) => Number(data.sportId) === Number(sportId));
|
|
@@ -33,7 +38,7 @@ export const checkOddsFromBookmakers = (
|
|
|
33
38
|
homeOdds: 0,
|
|
34
39
|
awayOdds: 0,
|
|
35
40
|
drawOdds: 0,
|
|
36
|
-
errorMessage:
|
|
41
|
+
errorMessage: NO_MATCHING_BOOKMAKERS_MESSAGE,
|
|
37
42
|
};
|
|
38
43
|
}
|
|
39
44
|
|
|
@@ -63,7 +68,7 @@ export const checkOddsFromBookmakers = (
|
|
|
63
68
|
homeOdds: 0,
|
|
64
69
|
awayOdds: 0,
|
|
65
70
|
drawOdds: 0,
|
|
66
|
-
errorMessage:
|
|
71
|
+
errorMessage: ZERO_ODDS_MESSAGE,
|
|
67
72
|
// TODO: Return sportsbook name with zero odds
|
|
68
73
|
};
|
|
69
74
|
}
|
|
@@ -128,7 +133,7 @@ export const checkOddsFromBookmakers = (
|
|
|
128
133
|
return true;
|
|
129
134
|
}
|
|
130
135
|
}
|
|
131
|
-
return false;
|
|
136
|
+
return false;
|
|
132
137
|
});
|
|
133
138
|
|
|
134
139
|
if (hasLargeImpliedPercentageDifference) {
|
|
@@ -136,7 +141,7 @@ export const checkOddsFromBookmakers = (
|
|
|
136
141
|
homeOdds: 0,
|
|
137
142
|
awayOdds: 0,
|
|
138
143
|
drawOdds: 0,
|
|
139
|
-
errorMessage:
|
|
144
|
+
errorMessage: DIFF_BETWEEN_BOOKMAKERS_MESSAGE,
|
|
140
145
|
};
|
|
141
146
|
}
|
|
142
147
|
|
package/src/utils/markets.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as oddslib from 'oddslib';
|
|
2
|
+
import { DIFF_BETWEEN_BOOKMAKERS_MESSAGE, ZERO_ODDS_AFTER_SPREAD_ADJUSTMENT } from '../constants/errors';
|
|
2
3
|
import { OddsObject } from '../types/odds';
|
|
3
4
|
import { createChildMarkets, getParentOdds } from './odds';
|
|
4
5
|
import { getLeagueInfo } from './sports';
|
|
@@ -63,7 +64,7 @@ export const processMarket = (
|
|
|
63
64
|
normalizedImplied: probability,
|
|
64
65
|
};
|
|
65
66
|
} else {
|
|
66
|
-
market.errorMessage =
|
|
67
|
+
market.errorMessage = ZERO_ODDS_AFTER_SPREAD_ADJUSTMENT;
|
|
67
68
|
return {
|
|
68
69
|
american: 0,
|
|
69
70
|
decimal: 0,
|
|
@@ -73,38 +74,42 @@ export const processMarket = (
|
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
77
|
+
if (moneylineOdds.errorMessage === DIFF_BETWEEN_BOOKMAKERS_MESSAGE) {
|
|
78
|
+
delete market.childMarkets;
|
|
79
|
+
} else {
|
|
80
|
+
const childMarkets = createChildMarkets(
|
|
81
|
+
apiResponseWithOdds,
|
|
82
|
+
sportSpreadData,
|
|
83
|
+
market.leagueId,
|
|
84
|
+
liveOddsProviders,
|
|
85
|
+
defaultSpreadForLiveMarkets,
|
|
86
|
+
leagueMap
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const packedChildMarkets = childMarkets.map((childMarket: any) => {
|
|
90
|
+
const preparedMarket = { ...market, ...childMarket };
|
|
91
|
+
const oddsAfterSpread = adjustAddedSpread(preparedMarket.odds, leagueInfo, preparedMarket.typeId);
|
|
92
|
+
if (preparedMarket.odds.length > 0) {
|
|
93
|
+
preparedMarket.odds = oddsAfterSpread.map((probability) => {
|
|
94
|
+
if (probability == 0) {
|
|
95
|
+
return {
|
|
96
|
+
american: 0,
|
|
97
|
+
decimal: 0,
|
|
98
|
+
normalizedImplied: 0,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
84
101
|
|
|
85
|
-
const packedChildMarkets = childMarkets.map((childMarket: any) => {
|
|
86
|
-
const preparedMarket = { ...market, ...childMarket };
|
|
87
|
-
const oddsAfterSpread = adjustAddedSpread(preparedMarket.odds, leagueInfo, preparedMarket.typeId);
|
|
88
|
-
if (preparedMarket.odds.length > 0) {
|
|
89
|
-
preparedMarket.odds = oddsAfterSpread.map((probability) => {
|
|
90
|
-
if (probability == 0) {
|
|
91
102
|
return {
|
|
92
|
-
american:
|
|
93
|
-
decimal:
|
|
94
|
-
normalizedImplied:
|
|
103
|
+
american: oddslib.from('impliedProbability', probability).to('moneyline'),
|
|
104
|
+
decimal: Number(oddslib.from('impliedProbability', probability).to('decimal').toFixed(10)),
|
|
105
|
+
normalizedImplied: probability,
|
|
95
106
|
};
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
};
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
return preparedMarket;
|
|
106
|
-
});
|
|
107
|
-
market.childMarkets = packedChildMarkets;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return preparedMarket;
|
|
110
|
+
});
|
|
111
|
+
market.childMarkets = packedChildMarkets;
|
|
112
|
+
}
|
|
108
113
|
|
|
109
114
|
return market;
|
|
110
115
|
};
|
package/src/utils/odds.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as oddslib from 'oddslib';
|
|
2
2
|
import { MarketType, MarketTypeMap } from 'overtime-utils';
|
|
3
3
|
import { DRAW, MIN_ODDS_FOR_DIFF_CHECKING, MONEYLINE_TYPE_ID, ZERO } from '../constants/common';
|
|
4
|
+
import { NO_MARKETS_FOR_LEAGUE_ID } from '../constants/errors';
|
|
4
5
|
import { MoneylineTypes } from '../enums/sports';
|
|
5
6
|
import { HomeAwayTeams, Odds, OddsObject } from '../types/odds';
|
|
6
7
|
import { ChildMarket, LeagueConfigInfo } from '../types/sports';
|
|
@@ -286,7 +287,7 @@ export const createChildMarkets: (
|
|
|
286
287
|
childMarkets.push(childMarket);
|
|
287
288
|
});
|
|
288
289
|
} else {
|
|
289
|
-
console.warn(
|
|
290
|
+
console.warn(`${NO_MARKETS_FOR_LEAGUE_ID}: ${Number(leagueId)}`);
|
|
290
291
|
}
|
|
291
292
|
|
|
292
293
|
return childMarkets;
|