|
|
@@ -81,9 +81,10 @@ const parseOutcomes = (outcomes, clobTokenIds, bestBid=0, bestAsk=0) => {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 解析盘口数据
|
|
|
- * @param {*} markets
|
|
|
- * @returns {Object}
|
|
|
+ * 解析让球方向
|
|
|
+ * 让球方向为正数时,返回'a',否则返回''
|
|
|
+ * @param {*} ratio
|
|
|
+ * @returns {string}
|
|
|
*/
|
|
|
const ratioAccept = (ratio) => {
|
|
|
if (ratio > 0) {
|
|
|
@@ -91,12 +92,26 @@ const ratioAccept = (ratio) => {
|
|
|
}
|
|
|
return '';
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 解析盘口比率
|
|
|
+ * 比率取绝对值,并去掉小数点后的数字
|
|
|
+ * @param {*} ratio
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
const ratioString = (ratio) => {
|
|
|
ratio = Math.abs(ratio);
|
|
|
ratio = ratio.toString();
|
|
|
ratio = ratio.replace(/\./, '');
|
|
|
return ratio;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 解析盘口数据
|
|
|
+ * 使用卖单最优价格
|
|
|
+ * @param {*} markets
|
|
|
+ * @returns {Object}
|
|
|
+ */
|
|
|
export const parseOdds = (markets) => {
|
|
|
const odds = {};
|
|
|
Object.keys(markets).forEach(key => {
|
|
|
@@ -171,6 +186,97 @@ export const parseOdds = (markets) => {
|
|
|
return odds;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 解析盘口数据
|
|
|
+ * 当卖单最低价格与买单最高价格差值超过最小变动价位时
|
|
|
+ * 创建新的买单价格,即买单最高价格+最小变动价位
|
|
|
+ * 否则,使用买单最高价格
|
|
|
+ * @param {*} markets
|
|
|
+ * @returns {Object}
|
|
|
+ */
|
|
|
+export const parseOddsBid = (markets) => {
|
|
|
+ const odds = {};
|
|
|
+ Object.keys(markets).forEach(key => {
|
|
|
+ const marketData = markets[key];
|
|
|
+ if (key === 'moneyline') {
|
|
|
+ Object.keys(marketData).forEach(side => {
|
|
|
+ const askYes = marketData[side].outcomes['Yes']['best_ask'];
|
|
|
+ const bidYes = marketData[side].outcomes['Yes']['best_bid'];
|
|
|
+ const tokenYes = marketData[side].outcomes['Yes']['id'];
|
|
|
+ const askNo = marketData[side].outcomes['No']['best_ask'];
|
|
|
+ const bidNo = marketData[side].outcomes['No']['best_bid'];
|
|
|
+ const tokenNo = marketData[side].outcomes['No']['id'];
|
|
|
+ const slug = marketData[side].market.slug;
|
|
|
+ const tick_size = marketData[side].market.orderPriceMinTickSize;
|
|
|
+ if (askYes <= 0.1 || askNo <= 0.1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const iorYes = fixFloat(1 / askYes);
|
|
|
+ const iorNo = fixFloat(1 / askNo);
|
|
|
+ let iorKeyYes = '';
|
|
|
+ let iorKeyNo = '';
|
|
|
+ switch (side) {
|
|
|
+ case 'Home':
|
|
|
+ iorKeyYes = 'ior_mh';
|
|
|
+ iorKeyNo = 'ior_moh';
|
|
|
+ break;
|
|
|
+ case 'Draw':
|
|
|
+ iorKeyYes = 'ior_mn';
|
|
|
+ iorKeyNo = 'ior_mon';
|
|
|
+ break;
|
|
|
+ case 'Away':
|
|
|
+ iorKeyYes = 'ior_mc';
|
|
|
+ iorKeyNo = 'ior_moc';
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ odds[iorKeyYes] = { v: iorYes, ask: askYes, bid: bidYes, tick_size, token: tokenYes, slug };
|
|
|
+ odds[iorKeyNo] = { v: iorNo, ask: askNo, bid: bidNo, tick_size, token: tokenNo, slug };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else if (key === 'spreads') {
|
|
|
+ Object.keys(marketData).forEach(handicap => {
|
|
|
+ const ratio = +handicap;
|
|
|
+ const askHome = marketData[handicap].outcomes['Home']['best_ask'];
|
|
|
+ const bidHome = marketData[handicap].outcomes['Home']['best_bid'];
|
|
|
+ const tokenHome = marketData[handicap].outcomes['Home']['id'];
|
|
|
+ const askAway = marketData[handicap].outcomes['Away']['best_ask'];
|
|
|
+ const bidAway = marketData[handicap].outcomes['Away']['best_bid'];
|
|
|
+ const tokenAway = marketData[handicap].outcomes['Away']['id'];
|
|
|
+ const slug = marketData[handicap].market.slug;
|
|
|
+ const tick_size = marketData[handicap].market.orderPriceMinTickSize;
|
|
|
+ if (askHome <= 0.1 || askAway <= 0.1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const iorHome = fixFloat(1 / askHome);
|
|
|
+ const iorAway = fixFloat(1 / askAway);
|
|
|
+ odds[`ior_r${ratioAccept(ratio)}h_${ratioString(ratio)}`] = { v: iorHome, ask: askHome, bid: bidHome, tick_size, token: tokenHome, slug };
|
|
|
+ odds[`ior_r${ratioAccept(-ratio)}c_${ratioString(ratio)}`] = { v: iorAway, ask: askAway, bid: bidAway, tick_size, token: tokenAway, slug };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else if (key === 'totals') {
|
|
|
+ Object.keys(marketData).forEach(handicap => {
|
|
|
+ const ratio = +handicap;
|
|
|
+ const askOver = marketData[handicap].outcomes['Over']['best_ask'];
|
|
|
+ const bidOver = marketData[handicap].outcomes['Over']['best_bid'];
|
|
|
+ const tokenOver = marketData[handicap].outcomes['Over']['id'];
|
|
|
+ const askUnder = marketData[handicap].outcomes['Under']['best_ask'];
|
|
|
+ const bidUnder = marketData[handicap].outcomes['Under']['best_bid'];
|
|
|
+ const tokenUnder = marketData[handicap].outcomes['Under']['id'];
|
|
|
+ const slug = marketData[handicap].market.slug;
|
|
|
+ const tick_size = marketData[handicap].market.orderPriceMinTickSize;
|
|
|
+ if (askOver <= 0.1 || askUnder <= 0.1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const iorOver = fixFloat(1 / askOver);
|
|
|
+ const iorUnder = fixFloat(1 / askUnder);
|
|
|
+ odds[`ior_ouc_${ratioString(ratio)}`] = { v: iorOver, ask: askOver, bid: bidOver, tick_size, token: tokenOver, slug };
|
|
|
+ odds[`ior_ouh_${ratioString(ratio)}`] = { v: iorUnder, ask: askUnder, bid: bidUnder, tick_size, token: tokenUnder, slug };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return odds;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* 解析胜平负盘口
|
|
|
* @param {*} groupItemThreshold
|