be-components 2.4.7 → 2.4.9
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/lib/commonjs/LocationTracker/LocationStatus.js.map +1 -1
- package/lib/commonjs/LocationTracker/api/index.js +14 -0
- package/lib/commonjs/LocationTracker/api/index.js.map +1 -1
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js +91 -3
- package/lib/commonjs/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
- package/lib/commonjs/MarketMaker/api/index.js +1307 -0
- package/lib/commonjs/MarketMaker/api/index.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/Contest.js +150 -0
- package/lib/commonjs/MarketMaker/components/Contest.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/ContestMarkets.js +300 -0
- package/lib/commonjs/MarketMaker/components/ContestMarkets.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/ContestSelector.js +111 -0
- package/lib/commonjs/MarketMaker/components/ContestSelector.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/Dashboard.js +164 -0
- package/lib/commonjs/MarketMaker/components/Dashboard.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/FundActions.js +232 -0
- package/lib/commonjs/MarketMaker/components/FundActions.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/FundOwnershipList.js +94 -0
- package/lib/commonjs/MarketMaker/components/FundOwnershipList.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/FundSelector.js +99 -0
- package/lib/commonjs/MarketMaker/components/FundSelector.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/FundingRequestList.js +112 -0
- package/lib/commonjs/MarketMaker/components/FundingRequestList.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/ManageFundForm.js +122 -0
- package/lib/commonjs/MarketMaker/components/ManageFundForm.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/MarketSelector.js +81 -0
- package/lib/commonjs/MarketMaker/components/MarketSelector.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/SetMarketForm.js +305 -0
- package/lib/commonjs/MarketMaker/components/SetMarketForm.js.map +1 -0
- package/lib/commonjs/MarketMaker/components/WeightProgress.js +40 -0
- package/lib/commonjs/MarketMaker/components/WeightProgress.js.map +1 -0
- package/lib/commonjs/MarketMaker/index.js +452 -0
- package/lib/commonjs/MarketMaker/index.js.map +1 -0
- package/lib/commonjs/SocialComponents/api/index.js +0 -1
- package/lib/commonjs/SocialComponents/api/index.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.d.js +4 -0
- package/lib/module/LocationTracker/LocationStatus.js.map +1 -1
- package/lib/module/LocationTracker/api/index.js +14 -0
- package/lib/module/LocationTracker/api/index.js.map +1 -1
- package/lib/module/MarketComponents/components/TeamEventMarket/index.js +91 -3
- package/lib/module/MarketComponents/components/TeamEventMarket/index.js.map +1 -1
- package/lib/module/MarketMaker/api/index.js +1301 -0
- package/lib/module/MarketMaker/api/index.js.map +1 -0
- package/lib/module/MarketMaker/components/Contest.js +143 -0
- package/lib/module/MarketMaker/components/Contest.js.map +1 -0
- package/lib/module/MarketMaker/components/ContestMarkets.js +291 -0
- package/lib/module/MarketMaker/components/ContestMarkets.js.map +1 -0
- package/lib/module/MarketMaker/components/ContestSelector.js +102 -0
- package/lib/module/MarketMaker/components/ContestSelector.js.map +1 -0
- package/lib/module/MarketMaker/components/Dashboard.js +155 -0
- package/lib/module/MarketMaker/components/Dashboard.js.map +1 -0
- package/lib/module/MarketMaker/components/FundActions.js +223 -0
- package/lib/module/MarketMaker/components/FundActions.js.map +1 -0
- package/lib/module/MarketMaker/components/FundOwnershipList.js +87 -0
- package/lib/module/MarketMaker/components/FundOwnershipList.js.map +1 -0
- package/lib/module/MarketMaker/components/FundSelector.js +92 -0
- package/lib/module/MarketMaker/components/FundSelector.js.map +1 -0
- package/lib/module/MarketMaker/components/FundingRequestList.js +105 -0
- package/lib/module/MarketMaker/components/FundingRequestList.js.map +1 -0
- package/lib/module/MarketMaker/components/ManageFundForm.js +113 -0
- package/lib/module/MarketMaker/components/ManageFundForm.js.map +1 -0
- package/lib/module/MarketMaker/components/MarketSelector.js +74 -0
- package/lib/module/MarketMaker/components/MarketSelector.js.map +1 -0
- package/lib/module/MarketMaker/components/SetMarketForm.js +297 -0
- package/lib/module/MarketMaker/components/SetMarketForm.js.map +1 -0
- package/lib/module/MarketMaker/components/WeightProgress.js +33 -0
- package/lib/module/MarketMaker/components/WeightProgress.js.map +1 -0
- package/lib/module/MarketMaker/index.js +442 -0
- package/lib/module/MarketMaker/index.js.map +1 -0
- package/lib/module/SocialComponents/api/index.js +0 -1
- package/lib/module/SocialComponents/api/index.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.d.js +1 -1
- package/lib/typescript/src/LocationTracker/LocationStatus.d.ts.map +1 -1
- package/lib/typescript/src/LocationTracker/api/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts +2 -2
- package/lib/typescript/src/MarketComponents/components/TeamEventMarket/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketComponents/index.d.ts +2 -2
- package/lib/typescript/src/MarketComponents/index.d.ts.map +1 -1
- package/lib/typescript/src/MarketMaker/api/index.d.ts +131 -0
- package/lib/typescript/src/MarketMaker/api/index.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/Contest.d.ts +25 -0
- package/lib/typescript/src/MarketMaker/components/Contest.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts +26 -0
- package/lib/typescript/src/MarketMaker/components/ContestMarkets.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/ContestSelector.d.ts +19 -0
- package/lib/typescript/src/MarketMaker/components/ContestSelector.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts +25 -0
- package/lib/typescript/src/MarketMaker/components/Dashboard.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/FundActions.d.ts +12 -0
- package/lib/typescript/src/MarketMaker/components/FundActions.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/FundOwnershipList.d.ts +9 -0
- package/lib/typescript/src/MarketMaker/components/FundOwnershipList.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/FundSelector.d.ts +13 -0
- package/lib/typescript/src/MarketMaker/components/FundSelector.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/FundingRequestList.d.ts +11 -0
- package/lib/typescript/src/MarketMaker/components/FundingRequestList.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/ManageFundForm.d.ts +10 -0
- package/lib/typescript/src/MarketMaker/components/ManageFundForm.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/MarketSelector.d.ts +12 -0
- package/lib/typescript/src/MarketMaker/components/MarketSelector.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts +15 -0
- package/lib/typescript/src/MarketMaker/components/SetMarketForm.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts +10 -0
- package/lib/typescript/src/MarketMaker/components/WeightProgress.d.ts.map +1 -0
- package/lib/typescript/src/MarketMaker/index.d.ts +7 -0
- package/lib/typescript/src/MarketMaker/index.d.ts.map +1 -0
- package/lib/typescript/src/SocialComponents/api/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/LocationTracker/LocationStatus.tsx +0 -1
- package/src/LocationTracker/api/index.tsx +16 -0
- package/src/MarketComponents/components/TeamEventMarket/index.tsx +54 -4
- package/src/MarketMaker/api/index.ts +1023 -0
- package/src/MarketMaker/components/Contest.tsx +106 -0
- package/src/MarketMaker/components/ContestMarkets.tsx +174 -0
- package/src/MarketMaker/components/ContestSelector.tsx +84 -0
- package/src/MarketMaker/components/Dashboard.tsx +112 -0
- package/src/MarketMaker/components/FundActions.tsx +149 -0
- package/src/MarketMaker/components/FundOwnershipList.tsx +54 -0
- package/src/MarketMaker/components/FundSelector.tsx +65 -0
- package/src/MarketMaker/components/FundingRequestList.tsx +71 -0
- package/src/MarketMaker/components/ManageFundForm.tsx +83 -0
- package/src/MarketMaker/components/MarketSelector.tsx +50 -0
- package/src/MarketMaker/components/SetMarketForm.tsx +213 -0
- package/src/MarketMaker/components/WeightProgress.tsx +25 -0
- package/src/MarketMaker/index.tsx +378 -0
- package/src/SocialComponents/api/index.ts +0 -1
- package/src/index.tsx +2 -1
- package/src/types.d.ts +135 -0
|
@@ -0,0 +1,1307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.MarketMaketHelpers = exports.MarketMakerApi = void 0;
|
|
7
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
8
|
+
var _ApiOverrides = require("../../ApiOverrides");
|
|
9
|
+
var _momentMini = _interopRequireDefault(require("moment-mini"));
|
|
10
|
+
var _colors = _interopRequireDefault(require("../../constants/colors"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
let EVENT_SVC_API = '';
|
|
13
|
+
let MK_SVC_API = '';
|
|
14
|
+
let AUTH_SVC_API = '';
|
|
15
|
+
const MarketMakerApi = exports.MarketMakerApi = {
|
|
16
|
+
setEnvironment: () => {
|
|
17
|
+
const endpoints = _ApiOverrides.APIOverrides.getEndpoints();
|
|
18
|
+
EVENT_SVC_API = endpoints['EVENT_SVC_API'];
|
|
19
|
+
MK_SVC_API = endpoints['MK_SVC_API'];
|
|
20
|
+
AUTH_SVC_API = endpoints['AUTH_SVC_API'];
|
|
21
|
+
},
|
|
22
|
+
getPlayersByIds: async player_ids => {
|
|
23
|
+
try {
|
|
24
|
+
if (player_ids.length == 0) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
const resp = await _axios.default.post(`${AUTH_SVC_API}/v1/players/bulk/get`, {
|
|
28
|
+
player_ids
|
|
29
|
+
});
|
|
30
|
+
return resp.data.players;
|
|
31
|
+
} catch (e) {
|
|
32
|
+
console.log(e);
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
getMyActiveFunds: async offset => {
|
|
37
|
+
try {
|
|
38
|
+
const resp = await _axios.default.get(`${MK_SVC_API}/v1/funds/me/active?offset=${offset}`);
|
|
39
|
+
return resp.data.funds;
|
|
40
|
+
} catch (e) {
|
|
41
|
+
console.log(e);
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
createFund: async (name, minimum_investment, market_type) => {
|
|
46
|
+
try {
|
|
47
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/fund/create`, {
|
|
48
|
+
name,
|
|
49
|
+
minimum_investment,
|
|
50
|
+
market_type
|
|
51
|
+
});
|
|
52
|
+
return resp.data.fund;
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.log(e);
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
udpateFundName: async (fund_id, name) => {
|
|
59
|
+
try {
|
|
60
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/fund/update/name`, {
|
|
61
|
+
fund_id,
|
|
62
|
+
name
|
|
63
|
+
});
|
|
64
|
+
return resp.data.fund;
|
|
65
|
+
} catch (e) {
|
|
66
|
+
console.log(e);
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
udpateFundMinimum: async (fund_id, minimum_investment) => {
|
|
71
|
+
try {
|
|
72
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/fund/update/min`, {
|
|
73
|
+
fund_id,
|
|
74
|
+
minimum_investment
|
|
75
|
+
});
|
|
76
|
+
return resp.data.fund;
|
|
77
|
+
} catch (e) {
|
|
78
|
+
console.log(e);
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
getFundById: async fund_id => {
|
|
83
|
+
try {
|
|
84
|
+
const resp = await _axios.default.get(`${MK_SVC_API}/v1/funds/fund/${fund_id}`);
|
|
85
|
+
return resp.data;
|
|
86
|
+
} catch (e) {
|
|
87
|
+
console.log(e);
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
getFundingRequestsByFundId: async fund_id => {
|
|
92
|
+
try {
|
|
93
|
+
const resp = await _axios.default.get(`${MK_SVC_API}/v1/funds/requests/fund/${fund_id}`);
|
|
94
|
+
return resp.data.funding_requests;
|
|
95
|
+
} catch (e) {
|
|
96
|
+
console.log(e);
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
depositRequest: async (fund_id, amount) => {
|
|
101
|
+
try {
|
|
102
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/deposit/request/create`, {
|
|
103
|
+
fund_id,
|
|
104
|
+
amount
|
|
105
|
+
});
|
|
106
|
+
return resp.data.fund;
|
|
107
|
+
} catch (e) {
|
|
108
|
+
console.log(e);
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
approveRequest: async funding_request_id => {
|
|
113
|
+
try {
|
|
114
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/deposit/request/approve`, {
|
|
115
|
+
funding_request_id
|
|
116
|
+
});
|
|
117
|
+
return resp.data;
|
|
118
|
+
} catch (e) {
|
|
119
|
+
console.log(e);
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
declineRequest: async funding_request_id => {
|
|
124
|
+
try {
|
|
125
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/deposit/request/decline`, {
|
|
126
|
+
funding_request_id
|
|
127
|
+
});
|
|
128
|
+
return resp.data.funding_request;
|
|
129
|
+
} catch (e) {
|
|
130
|
+
console.log(e);
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
workCapital: async (fund_id, amount) => {
|
|
135
|
+
try {
|
|
136
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/capital/work`, {
|
|
137
|
+
fund_id,
|
|
138
|
+
amount
|
|
139
|
+
});
|
|
140
|
+
return resp.data;
|
|
141
|
+
} catch (e) {
|
|
142
|
+
console.log(e);
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
layoffCapital: async (fund_id, amount) => {
|
|
147
|
+
try {
|
|
148
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/capital/layoff`, {
|
|
149
|
+
fund_id,
|
|
150
|
+
amount
|
|
151
|
+
});
|
|
152
|
+
return resp.data;
|
|
153
|
+
} catch (e) {
|
|
154
|
+
console.log(e);
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
addOrdersToFund: async (fund_id, orders) => {
|
|
159
|
+
try {
|
|
160
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/funds/fund/orders/add`, {
|
|
161
|
+
fund_id,
|
|
162
|
+
orders
|
|
163
|
+
});
|
|
164
|
+
console.log(resp.data);
|
|
165
|
+
return resp.data.orders;
|
|
166
|
+
} catch (e) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
getLeagues: async () => {
|
|
171
|
+
try {
|
|
172
|
+
const resp = await _axios.default.get(`${EVENT_SVC_API}/v1/leagues`);
|
|
173
|
+
return resp.data.leagues;
|
|
174
|
+
} catch (e) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
getMarkets: async () => {
|
|
179
|
+
try {
|
|
180
|
+
const resp = await _axios.default.get(`${MK_SVC_API}/v1/markets/all`);
|
|
181
|
+
return resp.data.markets;
|
|
182
|
+
} catch (e) {
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
getMyAction: async () => {
|
|
187
|
+
try {
|
|
188
|
+
const resp = await _axios.default.get(`${MK_SVC_API}/v1/orders/action/me`);
|
|
189
|
+
return resp.data.orders;
|
|
190
|
+
} catch (e) {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
getActiveEvents: async () => {
|
|
195
|
+
try {
|
|
196
|
+
const resp = await _axios.default.get(`${EVENT_SVC_API}/v1/events/active?expanded=true`);
|
|
197
|
+
return resp.data.events;
|
|
198
|
+
} catch (e) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
getEventsByEventIds: async event_ids => {
|
|
203
|
+
if (event_ids.length == 0) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const resp = await _axios.default.post(`${EVENT_SVC_API}/v1/events/bulk/get`, {
|
|
208
|
+
attribute: 'event_id',
|
|
209
|
+
values: event_ids
|
|
210
|
+
});
|
|
211
|
+
return resp.data.events;
|
|
212
|
+
} catch (e) {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
getBestAvailableOrders: async () => {
|
|
217
|
+
try {
|
|
218
|
+
const resp = await _axios.default.get(`${MK_SVC_API}/v1/orders/available`);
|
|
219
|
+
return resp.data;
|
|
220
|
+
} catch (e) {
|
|
221
|
+
return {
|
|
222
|
+
events: [],
|
|
223
|
+
tournaments: [],
|
|
224
|
+
matches: []
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
getPricesByEvents: async (event_type, event_ids) => {
|
|
229
|
+
if (event_ids.length == 0) {
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const resp = await _axios.default.post(`${EVENT_SVC_API}/v1/prices/latest/bulk/get`, {
|
|
234
|
+
event_type,
|
|
235
|
+
event_ids
|
|
236
|
+
});
|
|
237
|
+
return resp.data.prices;
|
|
238
|
+
} catch (e) {
|
|
239
|
+
console.log(e);
|
|
240
|
+
return [];
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
getPricesByEvent: async (event_id, event_type) => {
|
|
244
|
+
try {
|
|
245
|
+
const resp = await _axios.default.get(`${EVENT_SVC_API}/v1/prices/latest/${event_id}/${event_type}`);
|
|
246
|
+
return resp.data.prices;
|
|
247
|
+
} catch (e) {
|
|
248
|
+
console.log(e);
|
|
249
|
+
return [];
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
getLatestTradesByEvents: async (event_type, event_ids) => {
|
|
253
|
+
try {
|
|
254
|
+
if (event_ids.length == 0) {
|
|
255
|
+
return [];
|
|
256
|
+
}
|
|
257
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/trades/event/latest/bulk/get`, {
|
|
258
|
+
event_type,
|
|
259
|
+
event_ids
|
|
260
|
+
});
|
|
261
|
+
return resp.data.trades;
|
|
262
|
+
} catch (e) {
|
|
263
|
+
console.log(e);
|
|
264
|
+
return [];
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
cancelOrders: async order_ids => {
|
|
268
|
+
if (order_ids.length == 0) {
|
|
269
|
+
return [];
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
const resp = await _axios.default.post(`${MK_SVC_API}/v1/orders/bulk/cancel`, {
|
|
273
|
+
order_ids
|
|
274
|
+
});
|
|
275
|
+
return resp.data.orders;
|
|
276
|
+
} catch (e) {
|
|
277
|
+
alert('Unable to process cancellation');
|
|
278
|
+
return [];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
const MarketMaketHelpers = exports.MarketMaketHelpers = {
|
|
283
|
+
getOrderStats: orders => {
|
|
284
|
+
let called_amt = 0,
|
|
285
|
+
open_amt = 0,
|
|
286
|
+
open_potential_winnings = 0,
|
|
287
|
+
stake_amt = 0,
|
|
288
|
+
stake_potential_winnings = 0;
|
|
289
|
+
let open_probability = 0,
|
|
290
|
+
open_odds = 0,
|
|
291
|
+
cash_rcvd = 0,
|
|
292
|
+
delayed_cash = 0,
|
|
293
|
+
winnings = 0,
|
|
294
|
+
net_winnings = 0,
|
|
295
|
+
commission = 0;
|
|
296
|
+
let stake_earnings = 0;
|
|
297
|
+
orders.map(o => {
|
|
298
|
+
if (o.status == 'approved') {
|
|
299
|
+
open_amt += o.open_amt;
|
|
300
|
+
open_potential_winnings += o.potential_winnings;
|
|
301
|
+
}
|
|
302
|
+
called_amt += o.called_amt;
|
|
303
|
+
if (o.positions) {
|
|
304
|
+
o.positions.map(p => {
|
|
305
|
+
stake_amt += p.stake;
|
|
306
|
+
stake_potential_winnings += p.potential_winnings;
|
|
307
|
+
cash_rcvd += p.cash_rcvd;
|
|
308
|
+
delayed_cash += p.delayed_cash;
|
|
309
|
+
winnings += p.winnings;
|
|
310
|
+
net_winnings += p.net_winnings;
|
|
311
|
+
commission += p.commission;
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
stake_earnings = stake_potential_winnings - stake_amt;
|
|
316
|
+
if (open_potential_winnings > 0) {
|
|
317
|
+
open_probability = open_amt / open_potential_winnings;
|
|
318
|
+
open_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(open_probability);
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
open_amt,
|
|
322
|
+
stake_earnings,
|
|
323
|
+
open_odds,
|
|
324
|
+
called_amt,
|
|
325
|
+
open_potential_winnings,
|
|
326
|
+
stake_amt,
|
|
327
|
+
stake_potential_winnings,
|
|
328
|
+
open_probability,
|
|
329
|
+
cash_rcvd,
|
|
330
|
+
delayed_cash,
|
|
331
|
+
winnings,
|
|
332
|
+
net_winnings,
|
|
333
|
+
commission
|
|
334
|
+
};
|
|
335
|
+
},
|
|
336
|
+
getWeight: (o_side_potential_winnings, trade_side_potential_winnings, market) => {
|
|
337
|
+
const total = o_side_potential_winnings + trade_side_potential_winnings;
|
|
338
|
+
let weighted_pct = 0;
|
|
339
|
+
const difference = trade_side_potential_winnings - o_side_potential_winnings;
|
|
340
|
+
const direction = difference > 0 ? market.trade_side : difference == 0 ? 'neutral' : market.side_options.find(so => so.side != market.trade_side)?.side;
|
|
341
|
+
if (total > 0) {
|
|
342
|
+
weighted_pct = difference / total;
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
direction,
|
|
346
|
+
weighted_pct,
|
|
347
|
+
difference
|
|
348
|
+
};
|
|
349
|
+
},
|
|
350
|
+
sortContests: (events, tournaments, matches, markets) => {
|
|
351
|
+
let contests = [];
|
|
352
|
+
events.map(e => {
|
|
353
|
+
let e_markets = e.supported_markets ? markets.filter(m => e.supported_markets?.map(sm => sm.market_id.toString()).includes(m.market_id.toString())) : [];
|
|
354
|
+
contests.push({
|
|
355
|
+
league_id: e.league_id,
|
|
356
|
+
id: e.event_id,
|
|
357
|
+
title: e.event_title,
|
|
358
|
+
contest_type: 'team',
|
|
359
|
+
time_detail: e.time_detail == 'scheduled' ? (0, _momentMini.default)(e.scheduled_datetime).format('MMM DD : hh:mm a') : e.time_detail ?? '',
|
|
360
|
+
scheduled_datetime: (0, _momentMini.default)(e.scheduled_datetime),
|
|
361
|
+
markets: e_markets
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
tournaments.map(t => {
|
|
365
|
+
let t_markets = t.supported_markets ? markets.filter(m => t.supported_markets?.map(sm => sm.market_id.toString()).includes(m.market_id.toString())) : [];
|
|
366
|
+
contests.push({
|
|
367
|
+
markets: t_markets,
|
|
368
|
+
league_id: t.league_id,
|
|
369
|
+
id: t.tournament_id,
|
|
370
|
+
title: t.tournament_name,
|
|
371
|
+
contest_type: 'tournament',
|
|
372
|
+
time_detail: (0, _momentMini.default)(t.scheduled_datetime).format('MMM DD : hh:mm a'),
|
|
373
|
+
scheduled_datetime: (0, _momentMini.default)(t.scheduled_datetime)
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
matches.map(m => {
|
|
377
|
+
const tourney = tournaments.find(t => t.tournament_id == m.tournament_id);
|
|
378
|
+
let m_markets = m.supported_markets ? markets.filter(mk => m.supported_markets?.map(sm => sm.market_id.toString()).includes(mk.market_id.toString())) : [];
|
|
379
|
+
contests.push({
|
|
380
|
+
markets: m_markets,
|
|
381
|
+
league_id: tourney?.league_id,
|
|
382
|
+
id: m.match_id,
|
|
383
|
+
title: m.match_title,
|
|
384
|
+
contest_type: 'match',
|
|
385
|
+
time_detail: (0, _momentMini.default)(m.scheduled_datetime).format('MMM DD : hh:mm a'),
|
|
386
|
+
scheduled_datetime: (0, _momentMini.default)(m.scheduled_datetime)
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
return contests;
|
|
390
|
+
},
|
|
391
|
+
calcAmericanOddsFromProbability: probability => {
|
|
392
|
+
let p = probability * 100; //Convert to whole number
|
|
393
|
+
if (p >= 100) {
|
|
394
|
+
return -99999;
|
|
395
|
+
}
|
|
396
|
+
if (p === 0) {
|
|
397
|
+
return 9999;
|
|
398
|
+
}
|
|
399
|
+
if (p === 50) {
|
|
400
|
+
return 100;
|
|
401
|
+
}
|
|
402
|
+
if (p < 50) {
|
|
403
|
+
return 100 / (p / 100) - 100;
|
|
404
|
+
}
|
|
405
|
+
return p / (1 - p / 100) * -1;
|
|
406
|
+
},
|
|
407
|
+
getSelectableMarkets: (events, tournaments, matches, markets) => {
|
|
408
|
+
let market_ids = [];
|
|
409
|
+
events.map(e => {
|
|
410
|
+
if (e.supported_markets) {
|
|
411
|
+
market_ids = market_ids.concat(e.supported_markets.map(sm => sm.market_id));
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
tournaments.map(e => {
|
|
415
|
+
if (e.supported_markets) {
|
|
416
|
+
market_ids = market_ids.concat(e.supported_markets.map(sm => sm.market_id));
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
matches.map(e => {
|
|
420
|
+
if (e.supported_markets) {
|
|
421
|
+
market_ids = market_ids.concat(e.supported_markets.map(sm => sm.market_id));
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
market_ids = [...new Set(market_ids.map(id => id.toString()))];
|
|
425
|
+
return markets.filter(m => market_ids.includes(m.market_id.toString()));
|
|
426
|
+
},
|
|
427
|
+
getMarketDataFromBestAvailable: ba => {
|
|
428
|
+
let updated = false;
|
|
429
|
+
let event_order_stats = [];
|
|
430
|
+
let available_orders = [];
|
|
431
|
+
let latest_trades = [];
|
|
432
|
+
ba.events.map(ba_event => {
|
|
433
|
+
if (!ba_event.supported_markets) {
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
updated = true;
|
|
437
|
+
ba_event.supported_markets.map(sm => {
|
|
438
|
+
if (sm.available_orders) {
|
|
439
|
+
available_orders = available_orders.concat(sm.available_orders);
|
|
440
|
+
}
|
|
441
|
+
if (sm.order_stats) {
|
|
442
|
+
event_order_stats = event_order_stats.concat(sm.order_stats);
|
|
443
|
+
}
|
|
444
|
+
if (sm.latest_trades) {
|
|
445
|
+
latest_trades = latest_trades.concat(sm.latest_trades);
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
ba.tournaments.map(ba_event => {
|
|
450
|
+
if (!ba_event.supported_markets) {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
updated = true;
|
|
454
|
+
ba_event.supported_markets.map(sm => {
|
|
455
|
+
if (sm.available_orders) {
|
|
456
|
+
available_orders = available_orders.concat(sm.available_orders);
|
|
457
|
+
}
|
|
458
|
+
if (sm.order_stats) {
|
|
459
|
+
event_order_stats = event_order_stats.concat(sm.order_stats);
|
|
460
|
+
}
|
|
461
|
+
if (sm.latest_trades) {
|
|
462
|
+
latest_trades = latest_trades.concat(sm.latest_trades);
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
ba.matches.map(ba_event => {
|
|
467
|
+
if (!ba_event.supported_markets) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
updated = true;
|
|
471
|
+
ba_event.supported_markets.map(sm => {
|
|
472
|
+
if (sm.available_orders) {
|
|
473
|
+
available_orders = available_orders.concat(sm.available_orders);
|
|
474
|
+
}
|
|
475
|
+
if (sm.order_stats) {
|
|
476
|
+
event_order_stats = event_order_stats.concat(sm.order_stats);
|
|
477
|
+
}
|
|
478
|
+
if (sm.latest_trades) {
|
|
479
|
+
latest_trades = latest_trades.concat(sm.latest_trades);
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
return {
|
|
484
|
+
updated,
|
|
485
|
+
event_order_stats,
|
|
486
|
+
available_orders,
|
|
487
|
+
latest_trades
|
|
488
|
+
};
|
|
489
|
+
},
|
|
490
|
+
getSideMarketData: (orders, best_available_orders, trades, market, side_type, side_id) => {
|
|
491
|
+
console.log(side_type, side_id);
|
|
492
|
+
let trade_side_orders = orders.filter(o => o.side == market.trade_side);
|
|
493
|
+
let o_side_orders = orders.filter(o => o.side != market.trade_side);
|
|
494
|
+
let trade_side_ba = best_available_orders.find(o => o.side == market.trade_side);
|
|
495
|
+
let o_side_ba = best_available_orders.find(o => o.side != market.trade_side);
|
|
496
|
+
let trade_side_trades = trades.filter(t => t.side == market.trade_side);
|
|
497
|
+
let o_side_trades = trades.filter(t => t.side != market.trade_side);
|
|
498
|
+
const o_side = market.side_options.find(so => so.side != market.trade_side)?.side;
|
|
499
|
+
return {
|
|
500
|
+
trade_side: market.trade_side,
|
|
501
|
+
o_side,
|
|
502
|
+
trade_side_orders,
|
|
503
|
+
o_side_orders,
|
|
504
|
+
trade_side_ba,
|
|
505
|
+
o_side_ba,
|
|
506
|
+
trade_side_trades,
|
|
507
|
+
o_side_trades
|
|
508
|
+
};
|
|
509
|
+
},
|
|
510
|
+
getOrderColor: order => {
|
|
511
|
+
if (!order.grade) {
|
|
512
|
+
return _colors.default.shades.shade600;
|
|
513
|
+
}
|
|
514
|
+
if (order.grade > 98) {
|
|
515
|
+
return _colors.default.highlights.highlight400Faded;
|
|
516
|
+
}
|
|
517
|
+
return _colors.default.highlights.highlight300Faded;
|
|
518
|
+
},
|
|
519
|
+
getOrderFromTrade: (trade, unit_size, ba_order_id) => {
|
|
520
|
+
let open_amt = 10;
|
|
521
|
+
if (unit_size) {
|
|
522
|
+
open_amt = unit_size;
|
|
523
|
+
}
|
|
524
|
+
let draft_liquidity = 0;
|
|
525
|
+
if (trade.draft_liquidity) {
|
|
526
|
+
draft_liquidity = trade.draft_liquidity;
|
|
527
|
+
}
|
|
528
|
+
return {
|
|
529
|
+
order_id: '',
|
|
530
|
+
player_id: '',
|
|
531
|
+
be_type: 'market',
|
|
532
|
+
//TODO - Make this dynamic,
|
|
533
|
+
open_amt,
|
|
534
|
+
called_amt: 0,
|
|
535
|
+
buy_sell_ind: 'buy',
|
|
536
|
+
rejections: 0,
|
|
537
|
+
commission_pct: 0,
|
|
538
|
+
available_for_parlays: false,
|
|
539
|
+
event_id: trade.event_id,
|
|
540
|
+
draft_liquidity,
|
|
541
|
+
event_type: trade.event_type,
|
|
542
|
+
side: trade.side,
|
|
543
|
+
side_type: trade.side_type,
|
|
544
|
+
resolution_status: 'inprogress',
|
|
545
|
+
side_id: trade.side_id,
|
|
546
|
+
order_type: trade.limit_override ? 'limit' : 'market',
|
|
547
|
+
potential_winnings: 0,
|
|
548
|
+
collar_pct: .01,
|
|
549
|
+
positions: [],
|
|
550
|
+
market_id: trade.market_id,
|
|
551
|
+
title: '',
|
|
552
|
+
probability: trade.probability,
|
|
553
|
+
odds: trade.odds,
|
|
554
|
+
var_1: trade.var_1,
|
|
555
|
+
market_type: trade.market_type,
|
|
556
|
+
position_ids: [],
|
|
557
|
+
status: 'approved',
|
|
558
|
+
expire_datetime: (0, _momentMini.default)().add(1, 'hours'),
|
|
559
|
+
reference_order_id: ba_order_id
|
|
560
|
+
};
|
|
561
|
+
},
|
|
562
|
+
getTeamEventSideIds: (event, market, side_option, athlete, team) => {
|
|
563
|
+
const o_side = market.side_options.find(so => so.side != side_option.side);
|
|
564
|
+
if (!o_side) {
|
|
565
|
+
return undefined;
|
|
566
|
+
}
|
|
567
|
+
switch (side_option.id_source) {
|
|
568
|
+
case 'side':
|
|
569
|
+
return {
|
|
570
|
+
side_id: side_option.side,
|
|
571
|
+
reversed_side_id: o_side.side
|
|
572
|
+
};
|
|
573
|
+
case 'athlete':
|
|
574
|
+
if (!athlete) {
|
|
575
|
+
return undefined;
|
|
576
|
+
}
|
|
577
|
+
return {
|
|
578
|
+
side_id: athlete.athlete_id,
|
|
579
|
+
reversed_side_id: athlete.athlete_id
|
|
580
|
+
};
|
|
581
|
+
case 'team':
|
|
582
|
+
if (market.level == 'event') {
|
|
583
|
+
let side_id = event[side_option.side]?.team_id;
|
|
584
|
+
let reversed_side_id = event[o_side.side]?.team_id;
|
|
585
|
+
if (!side_id || !reversed_side_id) {
|
|
586
|
+
return undefined;
|
|
587
|
+
}
|
|
588
|
+
return {
|
|
589
|
+
side_id,
|
|
590
|
+
reversed_side_id
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
if (market.level == 'team') {
|
|
594
|
+
if (!team) {
|
|
595
|
+
return undefined;
|
|
596
|
+
}
|
|
597
|
+
return {
|
|
598
|
+
side_id: team.team_id,
|
|
599
|
+
reversed_side_id: team.team_id
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
return undefined;
|
|
603
|
+
default:
|
|
604
|
+
return undefined;
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
getTournamentSideIds: (market, side_option, athlete, team) => {
|
|
608
|
+
const o_side = market.side_options.find(so => so.side != side_option.side);
|
|
609
|
+
if (!o_side) {
|
|
610
|
+
return undefined;
|
|
611
|
+
}
|
|
612
|
+
switch (side_option.id_source) {
|
|
613
|
+
case 'side':
|
|
614
|
+
return {
|
|
615
|
+
side_id: side_option.side,
|
|
616
|
+
reversed_side_id: o_side.side
|
|
617
|
+
};
|
|
618
|
+
case 'athlete':
|
|
619
|
+
if (!athlete) {
|
|
620
|
+
return undefined;
|
|
621
|
+
}
|
|
622
|
+
return {
|
|
623
|
+
side_id: athlete.athlete_id,
|
|
624
|
+
reversed_side_id: athlete.athlete_id
|
|
625
|
+
};
|
|
626
|
+
case 'team':
|
|
627
|
+
if (market.level == 'team') {
|
|
628
|
+
if (!team) {
|
|
629
|
+
return undefined;
|
|
630
|
+
}
|
|
631
|
+
return {
|
|
632
|
+
side_id: team.team_id,
|
|
633
|
+
reversed_side_id: team.team_id
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
return undefined;
|
|
637
|
+
default:
|
|
638
|
+
return undefined;
|
|
639
|
+
}
|
|
640
|
+
},
|
|
641
|
+
getTradeFromAvailableOrder: (ba, reversed_side_id) => {
|
|
642
|
+
return {
|
|
643
|
+
trade_id: '',
|
|
644
|
+
event_id: ba.event_id,
|
|
645
|
+
event_type: ba.event_type,
|
|
646
|
+
cumulative_amt: 0,
|
|
647
|
+
trade_amt: 0,
|
|
648
|
+
create_datetime: '',
|
|
649
|
+
last_update_datetime: '',
|
|
650
|
+
market_id: ba.market_id,
|
|
651
|
+
var_1: ba.var_1,
|
|
652
|
+
side: ba.side,
|
|
653
|
+
side_id: ba.side_id,
|
|
654
|
+
draft_liquidity: ba.open_amt,
|
|
655
|
+
reversed_side_id,
|
|
656
|
+
probability: ba.probability,
|
|
657
|
+
odds: ba.odds,
|
|
658
|
+
side_type: ba.side_type,
|
|
659
|
+
market_type: 'FOR_MONEY',
|
|
660
|
+
latest: true,
|
|
661
|
+
position_ids: []
|
|
662
|
+
};
|
|
663
|
+
},
|
|
664
|
+
reverseBAOrder: (order, market, side_id) => {
|
|
665
|
+
const side_option = market.side_options.find(so => so.side != order.side);
|
|
666
|
+
if (!side_option) {
|
|
667
|
+
return undefined;
|
|
668
|
+
}
|
|
669
|
+
return {
|
|
670
|
+
...order,
|
|
671
|
+
side: side_option.side,
|
|
672
|
+
side_id: side_id,
|
|
673
|
+
odds: order.odds * -1,
|
|
674
|
+
var_1: market.type == 'Spread' ? order.var_1 * -1 : order.var_1,
|
|
675
|
+
probability: 1 - order.probability,
|
|
676
|
+
title: '',
|
|
677
|
+
open_amt: 0,
|
|
678
|
+
called_amt: 0,
|
|
679
|
+
potential_winnings: 0
|
|
680
|
+
};
|
|
681
|
+
},
|
|
682
|
+
getTradeFromPrice: (price, reversed_side_id) => {
|
|
683
|
+
return {
|
|
684
|
+
trade_id: '',
|
|
685
|
+
event_type: price.event_type,
|
|
686
|
+
trade_amt: 0,
|
|
687
|
+
side_type: price.participant_type,
|
|
688
|
+
cumulative_amt: 0,
|
|
689
|
+
side: price.side,
|
|
690
|
+
odds: price.odds,
|
|
691
|
+
reversed_side_id: reversed_side_id,
|
|
692
|
+
probability: price.probability,
|
|
693
|
+
side_id: price.participant_id,
|
|
694
|
+
position_ids: [],
|
|
695
|
+
market_type: 'FOR_MONEY',
|
|
696
|
+
market_id: price.market_id,
|
|
697
|
+
event_id: price.event_id,
|
|
698
|
+
var_1: price.var_1,
|
|
699
|
+
latest: true,
|
|
700
|
+
create_datetime: '',
|
|
701
|
+
last_update_datetime: ''
|
|
702
|
+
};
|
|
703
|
+
},
|
|
704
|
+
getVisibleTrade: (default_price_view, market, side_option, latest_trades, best_available_orders, side_id, reversed_side_id) => {
|
|
705
|
+
const order = best_available_orders.find(o => o.market_id == market.market_id && o.side == side_option.side && o.show);
|
|
706
|
+
const o_side_order = best_available_orders.find(o => o.market_id == market.market_id && o.side != side_option.side && o.show);
|
|
707
|
+
let trade = latest_trades.find(t => t.market_type == 'FOR_MONEY' && t.market_id == market.market_id && t.side == side_option.side);
|
|
708
|
+
switch (default_price_view) {
|
|
709
|
+
case 'best_available':
|
|
710
|
+
if (order) {
|
|
711
|
+
return MarketMaketHelpers.getTradeFromAvailableOrder(order, reversed_side_id);
|
|
712
|
+
}
|
|
713
|
+
if (o_side_order) {
|
|
714
|
+
//Now lets reverse this order and get a trade for it
|
|
715
|
+
const reversed_order = MarketMaketHelpers.reverseBAOrder(o_side_order, market, side_id);
|
|
716
|
+
if (!reversed_order) {
|
|
717
|
+
return undefined;
|
|
718
|
+
}
|
|
719
|
+
return MarketMaketHelpers.getTradeFromAvailableOrder(reversed_order, reversed_side_id);
|
|
720
|
+
}
|
|
721
|
+
if (trade) {
|
|
722
|
+
return trade;
|
|
723
|
+
}
|
|
724
|
+
return undefined;
|
|
725
|
+
case 'last_trade':
|
|
726
|
+
if (trade) {
|
|
727
|
+
return trade;
|
|
728
|
+
}
|
|
729
|
+
return undefined;
|
|
730
|
+
default:
|
|
731
|
+
return undefined;
|
|
732
|
+
}
|
|
733
|
+
},
|
|
734
|
+
getHedgesFromPositions: (orders, markets) => {
|
|
735
|
+
//1) Set up arrays to store hedges
|
|
736
|
+
let hedges = [];
|
|
737
|
+
let hedgeable_positions = [];
|
|
738
|
+
//Only allow real money orders for hedging
|
|
739
|
+
orders = orders.filter(o => o.market_type === 'FOR_MONEY' && o.resolution_status !== 'closed');
|
|
740
|
+
|
|
741
|
+
//2) Get the unique markets (and common var_1s) that are eligible to be hedged
|
|
742
|
+
let orders_with_positions = orders.filter(o => o.positions[0]);
|
|
743
|
+
let unique_markets = [...new Set(orders_with_positions.map(o => `${o.event_id}:${o.event_type}:${o.market_id}:${Math.abs(o.var_1)}`))];
|
|
744
|
+
|
|
745
|
+
//3) For each unique market and var_1 combo, determin if there are positions on the opposite side of each other
|
|
746
|
+
//If so, then store them into an array of orders
|
|
747
|
+
unique_markets.map(id => {
|
|
748
|
+
//1) Get orders that are associated with the market
|
|
749
|
+
let market_orders = orders_with_positions.filter(o => `${o.event_id}:${o.event_type}:${o.market_id}:${Math.abs(o.var_1)}` == id);
|
|
750
|
+
if (market_orders.length < 2) {
|
|
751
|
+
return;
|
|
752
|
+
} //Impossible to hedge with less than 2 orders
|
|
753
|
+
let unique_sides = [...new Set(market_orders.map(o => o.side))];
|
|
754
|
+
if (unique_sides.length < 0) {
|
|
755
|
+
return;
|
|
756
|
+
} //Must have more than 1 side
|
|
757
|
+
|
|
758
|
+
hedgeable_positions.push(market_orders);
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
//Return nothing if there are no hedgeable positions
|
|
762
|
+
if (hedgeable_positions.length === 0) {
|
|
763
|
+
return [];
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
//Awesome! We have some hedgeable positions
|
|
767
|
+
hedgeable_positions.map(hp => {
|
|
768
|
+
if (!hp[0]) {
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
//Get an empty hedge object to store our hedges
|
|
772
|
+
let hedge = MarketMaketHelpers.getEmptyHedge();
|
|
773
|
+
let market = markets.find(m => m.market_id == hp[0]?.market_id);
|
|
774
|
+
if (!market) {
|
|
775
|
+
return;
|
|
776
|
+
} //Error out if there is no market
|
|
777
|
+
if (market.level !== 'event') {
|
|
778
|
+
return;
|
|
779
|
+
} //Dont if level is not event
|
|
780
|
+
|
|
781
|
+
let trade_side_orders = hp.filter(o => o.side == market?.trade_side);
|
|
782
|
+
let o_side_orders = hp.filter(o => o.side != market?.trade_side);
|
|
783
|
+
|
|
784
|
+
//New
|
|
785
|
+
if (market.type == 'Spread') {
|
|
786
|
+
if (!trade_side_orders[0]) {
|
|
787
|
+
return;
|
|
788
|
+
} //Make sure there is at least 1 trade side order
|
|
789
|
+
let trade_side_o = trade_side_orders[0];
|
|
790
|
+
if (!trade_side_o) {
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
o_side_orders = o_side_orders.filter(o => o.var_1 == trade_side_o.var_1 * -1);
|
|
794
|
+
}
|
|
795
|
+
if (trade_side_orders.length === 0 || o_side_orders.length === 0) {
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
hedge.market_id = market.market_id;
|
|
799
|
+
hedge.market_type = hp[0].market_type;
|
|
800
|
+
hedge.var_1 = Math.abs(hp[0].var_1);
|
|
801
|
+
hedge.player_id = hp[0].player_id;
|
|
802
|
+
hedge.event_id = hp[0].event_id;
|
|
803
|
+
hedge.event_type = hp[0].event_type;
|
|
804
|
+
hedge.market_id = hp[0].market_id;
|
|
805
|
+
|
|
806
|
+
//Set up arrays to store the positions on each side of the hedge
|
|
807
|
+
let trade_side_positions = [];
|
|
808
|
+
let o_side_positions = [];
|
|
809
|
+
trade_side_orders.map(o => {
|
|
810
|
+
trade_side_positions = trade_side_positions.concat(o.positions);
|
|
811
|
+
});
|
|
812
|
+
o_side_orders.map(o => {
|
|
813
|
+
o_side_positions = o_side_positions.concat(o.positions);
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
//Calculate the winnings from each outcome (side a wins, side b wins, or draw)
|
|
817
|
+
let trade_side_pot_winnings = trade_side_positions.reduce((a, b) => a + b.potential_winnings, 0);
|
|
818
|
+
let o_side_pot_winnings = o_side_positions.reduce((a, b) => a + b.potential_winnings, 0);
|
|
819
|
+
let draw_winnings = trade_side_positions.concat(o_side_positions).reduce((a, b) => a + b.stake, 0);
|
|
820
|
+
|
|
821
|
+
//Get the minimum payout possible of the 3 outcomes which is the hedged amount
|
|
822
|
+
let hedged_amt = Math.min(trade_side_pot_winnings, o_side_pot_winnings);
|
|
823
|
+
if (isNaN(hedged_amt)) {
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
hedge.hedged_amt = hedged_amt;
|
|
827
|
+
|
|
828
|
+
//Now lets cals out hedged positions
|
|
829
|
+
let hedged_positions = [];
|
|
830
|
+
trade_side_positions.map(p => {
|
|
831
|
+
//Need to determine the weight of the position on the total potential winnings and reduce the stake proportionately
|
|
832
|
+
let pct = p.potential_winnings / trade_side_pot_winnings;
|
|
833
|
+
//console.log(hedged_amt, pct, p.probability)
|
|
834
|
+
let stake_from_hedge = hedged_amt * pct * p.probability;
|
|
835
|
+
hedge.stake_reduction += stake_from_hedge;
|
|
836
|
+
let new_stake = p.stake - stake_from_hedge;
|
|
837
|
+
hedged_positions.push({
|
|
838
|
+
hedge_id: '',
|
|
839
|
+
hedged_position_id: '',
|
|
840
|
+
position_id: p.position_id,
|
|
841
|
+
original_stake: p.stake,
|
|
842
|
+
new_stake,
|
|
843
|
+
delayed_cash_draw: 0,
|
|
844
|
+
delayed_cash_no_draw: 0,
|
|
845
|
+
original_potential_winnings: p.potential_winnings,
|
|
846
|
+
new_potential_winnings: new_stake / p.probability,
|
|
847
|
+
status: 'pending',
|
|
848
|
+
create_datetime: '',
|
|
849
|
+
last_update_datetime: ''
|
|
850
|
+
});
|
|
851
|
+
});
|
|
852
|
+
o_side_positions.map(p => {
|
|
853
|
+
let pct = p.potential_winnings / o_side_pot_winnings;
|
|
854
|
+
let stake_from_hedge = hedged_amt * pct * p.probability;
|
|
855
|
+
hedge.stake_reduction += stake_from_hedge;
|
|
856
|
+
let new_stake = p.stake - stake_from_hedge;
|
|
857
|
+
hedged_positions.push({
|
|
858
|
+
hedge_id: '',
|
|
859
|
+
hedged_position_id: '',
|
|
860
|
+
position_id: p.position_id,
|
|
861
|
+
original_stake: p.stake,
|
|
862
|
+
new_stake,
|
|
863
|
+
delayed_cash_draw: 0,
|
|
864
|
+
delayed_cash_no_draw: 0,
|
|
865
|
+
original_potential_winnings: p.potential_winnings,
|
|
866
|
+
new_potential_winnings: new_stake / p.probability,
|
|
867
|
+
status: 'pending',
|
|
868
|
+
create_datetime: '',
|
|
869
|
+
last_update_datetime: ''
|
|
870
|
+
});
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
//Cash rcvd will be the lower of the hedged amount or the reduction in stake
|
|
874
|
+
let cash_rcvd = Math.min(hedge.stake_reduction, hedged_amt, draw_winnings);
|
|
875
|
+
if (isNaN(cash_rcvd) || cash_rcvd < 0.01) {
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
878
|
+
hedge.cash_rcvd = cash_rcvd;
|
|
879
|
+
let delayed_cash = hedged_amt - hedge.stake_reduction;
|
|
880
|
+
let total_og_stake = hedged_positions.reduce((a, b) => a + b.original_stake, 0);
|
|
881
|
+
let delayed_cash_draw = 0,
|
|
882
|
+
delayed_cash_no_draw = 0;
|
|
883
|
+
if (delayed_cash < 0) {
|
|
884
|
+
delayed_cash_draw = delayed_cash * -1;
|
|
885
|
+
//hedge.delayed_cash_draw = delayed_cash * -1 //Need to make positive
|
|
886
|
+
} else {
|
|
887
|
+
delayed_cash_no_draw = delayed_cash;
|
|
888
|
+
//hedge.delayed_cash_no_draw = delayed_cash
|
|
889
|
+
}
|
|
890
|
+
hedge.delayed_cash_draw = delayed_cash_draw;
|
|
891
|
+
hedge.delayed_cash_no_draw = delayed_cash_no_draw;
|
|
892
|
+
hedged_positions.map(hp => {
|
|
893
|
+
let pct_of_total = hp.original_stake / total_og_stake;
|
|
894
|
+
hp.delayed_cash_draw = pct_of_total * delayed_cash_draw;
|
|
895
|
+
hp.delayed_cash_no_draw = pct_of_total * delayed_cash_no_draw;
|
|
896
|
+
return hp;
|
|
897
|
+
});
|
|
898
|
+
hedges.push({
|
|
899
|
+
...hedge,
|
|
900
|
+
hedged_positions: hedged_positions
|
|
901
|
+
});
|
|
902
|
+
});
|
|
903
|
+
return hedges;
|
|
904
|
+
},
|
|
905
|
+
getEmptyHedge: () => {
|
|
906
|
+
return {
|
|
907
|
+
hedge_id: '',
|
|
908
|
+
hedged_amt: 0,
|
|
909
|
+
event_id: '',
|
|
910
|
+
event_type: '',
|
|
911
|
+
market_id: '',
|
|
912
|
+
var_1: 0,
|
|
913
|
+
delayed_cash_draw: 0,
|
|
914
|
+
delayed_cash_no_draw: 0,
|
|
915
|
+
cash_rcvd: 0,
|
|
916
|
+
stake_reduction: 0,
|
|
917
|
+
market_type: 'FOR_MONEY',
|
|
918
|
+
create_datetime: '',
|
|
919
|
+
last_udpate_datetime: '',
|
|
920
|
+
player_id: '',
|
|
921
|
+
status: 'pending'
|
|
922
|
+
};
|
|
923
|
+
},
|
|
924
|
+
getVar1Label: (market, var_1, side) => {
|
|
925
|
+
if (side == 'over') {
|
|
926
|
+
return `O ${var_1}`;
|
|
927
|
+
}
|
|
928
|
+
if (side == 'under') {
|
|
929
|
+
return `U ${var_1}`;
|
|
930
|
+
}
|
|
931
|
+
if (market.type != 'Spread') {
|
|
932
|
+
return `${var_1}`;
|
|
933
|
+
}
|
|
934
|
+
if (var_1 < 0) {
|
|
935
|
+
return `${var_1}`;
|
|
936
|
+
}
|
|
937
|
+
return `+${var_1}`;
|
|
938
|
+
},
|
|
939
|
+
getOddsLabel: (odds, decimals) => {
|
|
940
|
+
let new_odds = odds.toFixed();
|
|
941
|
+
if (decimals) {
|
|
942
|
+
new_odds = odds.toFixed(decimals);
|
|
943
|
+
}
|
|
944
|
+
if (odds < 0) {
|
|
945
|
+
return `${new_odds}`;
|
|
946
|
+
}
|
|
947
|
+
return `+${new_odds}`;
|
|
948
|
+
},
|
|
949
|
+
getOrderTitleForTeamEvent: (order, market, event, athlete, exotic) => {
|
|
950
|
+
let market_side = market.side_options.find(o => o.side == order.side);
|
|
951
|
+
if (!market_side) {
|
|
952
|
+
return undefined;
|
|
953
|
+
}
|
|
954
|
+
var re = /({.*?})/;
|
|
955
|
+
let parsed_text = market_side.parseable_title.split(re);
|
|
956
|
+
let new_title = '';
|
|
957
|
+
parsed_text.map(t => {
|
|
958
|
+
if (t === '') {
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
if (t[0] !== '{') {
|
|
962
|
+
return new_title += t;
|
|
963
|
+
}
|
|
964
|
+
let variable = t.slice(1);
|
|
965
|
+
variable = variable.slice(0, variable.length - 1);
|
|
966
|
+
switch (variable) {
|
|
967
|
+
case 'team':
|
|
968
|
+
let team = event[order.side];
|
|
969
|
+
return new_title += team.market_name;
|
|
970
|
+
case 'var_1':
|
|
971
|
+
return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1);
|
|
972
|
+
case 'athlete':
|
|
973
|
+
return new_title += athlete?.abbr_name;
|
|
974
|
+
case 'stat':
|
|
975
|
+
return new_title += market.stat_label ?? market.stat;
|
|
976
|
+
case 'exotic':
|
|
977
|
+
return new_title += exotic?.name;
|
|
978
|
+
default:
|
|
979
|
+
return;
|
|
980
|
+
}
|
|
981
|
+
});
|
|
982
|
+
return new_title;
|
|
983
|
+
},
|
|
984
|
+
getOrderTitleForTournament: (order, market, tournament, athlete, team) => {
|
|
985
|
+
if (!tournament) {
|
|
986
|
+
return undefined;
|
|
987
|
+
}
|
|
988
|
+
let market_side = market.side_options.find(o => o.side == order.side);
|
|
989
|
+
if (!market_side) {
|
|
990
|
+
return order.side;
|
|
991
|
+
}
|
|
992
|
+
var re = /({.*?})/;
|
|
993
|
+
let parsed_text = market_side.parseable_title.split(re);
|
|
994
|
+
let new_title = '';
|
|
995
|
+
parsed_text.map(t => {
|
|
996
|
+
if (t === '') {
|
|
997
|
+
return;
|
|
998
|
+
}
|
|
999
|
+
if (t[0] !== '{') {
|
|
1000
|
+
return new_title += t;
|
|
1001
|
+
}
|
|
1002
|
+
let variable = t.slice(1);
|
|
1003
|
+
variable = variable.slice(0, variable.length - 1);
|
|
1004
|
+
switch (variable) {
|
|
1005
|
+
case 'team':
|
|
1006
|
+
return new_title += `${team?.market_name} ${team?.name}`;
|
|
1007
|
+
case 'var_1':
|
|
1008
|
+
return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1);
|
|
1009
|
+
case 'athlete':
|
|
1010
|
+
return new_title += athlete?.abbr_name;
|
|
1011
|
+
case 'stat':
|
|
1012
|
+
return new_title += market.stat;
|
|
1013
|
+
default:
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
1016
|
+
});
|
|
1017
|
+
return new_title;
|
|
1018
|
+
},
|
|
1019
|
+
getOrderTitleForMatch: (order, market, match, athlete, team) => {
|
|
1020
|
+
if (!match) {
|
|
1021
|
+
return undefined;
|
|
1022
|
+
}
|
|
1023
|
+
let market_side = market.side_options.find(o => o.side == order.side);
|
|
1024
|
+
if (!market_side) {
|
|
1025
|
+
return order.side;
|
|
1026
|
+
}
|
|
1027
|
+
var re = /({.*?})/;
|
|
1028
|
+
let parsed_text = market_side.parseable_title.split(re);
|
|
1029
|
+
let new_title = '';
|
|
1030
|
+
parsed_text.map(t => {
|
|
1031
|
+
if (t === '') {
|
|
1032
|
+
return;
|
|
1033
|
+
}
|
|
1034
|
+
if (t[0] !== '{') {
|
|
1035
|
+
return new_title += t;
|
|
1036
|
+
}
|
|
1037
|
+
let variable = t.slice(1);
|
|
1038
|
+
variable = variable.slice(0, variable.length - 1);
|
|
1039
|
+
switch (variable) {
|
|
1040
|
+
case 'team':
|
|
1041
|
+
return new_title += `${team?.market_name} ${team?.name}`;
|
|
1042
|
+
case 'var_1':
|
|
1043
|
+
return new_title += MarketMaketHelpers.getVar1Label(market, order.var_1);
|
|
1044
|
+
case 'athlete':
|
|
1045
|
+
return new_title += athlete?.abbr_name;
|
|
1046
|
+
case 'stat':
|
|
1047
|
+
return new_title += market.stat;
|
|
1048
|
+
default:
|
|
1049
|
+
return;
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
return new_title;
|
|
1053
|
+
},
|
|
1054
|
+
setMarkets: (fund, best_available, external_prices, market, margin, event) => {
|
|
1055
|
+
let orders = [];
|
|
1056
|
+
market.side_options.map(so => {
|
|
1057
|
+
let side_id_response = MarketMaketHelpers.getTeamEventSideIds(event, market, so);
|
|
1058
|
+
if (!side_id_response) {
|
|
1059
|
+
return;
|
|
1060
|
+
}
|
|
1061
|
+
let ba = best_available.find(ba => ba.side == so.side);
|
|
1062
|
+
let o_ba = best_available.find(ba => ba.side != so.side);
|
|
1063
|
+
if (ba && o_ba) {
|
|
1064
|
+
let ba_trade = MarketMaketHelpers.getTradeFromAvailableOrder(ba, side_id_response.reversed_side_id);
|
|
1065
|
+
let ba_order = MarketMaketHelpers.getOrderFromTrade(ba_trade, 10, ba.order_id);
|
|
1066
|
+
let ba_title = MarketMaketHelpers.getOrderTitleForTeamEvent(ba_order, market, event);
|
|
1067
|
+
if (!ba_title) {
|
|
1068
|
+
return;
|
|
1069
|
+
}
|
|
1070
|
+
return orders.push({
|
|
1071
|
+
...ba_order,
|
|
1072
|
+
title: ba_title
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
let ep = external_prices.find(p => p.side == so.side);
|
|
1076
|
+
let o_ep = external_prices.find(p => p.side != so.side);
|
|
1077
|
+
if (ep && o_ep) {
|
|
1078
|
+
let ep_trade = MarketMaketHelpers.getTradeFromPrice(ep, side_id_response.reversed_side_id);
|
|
1079
|
+
let ep_order = MarketMaketHelpers.getOrderFromTrade(ep_trade, 10);
|
|
1080
|
+
let ep_title = MarketMaketHelpers.getOrderTitleForTeamEvent(ep_order, market, event);
|
|
1081
|
+
if (!ep_title) {
|
|
1082
|
+
return;
|
|
1083
|
+
}
|
|
1084
|
+
return orders.push({
|
|
1085
|
+
...ep_order,
|
|
1086
|
+
title: ep_title
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
return;
|
|
1090
|
+
});
|
|
1091
|
+
if (orders.length != 2) {
|
|
1092
|
+
return [];
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
//OK!! Lets figured out the buffer odds!
|
|
1096
|
+
let no_vig_trade_price = .5;
|
|
1097
|
+
let no_vig_o_price = .5;
|
|
1098
|
+
let no_vig_data = MarketMaketHelpers.getNoVigPrice(external_prices, market);
|
|
1099
|
+
if (no_vig_data) {
|
|
1100
|
+
no_vig_o_price = no_vig_data.o_side_prob;
|
|
1101
|
+
no_vig_trade_price = no_vig_data.trade_side_prob;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
//Now lets add a buffer to each one based on the margin provided!
|
|
1105
|
+
no_vig_trade_price -= margin * 0.5;
|
|
1106
|
+
let novig_trade_side_odds = Math.round(MarketMaketHelpers.calcAmericanOddsFromProbability(no_vig_trade_price));
|
|
1107
|
+
no_vig_o_price -= margin * 0.5;
|
|
1108
|
+
let novig_o_side_odds = Math.round(MarketMaketHelpers.calcAmericanOddsFromProbability(no_vig_o_price));
|
|
1109
|
+
|
|
1110
|
+
//OK!!! Now lets add the propbabilities to the orders!
|
|
1111
|
+
let trade_side_order = orders.find(o => o.side == market.trade_side);
|
|
1112
|
+
let o_side_order = orders.find(o => o.side != market.trade_side);
|
|
1113
|
+
if (!trade_side_order || !o_side_order) {
|
|
1114
|
+
return [];
|
|
1115
|
+
}
|
|
1116
|
+
let higher_probability_order = no_vig_trade_price >= no_vig_o_price ? 'trade' : 'other';
|
|
1117
|
+
let trade_side_stake = 0,
|
|
1118
|
+
o_side_stake = 0;
|
|
1119
|
+
if (higher_probability_order == 'trade') {
|
|
1120
|
+
console.log('min was trade side');
|
|
1121
|
+
trade_side_stake = fund.working_capital;
|
|
1122
|
+
//If that is the stake, then the potential winnigns is
|
|
1123
|
+
let pot_win = MarketMaketHelpers.calcPotentialWinnings(trade_side_stake, novig_trade_side_odds);
|
|
1124
|
+
o_side_stake = MarketMaketHelpers.calcSaleValue(novig_o_side_odds, pot_win);
|
|
1125
|
+
} else {
|
|
1126
|
+
console.log('min was o side!!');
|
|
1127
|
+
o_side_stake = fund.working_capital;
|
|
1128
|
+
//If that is the stake, then the potential winnigns is
|
|
1129
|
+
let pot_win = MarketMaketHelpers.calcPotentialWinnings(o_side_stake, novig_o_side_odds);
|
|
1130
|
+
trade_side_stake = MarketMaketHelpers.calcSaleValue(novig_trade_side_odds, pot_win);
|
|
1131
|
+
}
|
|
1132
|
+
let o_side_working = o_side_stake / fund.working_capital;
|
|
1133
|
+
let t_side_working = trade_side_stake / fund.working_capital;
|
|
1134
|
+
o_side_order = {
|
|
1135
|
+
...o_side_order,
|
|
1136
|
+
probability: no_vig_o_price,
|
|
1137
|
+
odds: novig_o_side_odds,
|
|
1138
|
+
fulfill_action: 'drain',
|
|
1139
|
+
working_pct: o_side_working,
|
|
1140
|
+
potential_winnings: MarketMaketHelpers.calcPotentialWinnings(o_side_stake, novig_o_side_odds),
|
|
1141
|
+
open_amt: o_side_stake
|
|
1142
|
+
};
|
|
1143
|
+
trade_side_order = {
|
|
1144
|
+
...trade_side_order,
|
|
1145
|
+
probability: no_vig_trade_price,
|
|
1146
|
+
odds: novig_trade_side_odds,
|
|
1147
|
+
fulfill_action: 'drain',
|
|
1148
|
+
working_pct: t_side_working,
|
|
1149
|
+
potential_winnings: MarketMaketHelpers.calcPotentialWinnings(trade_side_stake, novig_trade_side_odds),
|
|
1150
|
+
open_amt: trade_side_stake
|
|
1151
|
+
};
|
|
1152
|
+
return [o_side_order, trade_side_order];
|
|
1153
|
+
},
|
|
1154
|
+
calcSaleValue: (odds, potential_winnings) => {
|
|
1155
|
+
potential_winnings = parseInt(potential_winnings);
|
|
1156
|
+
if (isNaN(potential_winnings)) {
|
|
1157
|
+
return 0;
|
|
1158
|
+
}
|
|
1159
|
+
let cash;
|
|
1160
|
+
if (odds > 0) {
|
|
1161
|
+
var earningsMultiplyer = odds / 100 + 1;
|
|
1162
|
+
cash = potential_winnings / earningsMultiplyer;
|
|
1163
|
+
} else {
|
|
1164
|
+
var earningsMultiplyer = 100 / Math.abs(odds) + 1;
|
|
1165
|
+
cash = potential_winnings / earningsMultiplyer;
|
|
1166
|
+
}
|
|
1167
|
+
return cash;
|
|
1168
|
+
},
|
|
1169
|
+
getNoVigPrice: (prices, market) => {
|
|
1170
|
+
if (!prices || prices.length != 2) {
|
|
1171
|
+
return undefined;
|
|
1172
|
+
}
|
|
1173
|
+
let external_name = prices[0]?.external_name;
|
|
1174
|
+
if (!external_name) {
|
|
1175
|
+
return undefined;
|
|
1176
|
+
}
|
|
1177
|
+
let total_probability = prices.reduce((a, b) => a + b.probability, 0);
|
|
1178
|
+
let vig_pct = total_probability - 1;
|
|
1179
|
+
let trade_side_prob = prices.find(p => p.side == market.trade_side)?.probability;
|
|
1180
|
+
let o_side_prob = prices.find(p => p.side != market.trade_side)?.probability;
|
|
1181
|
+
if (!trade_side_prob || !o_side_prob) {
|
|
1182
|
+
return undefined;
|
|
1183
|
+
}
|
|
1184
|
+
trade_side_prob -= vig_pct * 0.5;
|
|
1185
|
+
o_side_prob -= vig_pct * 0.5;
|
|
1186
|
+
let trade_side_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(trade_side_prob);
|
|
1187
|
+
let o_side_odds = MarketMaketHelpers.calcAmericanOddsFromProbability(o_side_prob);
|
|
1188
|
+
return {
|
|
1189
|
+
external_name,
|
|
1190
|
+
trade_side_prob,
|
|
1191
|
+
o_side_prob,
|
|
1192
|
+
trade_side_odds,
|
|
1193
|
+
o_side_odds
|
|
1194
|
+
};
|
|
1195
|
+
},
|
|
1196
|
+
getAvailableVar1s: (my_orders, available_orders, prices, market) => {
|
|
1197
|
+
let default_var_1 = 0;
|
|
1198
|
+
if (!market.var_1_required) {
|
|
1199
|
+
return {
|
|
1200
|
+
unique_var_1: [0],
|
|
1201
|
+
default_var_1
|
|
1202
|
+
};
|
|
1203
|
+
}
|
|
1204
|
+
let trade_side_my_orders = my_orders.filter(o => o.side == market.trade_side);
|
|
1205
|
+
let o_side_my_orders = my_orders.filter(o => o.side != market.trade_side);
|
|
1206
|
+
let trade_side_avail = available_orders.filter(o => o.side == market.trade_side);
|
|
1207
|
+
let o_side_avail = available_orders.filter(o => o.side != market.trade_side);
|
|
1208
|
+
let trade_side_prices = prices.filter(p => p.side == market.trade_side);
|
|
1209
|
+
let o_side_prices = prices.filter(p => p.side != market.trade_side);
|
|
1210
|
+
let trade_side_var_1 = trade_side_my_orders.map(o => o.var_1).concat(trade_side_avail.map(o => o.var_1)).concat(trade_side_prices.map(p => p.var_1));
|
|
1211
|
+
let o_side_var_1 = o_side_my_orders.map(o => o.var_1).concat(o_side_avail.map(a => a.var_1)).concat(o_side_prices.map(p => p.var_1));
|
|
1212
|
+
if (market.type == 'Spread') {
|
|
1213
|
+
o_side_var_1 = o_side_var_1.map(var_1 => var_1 * -1);
|
|
1214
|
+
}
|
|
1215
|
+
let all_var_1 = trade_side_var_1.concat(o_side_var_1);
|
|
1216
|
+
let unique_var_1 = [...new Set(all_var_1.map(var_1 => var_1))];
|
|
1217
|
+
|
|
1218
|
+
//Grade latest my order
|
|
1219
|
+
let my_order = my_orders.filter(o => o.status == 'approved').sort((a, b) => (0, _momentMini.default)(b.create_datetime).unix() - (0, _momentMini.default)(a.create_datetime).unix())[0];
|
|
1220
|
+
if (my_order) {
|
|
1221
|
+
default_var_1 = my_order.var_1;
|
|
1222
|
+
//Determin if we need to swap
|
|
1223
|
+
if (my_order.side != market.trade_side && market.type == 'Spread') {
|
|
1224
|
+
default_var_1 = default_var_1 * -1;
|
|
1225
|
+
}
|
|
1226
|
+
} else {
|
|
1227
|
+
let price = trade_side_prices[0];
|
|
1228
|
+
if (price) {
|
|
1229
|
+
default_var_1 = price.var_1;
|
|
1230
|
+
} else if (unique_var_1[0]) {
|
|
1231
|
+
default_var_1 = unique_var_1[0];
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
return {
|
|
1235
|
+
unique_var_1,
|
|
1236
|
+
default_var_1
|
|
1237
|
+
};
|
|
1238
|
+
},
|
|
1239
|
+
filterByVar1: (var_1, my_orders, available_orders, prices, market, backup_prices) => {
|
|
1240
|
+
let o_var_1 = market.type == 'Spread' ? var_1 * -1 : var_1;
|
|
1241
|
+
let trade_side_my_orders = my_orders.filter(o => o.side == market.trade_side && o.var_1 == var_1);
|
|
1242
|
+
let o_side_my_orders = my_orders.filter(o => o.side != market.trade_side && o.var_1 == o_var_1);
|
|
1243
|
+
let trade_side_avail = available_orders.filter(o => o.side == market.trade_side && o.var_1 == var_1);
|
|
1244
|
+
let o_side_avail = available_orders.filter(o => o.side != market.trade_side && o.var_1 == o_var_1);
|
|
1245
|
+
let trade_side_prices = prices.filter(p => p.side == market.trade_side && p.var_1 == var_1);
|
|
1246
|
+
let o_side_prices = prices.filter(p => p.side != market.trade_side && p.var_1 == o_var_1);
|
|
1247
|
+
if (trade_side_prices.length == 0 && backup_prices) {
|
|
1248
|
+
console.log('in here!!');
|
|
1249
|
+
trade_side_prices = backup_prices.filter(p => p.side == market.trade_side && p.var_1 == var_1);
|
|
1250
|
+
o_side_prices = backup_prices.filter(p => p.side != market.trade_side && p.var_1 == o_var_1);
|
|
1251
|
+
}
|
|
1252
|
+
return {
|
|
1253
|
+
var_1_orders: trade_side_my_orders.concat(o_side_my_orders),
|
|
1254
|
+
var_1_available: trade_side_avail.concat(o_side_avail),
|
|
1255
|
+
var_1_prices: trade_side_prices.concat(o_side_prices)
|
|
1256
|
+
};
|
|
1257
|
+
},
|
|
1258
|
+
calcPotentialWinnings: (amt, odds) => {
|
|
1259
|
+
if (odds > 0) {
|
|
1260
|
+
var earningsMultiplyer = odds / 100 + 1;
|
|
1261
|
+
return earningsMultiplyer * amt;
|
|
1262
|
+
} else {
|
|
1263
|
+
var earningsMultiplyer = 100 / Math.abs(odds) + 1;
|
|
1264
|
+
return earningsMultiplyer * amt;
|
|
1265
|
+
}
|
|
1266
|
+
},
|
|
1267
|
+
calcProbabilityFromOdds: odds => {
|
|
1268
|
+
let prob;
|
|
1269
|
+
if (odds < 0) {
|
|
1270
|
+
odds = Math.abs(odds);
|
|
1271
|
+
prob = odds / (odds + 100) * 100;
|
|
1272
|
+
return prob / 100;
|
|
1273
|
+
} else {
|
|
1274
|
+
prob = 100 / (odds + 100) * 100;
|
|
1275
|
+
return prob / 100;
|
|
1276
|
+
}
|
|
1277
|
+
},
|
|
1278
|
+
getAvailableSideIds: (my_orders, available_orders, prices, market) => {
|
|
1279
|
+
let default_side_id = '0';
|
|
1280
|
+
if (!['athlete', 'team', 'exotic'].includes(market.level)) {
|
|
1281
|
+
return {
|
|
1282
|
+
side_type: market.level,
|
|
1283
|
+
unique_side_ids: [],
|
|
1284
|
+
default_side_id
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
let o_sides = my_orders.map(o => o.side_id);
|
|
1288
|
+
let avail_sides = available_orders.map(o => o.side_id);
|
|
1289
|
+
let price_sides = prices.map(p => p.participant_id);
|
|
1290
|
+
let unique_side_ids = o_sides.concat(avail_sides).concat(price_sides);
|
|
1291
|
+
unique_side_ids = [...new Set(unique_side_ids.map(id => id))];
|
|
1292
|
+
let my_order = my_orders[0];
|
|
1293
|
+
if (my_order) {
|
|
1294
|
+
default_side_id = my_order.side_id;
|
|
1295
|
+
} else if (available_orders[0]) {
|
|
1296
|
+
default_side_id = available_orders[0].side_id;
|
|
1297
|
+
} else if (prices[0]) {
|
|
1298
|
+
default_side_id = prices[0].participant_id;
|
|
1299
|
+
}
|
|
1300
|
+
return {
|
|
1301
|
+
side_type: market.level,
|
|
1302
|
+
unique_side_ids,
|
|
1303
|
+
default_side_id
|
|
1304
|
+
};
|
|
1305
|
+
}
|
|
1306
|
+
};
|
|
1307
|
+
//# sourceMappingURL=index.js.map
|