|
@@ -12,56 +12,82 @@ const fixFloat = (number, x = 2) => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 计算输赢比例
|
|
|
|
|
- * 与其他方法中的输赢逻辑相反
|
|
|
|
|
- * 正数为输
|
|
|
|
|
- * 负数为赢
|
|
|
|
|
|
|
+ * 获取内盘位置
|
|
|
*/
|
|
*/
|
|
|
-const CROSS_TYPE_MAP = { w: -1, l: 1, a: 1, h: 0.5, d: 0, r: 0, v: 0 };
|
|
|
|
|
-const lossProportion = (sol) => {
|
|
|
|
|
- const {
|
|
|
|
|
- cross_type, odds_side_a, odds_side_b,
|
|
|
|
|
- rebate_side_a, rebate_side_b,
|
|
|
|
|
- rebate_type_side_a, rebate_type_side_b,
|
|
|
|
|
- } = sol;
|
|
|
|
|
- const typeList = cross_type.split('_').map(part => {
|
|
|
|
|
|
|
+const getBetSide = (bet_index) => {
|
|
|
|
|
+ switch (bet_index) {
|
|
|
|
|
+ case 0:
|
|
|
|
|
+ return 'side_a';
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ return 'side_b';
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ return 'side_c';
|
|
|
|
|
+ }
|
|
|
|
|
+ return undefined;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 盘口输赢映射
|
|
|
|
|
+ */
|
|
|
|
|
+const CROSS_TYPE_MAP = { w: 1, l: -1, a: 1, h: 0.5, d: 0, r: 0, v: 0 };
|
|
|
|
|
+const getCrossTypeList = (cross_type) => {
|
|
|
|
|
+ return cross_type.split('_').map(part => {
|
|
|
return part.split('').map(key => CROSS_TYPE_MAP[key]);
|
|
return part.split('').map(key => CROSS_TYPE_MAP[key]);
|
|
|
}).map(([a, b])=> a * b);
|
|
}).map(([a, b])=> a * b);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- let loss_proportion_a = 0, loss_proportion_b = 0;
|
|
|
|
|
- if (typeList[0] >= 0) {
|
|
|
|
|
- loss_proportion_a = typeList[0] * (1 - rebate_side_a);
|
|
|
|
|
- }
|
|
|
|
|
- else {
|
|
|
|
|
- if (rebate_type_side_a == 1) {
|
|
|
|
|
- loss_proportion_a = typeList[0] * (odds_side_a + rebate_side_a);
|
|
|
|
|
- }
|
|
|
|
|
- else {
|
|
|
|
|
- loss_proportion_a = typeList[0] * odds_side_a * (1 + rebate_side_a);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (typeList[1] >= 0) {
|
|
|
|
|
- loss_proportion_b = typeList[1] * (1 - rebate_side_b);
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 计算输赢比例
|
|
|
|
|
+ */
|
|
|
|
|
+const getWinProportion = (sol, bet_index) => {
|
|
|
|
|
+ const typeList = getCrossTypeList(sol.cross_type);
|
|
|
|
|
+ const betSide = getBetSide(bet_index);
|
|
|
|
|
+ let win_proportion = 0;
|
|
|
|
|
+ if (typeList[bet_index] <= 0) {
|
|
|
|
|
+ // 输或平
|
|
|
|
|
+ win_proportion = typeList[bet_index] * (1 - sol[`rebate_${betSide}`]);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- if (rebate_type_side_b == 1) {
|
|
|
|
|
- loss_proportion_b = typeList[1] * (odds_side_b + rebate_side_b);
|
|
|
|
|
|
|
+ // 赢
|
|
|
|
|
+ if (sol[`rebate_type_${betSide}`] == 1) {
|
|
|
|
|
+ // 按本金返水
|
|
|
|
|
+ win_proportion = typeList[bet_index] * (sol[`odds_${betSide}`] + sol[`rebate_${betSide}`]);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- loss_proportion_b = typeList[1] * odds_side_b * (1 + rebate_side_b);
|
|
|
|
|
|
|
+ // 按结算返水
|
|
|
|
|
+ win_proportion = typeList[bet_index] * sol[`odds_${betSide}`] * (1 + sol[`rebate_${betSide}`]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ return win_proportion;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 计算盘口输的比例
|
|
|
|
|
+ */
|
|
|
|
|
+const lossProportion = (sol) => {
|
|
|
|
|
+ const loss_proportion_a = getWinProportion(sol, 0) * -1;
|
|
|
|
|
+ const loss_proportion_b = getWinProportion(sol, 1) * -1;
|
|
|
return { loss_proportion_a, loss_proportion_b };
|
|
return { loss_proportion_a, loss_proportion_b };
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 外盘特殊盘赢时的内盘剩余额度
|
|
|
|
|
+ */
|
|
|
|
|
+const getInnerWinGoldsWithSpecialWin = (sol) => {
|
|
|
|
|
+ const { inner_base, inner_index } = sol;
|
|
|
|
|
+ const win_proportion = getWinProportion(sol, inner_index);
|
|
|
|
|
+ const inner_win_golds = win_proportion * inner_base;
|
|
|
|
|
+ return fixFloat(inner_base + inner_win_golds);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 不同组合的金额计算
|
|
* 不同组合的金额计算
|
|
|
*/
|
|
*/
|
|
|
const HandicapCalc = function (data) {
|
|
const HandicapCalc = function (data) {
|
|
|
- const { i, g, a, b, c, A, B, C, TA, TB, TC, w, l } = data;
|
|
|
|
|
|
|
+ // console.log('HandicapCalc', data);
|
|
|
|
|
+ const { i, g, r, a, b, c, A, B, C, TA, TB, TC, w, l } = data;
|
|
|
const t = w + l;
|
|
const t = w + l;
|
|
|
|
|
+ const k0 = 1 - r;
|
|
|
const k1 = TA == 1 ? a + A : a * (1 + A);
|
|
const k1 = TA == 1 ? a + A : a * (1 + A);
|
|
|
const k2 = 1 - A;
|
|
const k2 = 1 - A;
|
|
|
const k3 = TB == 1 ? b + B : b * (1 + B);
|
|
const k3 = TB == 1 ? b + B : b * (1 + B);
|
|
@@ -76,6 +102,7 @@ const HandicapCalc = function (data) {
|
|
|
if (i === 2) {
|
|
if (i === 2) {
|
|
|
const z = g;
|
|
const z = g;
|
|
|
const m = t + k6 * z;
|
|
const m = t + k6 * z;
|
|
|
|
|
+ // const m = t + k0 * z;
|
|
|
const x = (k3 + k4) * m / (k1 * k3 - k2 * k4);
|
|
const x = (k3 + k4) * m / (k1 * k3 - k2 * k4);
|
|
|
const y = (k1 + k2) * m / (k1 * k3 - k2 * k4);
|
|
const y = (k1 + k2) * m / (k1 * k3 - k2 * k4);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
@@ -89,6 +116,7 @@ const HandicapCalc = function (data) {
|
|
|
() => {
|
|
() => {
|
|
|
const x = g;
|
|
const x = g;
|
|
|
const m = t + k2 * x;
|
|
const m = t + k2 * x;
|
|
|
|
|
+ // const m = t + k0 * x;
|
|
|
const z = m / (2 * k5 + k6);
|
|
const z = m / (2 * k5 + k6);
|
|
|
const y = (k5 + k6) * m / (k3 * k5 + k3 * k6 / 2);
|
|
const y = (k5 + k6) * m / (k3 * k5 + k3 * k6 / 2);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
@@ -97,6 +125,8 @@ const HandicapCalc = function (data) {
|
|
|
const y = g;
|
|
const y = g;
|
|
|
const z = ((k1 + k2) * t + (k2 * k4 - k1 * k3 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
const z = ((k1 + k2) * t + (k2 * k4 - k1 * k3 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
const x = ((k5 + k6) * t + (k4 * k5 - k3 * k6 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
const x = ((k5 + k6) * t + (k4 * k5 - k3 * k6 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const z = ((k1 + k2) * t + (k0 * k2 - k1 * k3 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const x = ((k5 + k6) * t + (k0 * k5 - k3 * k6 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
@@ -106,6 +136,7 @@ const HandicapCalc = function (data) {
|
|
|
() => {
|
|
() => {
|
|
|
const x = g;
|
|
const x = g;
|
|
|
const m = t + k2 * x;
|
|
const m = t + k2 * x;
|
|
|
|
|
+ // const m = t + k0 * x;
|
|
|
const z = m / k5;
|
|
const z = m / k5;
|
|
|
const y = (k5 + k6) * m / (k3 * k5);
|
|
const y = (k5 + k6) * m / (k3 * k5);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
@@ -114,6 +145,8 @@ const HandicapCalc = function (data) {
|
|
|
const y = g;
|
|
const y = g;
|
|
|
const z = ((k1 + k2) * t + k2 * k4 * y) / (k1 * k5 - k2 * k6);
|
|
const z = ((k1 + k2) * t + k2 * k4 * y) / (k1 * k5 - k2 * k6);
|
|
|
const x = ((k5 + k6) * t + k4 * k5 * y) / (k1 * k5 - k2 * k6);
|
|
const x = ((k5 + k6) * t + k4 * k5 * y) / (k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const z = ((k1 + k2) * t + k0 * k2 * y) / (k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const x = ((k5 + k6) * t + k0 * k5 * y) / (k1 * k5 - k2 * k6);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
@@ -123,6 +156,7 @@ const HandicapCalc = function (data) {
|
|
|
() => {
|
|
() => {
|
|
|
const x = g;
|
|
const x = g;
|
|
|
const m = t + k2 * x;
|
|
const m = t + k2 * x;
|
|
|
|
|
+ // const m = t + k0 * x;
|
|
|
const z = (2 * k3 + k4) * m / (2 * k3 * k5 - k4 * k6);
|
|
const z = (2 * k3 + k4) * m / (2 * k3 * k5 - k4 * k6);
|
|
|
const y = (k5 + k6) * m / (k3 * k5 - k4 * k6 / 2);
|
|
const y = (k5 + k6) * m / (k3 * k5 - k4 * k6 / 2);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
@@ -131,6 +165,8 @@ const HandicapCalc = function (data) {
|
|
|
const y = g;
|
|
const y = g;
|
|
|
const z = ((k1 + k2) * t + (k2 * k4 + k1 * k4 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
const z = ((k1 + k2) * t + (k2 * k4 + k1 * k4 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
const x = ((k5 + k6) * t + (k4 * k5 + k4 * k6 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
const x = ((k5 + k6) * t + (k4 * k5 + k4 * k6 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const z = ((k1 + k2) * t + (k0 * k2 + k1 * k4 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const x = ((k5 + k6) * t + (k0 * k5 + k4 * k6 / 2) * y) / (k1 * k5 - k2 * k6);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
@@ -140,13 +176,16 @@ const HandicapCalc = function (data) {
|
|
|
() => {
|
|
() => {
|
|
|
const x = g;
|
|
const x = g;
|
|
|
const z = (t + k2 * x / 2) / k5;
|
|
const z = (t + k2 * x / 2) / k5;
|
|
|
- const y = ((k5 + k6) * t + (k2 * k5 + k2 * k4 / 2) * x) / (k3 * k5);
|
|
|
|
|
|
|
+ const y = ((k5 + k6) * t + (k5 + k6 / 2) * k2 * x) / (k3 * k5);
|
|
|
|
|
+ // const y = ((k5 + k6) * t + (k0 * k5 + k2 * k6 / 2) * x) / (k3 * k5);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
},
|
|
},
|
|
|
() => {
|
|
() => {
|
|
|
const y = g;
|
|
const y = g;
|
|
|
const z = ((2 * k1 + k2) * t + k2 * k4 * y) / (2 * k1 * k5 - k2 * k6);
|
|
const z = ((2 * k1 + k2) * t + k2 * k4 * y) / (2 * k1 * k5 - k2 * k6);
|
|
|
const x = ((k5 + k6) * t + k4 * k5 * y) / (k1 * k5 - k2 * k6 / 2);
|
|
const x = ((k5 + k6) * t + k4 * k5 * y) / (k1 * k5 - k2 * k6 / 2);
|
|
|
|
|
+ // const z = ((2 * k1 + k2) * t + k0 * k2 * y) / (2 * k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const x = ((k5 + k6) * t + k0 * k5 * y) / (k1 * k5 - k2 * k6 / 2);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
@@ -157,12 +196,16 @@ const HandicapCalc = function (data) {
|
|
|
const x = g;
|
|
const x = g;
|
|
|
const z = ((2 * k3 + k4) * t + (k3 + k4) * k2 * x) / (2 * k3 * k5 - k4 * k6);
|
|
const z = ((2 * k3 + k4) * t + (k3 + k4) * k2 * x) / (2 * k3 * k5 - k4 * k6);
|
|
|
const y = ((k5 + k6) * t + (k5 + k6 / 2) * k2 * x) / (k3 * k5 - k4 * k6 / 2);
|
|
const y = ((k5 + k6) * t + (k5 + k6 / 2) * k2 * x) / (k3 * k5 - k4 * k6 / 2);
|
|
|
|
|
+ // const z = ((2 * k3 + k4) * t + (k0 * k4 + k2 * k3) * x) / (2 * k3 * k5 - k4 * k6);
|
|
|
|
|
+ // const y = ((k5 + k6) * t + (k0 * k5 + k2 * k6 / 2) * x) / (k3 * k5 - k4 * k6 / 2);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
},
|
|
},
|
|
|
() => {
|
|
() => {
|
|
|
const y = g;
|
|
const y = g;
|
|
|
const z = ((2 * k1 + k2) * t + (k1 + k2) * k4 * y) / (2 * k1 * k5 - k2 * k6);
|
|
const z = ((2 * k1 + k2) * t + (k1 + k2) * k4 * y) / (2 * k1 * k5 - k2 * k6);
|
|
|
const x = ((k5 + k6) * t + (k5 + k6 / 2) * k4 * y) / (k1 * k5 - k2 * k6 / 2);
|
|
const x = ((k5 + k6) * t + (k5 + k6 / 2) * k4 * y) / (k1 * k5 - k2 * k6 / 2);
|
|
|
|
|
+ // const z = ((2 * k1 + k2) * t + (k0 * k2 + k1 * k4) * y) / (2 * k1 * k5 - k2 * k6);
|
|
|
|
|
+ // const x = ((k5 + k6) * t + (k0 * k5 + k4 * k6 / 2) * y) / (k1 * k5 - k2 * k6 / 2);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
@@ -172,6 +215,7 @@ const HandicapCalc = function (data) {
|
|
|
() => {
|
|
() => {
|
|
|
const x = g;
|
|
const x = g;
|
|
|
const m = t + k2 * x;
|
|
const m = t + k2 * x;
|
|
|
|
|
+ // const m = t + k0 * x;
|
|
|
const z = (k3 + k4) * m / (k3 * k5 - k4 * k6);
|
|
const z = (k3 + k4) * m / (k3 * k5 - k4 * k6);
|
|
|
const y = (k5 + k6) * m / (k3 * k5 - k4 * k6);
|
|
const y = (k5 + k6) * m / (k3 * k5 - k4 * k6);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
@@ -179,6 +223,7 @@ const HandicapCalc = function (data) {
|
|
|
() => {
|
|
() => {
|
|
|
const y = g;
|
|
const y = g;
|
|
|
const m = t + k4 * y;
|
|
const m = t + k4 * y;
|
|
|
|
|
+ // const m = t + k0 * y;
|
|
|
const z = (k1 + k2) * m / (k1 * k5 - k2 * k6);
|
|
const z = (k1 + k2) * m / (k1 * k5 - k2 * k6);
|
|
|
const x = (k5 + k6) * m / (k1 * k5 - k2 * k6);
|
|
const x = (k5 + k6) * m / (k1 * k5 - k2 * k6);
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
@@ -190,12 +235,14 @@ const HandicapCalc = function (data) {
|
|
|
() => {
|
|
() => {
|
|
|
const x = g;
|
|
const x = g;
|
|
|
const y = (k2 * x + t) / k3;
|
|
const y = (k2 * x + t) / k3;
|
|
|
|
|
+ // const y = (k0 * x + t) / k3;
|
|
|
const z = 0;
|
|
const z = 0;
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
},
|
|
},
|
|
|
() => {
|
|
() => {
|
|
|
const y = g;
|
|
const y = g;
|
|
|
const x = (k4 * y + t) / k1;
|
|
const x = (k4 * y + t) / k1;
|
|
|
|
|
+ // const x = (k0 * y + t) / k1;
|
|
|
const z = 0;
|
|
const z = 0;
|
|
|
return { x, y, z };
|
|
return { x, y, z };
|
|
|
}
|
|
}
|
|
@@ -204,20 +251,14 @@ const HandicapCalc = function (data) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/**
|
|
|
|
|
- * const z = g;
|
|
|
|
|
- const m = t + k6 * z;
|
|
|
|
|
- const x = (k3 + k4) * m / (k1 * k3 - k2 * k4);
|
|
|
|
|
- const y = (k1 + k2) * m / (k1 * k3 - k2 * k4);
|
|
|
|
|
- return { x, y, z };
|
|
|
|
|
- */
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* 根据预期盈利计算下注金额
|
|
* 根据预期盈利计算下注金额
|
|
|
*/
|
|
*/
|
|
|
const calcGoldsWithTarget = (data) => {
|
|
const calcGoldsWithTarget = (data) => {
|
|
|
const {
|
|
const {
|
|
|
|
|
+ inner_index: i,
|
|
|
inner_base: g,
|
|
inner_base: g,
|
|
|
|
|
+ inner_rebate: r,
|
|
|
odds_side_a: a,
|
|
odds_side_a: a,
|
|
|
odds_side_b: b,
|
|
odds_side_b: b,
|
|
|
odds_side_c: c,
|
|
odds_side_c: c,
|
|
@@ -227,12 +268,11 @@ const calcGoldsWithTarget = (data) => {
|
|
|
rebate_type_side_a: TA,
|
|
rebate_type_side_a: TA,
|
|
|
rebate_type_side_b: TB,
|
|
rebate_type_side_b: TB,
|
|
|
rebate_type_side_c: TC,
|
|
rebate_type_side_c: TC,
|
|
|
- inner_index: i,
|
|
|
|
|
cross_type: t,
|
|
cross_type: t,
|
|
|
win_target: w,
|
|
win_target: w,
|
|
|
loss_out: l = 0,
|
|
loss_out: l = 0,
|
|
|
} = data;
|
|
} = data;
|
|
|
- const calc = new HandicapCalc({ i, g, a, b, c, A, B, C, TA, TB, TC, w, l });
|
|
|
|
|
|
|
+ const calc = new HandicapCalc({ i, g, r, a, b, c, A, B, C, TA, TB, TC, w, l });
|
|
|
const { x, y, z } = calc?.[t]() ?? {};
|
|
const { x, y, z } = calc?.[t]() ?? {};
|
|
|
return {
|
|
return {
|
|
|
gold_side_a: fixFloat(x),
|
|
gold_side_a: fixFloat(x),
|
|
@@ -259,30 +299,36 @@ const calcWinResultWithTarget = (data) => {
|
|
|
rebate_type_side_c: rebateTypeC1,
|
|
rebate_type_side_c: rebateTypeC1,
|
|
|
inner_index: inner_index_1,
|
|
inner_index: inner_index_1,
|
|
|
} = sol1;
|
|
} = sol1;
|
|
|
|
|
+
|
|
|
|
|
+ const innerSide1 = getBetSide(inner_index_1);
|
|
|
|
|
+ const innerOdds1 = sol1[`odds_${innerSide1}`];
|
|
|
|
|
+ const innerRebateTotal = inner_rebate ?? sol1[`rebate_${innerSide1}`];
|
|
|
|
|
+ const innerRebateActual = fixFloat(innerRebateTotal / (innerOdds1 + 2), 3);
|
|
|
|
|
+
|
|
|
|
|
+ const firstSolData = { ...sol1, inner_base, inner_rebate: innerRebateTotal, win_target };
|
|
|
|
|
+ firstSolData[`rebate_${innerSide1}`] = innerRebateActual;
|
|
|
|
|
+
|
|
|
const {
|
|
const {
|
|
|
gold_side_a: goldA1,
|
|
gold_side_a: goldA1,
|
|
|
gold_side_b: goldB1,
|
|
gold_side_b: goldB1,
|
|
|
gold_side_c: goldC1,
|
|
gold_side_c: goldC1,
|
|
|
- } = calcGoldsWithTarget({ ...sol1, inner_base, win_target });
|
|
|
|
|
|
|
+ } = calcGoldsWithTarget(firstSolData);
|
|
|
|
|
|
|
|
- let loss_out_1 = 0, win_inner_1 = 0;
|
|
|
|
|
|
|
+ let loss_out_1 = 0;
|
|
|
switch (inner_index_1) {
|
|
switch (inner_index_1) {
|
|
|
case 0:
|
|
case 0:
|
|
|
loss_out_1 = goldB1 * (1 - rebateB1) + goldC1 * (1 - rebateC1);
|
|
loss_out_1 = goldB1 * (1 - rebateB1) + goldC1 * (1 - rebateC1);
|
|
|
- win_inner_1 = inner_base * (oddsA1 + 1);
|
|
|
|
|
break;
|
|
break;
|
|
|
case 1:
|
|
case 1:
|
|
|
loss_out_1 = goldA1 * (1 - rebateA1) + goldC1 * (1 - rebateC1);
|
|
loss_out_1 = goldA1 * (1 - rebateA1) + goldC1 * (1 - rebateC1);
|
|
|
- win_inner_1 = inner_base * (oddsB1 + 1);
|
|
|
|
|
break;
|
|
break;
|
|
|
case 2:
|
|
case 2:
|
|
|
const { loss_proportion_a: lpA1, loss_proportion_b: lpB1 } = lossProportion(sol1);
|
|
const { loss_proportion_a: lpA1, loss_proportion_b: lpB1 } = lossProportion(sol1);
|
|
|
loss_out_1 = goldA1 * lpA1 + goldB1 * lpB1;
|
|
loss_out_1 = goldA1 * lpA1 + goldB1 * lpB1;
|
|
|
- win_inner_1 = inner_base * (oddsC1 + 1)
|
|
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- win_inner_1 = fixFloat(win_inner_1);
|
|
|
|
|
|
|
+ loss_out_1 = fixFloat(loss_out_1);
|
|
|
|
|
|
|
|
const {
|
|
const {
|
|
|
cross_type: crossType2,
|
|
cross_type: crossType2,
|
|
@@ -297,39 +343,43 @@ const calcWinResultWithTarget = (data) => {
|
|
|
rebate_type_side_c: rebateTypeC2,
|
|
rebate_type_side_c: rebateTypeC2,
|
|
|
inner_index: inner_index_2,
|
|
inner_index: inner_index_2,
|
|
|
} = sol2;
|
|
} = sol2;
|
|
|
|
|
+
|
|
|
|
|
+ const innerSide2 = getBetSide(inner_index_2);
|
|
|
|
|
+ const innerOdds2 = (sol2[`odds_${innerSide2}`] + 1) * (innerOdds1 + 1) - 1;
|
|
|
|
|
+ const secondSolData = { ...sol2, inner_base, inner_rebate: innerRebateTotal, win_target, loss_out: loss_out_1 };
|
|
|
|
|
+ secondSolData[`odds_${innerSide2}`] = innerOdds2;
|
|
|
|
|
+ secondSolData[`rebate_${innerSide2}`] = innerRebateActual;
|
|
|
|
|
+
|
|
|
const {
|
|
const {
|
|
|
gold_side_a: goldA2,
|
|
gold_side_a: goldA2,
|
|
|
gold_side_b: goldB2,
|
|
gold_side_b: goldB2,
|
|
|
gold_side_c: goldC2,
|
|
gold_side_c: goldC2,
|
|
|
- } = calcGoldsWithTarget({ ...sol2, inner_base, win_target, loss_out: loss_out_1 });
|
|
|
|
|
|
|
+ } = calcGoldsWithTarget(secondSolData);
|
|
|
|
|
|
|
|
- let loss_out_2 = 0, win_inner_2 = 0, inner_base_key;
|
|
|
|
|
|
|
+ const win_inner_2 = inner_base * (innerOdds2 + 1 + innerRebateTotal);
|
|
|
|
|
+ let loss_out_2 = 0, inner_base_key;
|
|
|
switch (inner_index_2) {
|
|
switch (inner_index_2) {
|
|
|
case 0:
|
|
case 0:
|
|
|
inner_base_key = 'goldA2';
|
|
inner_base_key = 'goldA2';
|
|
|
- loss_out_2 = inner_base + goldB2 * (1 - rebateB2) + goldC2 * (1 - rebateC2) + loss_out_1;
|
|
|
|
|
- win_inner_2 = win_inner_1 * (oddsA2 + 1);
|
|
|
|
|
|
|
+ loss_out_2 = goldB2 * (1 - rebateB2) + goldC2 * (1 - rebateC2) + loss_out_1;
|
|
|
break;
|
|
break;
|
|
|
case 1:
|
|
case 1:
|
|
|
inner_base_key = 'goldB2';
|
|
inner_base_key = 'goldB2';
|
|
|
- loss_out_2 = inner_base + goldA2 * (1 - rebateA2) + goldC2 * (1 - rebateC2) + loss_out_1;
|
|
|
|
|
- win_inner_2 = win_inner_1 * (oddsB2 + 1);
|
|
|
|
|
|
|
+ loss_out_2 = goldA2 * (1 - rebateA2) + goldC2 * (1 - rebateC2) + loss_out_1;
|
|
|
break;
|
|
break;
|
|
|
case 2:
|
|
case 2:
|
|
|
const { loss_proportion_a: lpA2, loss_proportion_b: lpB2 } = lossProportion(sol2);
|
|
const { loss_proportion_a: lpA2, loss_proportion_b: lpB2 } = lossProportion(sol2);
|
|
|
inner_base_key = 'goldC2';
|
|
inner_base_key = 'goldC2';
|
|
|
- loss_out_2 = inner_base + goldA2 * lpA2 + goldB2 * lpB2 + loss_out_1;
|
|
|
|
|
- win_inner_2 = win_inner_1 * (oddsC2 + 1);
|
|
|
|
|
|
|
+ loss_out_2 = goldA2 * lpA2 + goldB2 * lpB2 + loss_out_1;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const win_inner = fixFloat(win_inner_2 - loss_out_2);
|
|
const win_inner = fixFloat(win_inner_2 - loss_out_2);
|
|
|
-
|
|
|
|
|
const goldsInfo = { goldA1, goldB1, goldC1, goldA2, goldB2, goldC2 }
|
|
const goldsInfo = { goldA1, goldB1, goldC1, goldA2, goldB2, goldC2 }
|
|
|
|
|
|
|
|
- if (goldsInfo[inner_base_key]) {
|
|
|
|
|
- goldsInfo[inner_base_key] = win_inner_1;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if (goldsInfo[inner_base_key]) {
|
|
|
|
|
+ // goldsInfo[inner_base_key] = win_inner_1;
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
const result = {
|
|
const result = {
|
|
|
bet_info: [
|
|
bet_info: [
|
|
@@ -378,9 +428,9 @@ const calcWinResultWithTarget = (data) => {
|
|
|
* 根据单关盈亏计算综合利润
|
|
* 根据单关盈亏计算综合利润
|
|
|
*/
|
|
*/
|
|
|
const calcTotalProfit = (sol1, sol2, inner_base, inner_rebate) => {
|
|
const calcTotalProfit = (sol1, sol2, inner_base, inner_rebate) => {
|
|
|
- const rebateInner = inner_base * inner_rebate;
|
|
|
|
|
- const winTarget1 = fixFloat(sol1.win_average - rebateInner);
|
|
|
|
|
- const winTarget2 = fixFloat(sol2.win_average - rebateInner);
|
|
|
|
|
|
|
+ // const rebateInner = inner_base * inner_rebate;
|
|
|
|
|
+ const winTarget1 = fixFloat(sol1.win_average);
|
|
|
|
|
+ const winTarget2 = fixFloat(sol2.win_average);
|
|
|
const winTarget = fixFloat(Math.min(winTarget1, winTarget2));
|
|
const winTarget = fixFloat(Math.min(winTarget1, winTarget2));
|
|
|
|
|
|
|
|
const win1 = calcWinResultWithTarget({ inner_base, inner_rebate, win_target: winTarget1, sol1, sol2 })?.win_inner;
|
|
const win1 = calcWinResultWithTarget({ inner_base, inner_rebate, win_target: winTarget1, sol1, sol2 })?.win_inner;
|
|
@@ -400,7 +450,7 @@ const calcTotalProfit = (sol1, sol2, inner_base, inner_rebate) => {
|
|
|
const win_diff = Math.abs(fixFloat(win_target - goldsInfo.win_inner));
|
|
const win_diff = Math.abs(fixFloat(win_target - goldsInfo.win_inner));
|
|
|
const lastResult = result.at(-1);
|
|
const lastResult = result.at(-1);
|
|
|
if (!lastResult?.win_diff || win_diff < lastResult.win_diff) {
|
|
if (!lastResult?.win_diff || win_diff < lastResult.win_diff) {
|
|
|
- result.push({ win_target: fixFloat(win_target + rebateInner), win_diff, win_inner: fixFloat(win_inner + rebateInner), ...goldsRest });
|
|
|
|
|
|
|
+ result.push({ win_target: fixFloat(win_target), win_diff, win_inner: fixFloat(win_inner), ...goldsRest });
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
break;
|
|
break;
|