eventSolutions.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /**
  2. * 精确浮点数字
  3. * @param {number} number
  4. * @param {number} x
  5. * @returns {number}
  6. */
  7. const fixFloat = (number, x=2) => {
  8. return parseFloat(number.toFixed(x));
  9. }
  10. /**
  11. * 计算盈利
  12. */
  13. const triangleProfitCalc = (betInfo) => {
  14. const {
  15. cross_type,
  16. gold_side_a: x,
  17. gold_side_b: y,
  18. gold_side_c: z,
  19. odds_side_a: a,
  20. odds_side_b: b,
  21. odds_side_c: c,
  22. rebate_side_a: A = 0,
  23. rebate_side_b: B = 0,
  24. rebate_side_c: C = 0,
  25. rebate_type_side_a: TA = 0,
  26. rebate_type_side_b: TB = 0,
  27. rebate_type_side_c: TC = 0,
  28. } = betInfo;
  29. /**
  30. * cross_type:
  31. * la: 全输
  32. * wa: 全赢
  33. * lh: 半输
  34. * wh: 半赢
  35. * dr: 和局
  36. * la_wh_wa, la_dr_wa, la_lh_wa, lh_dr_wa, lh_lh_wa, la_la_wa
  37. */
  38. const k1 = TA == 1 ? a + A : a * (1 + A);
  39. const k2 = 1 - A;
  40. const k3 = TB == 1 ? b + B : b * (1 + B);
  41. const k4 = 1 - B;
  42. const k5 = TC == 1 ? c + C : c * (1 + C);
  43. const k6 = 1 - C;
  44. let win_side_a = 0, win_side_b = 0, win_side_c = 0;
  45. win_side_a = k1*x - k4*y - k6*z;
  46. win_side_b = k3*y - k2*x - k6*z;
  47. switch (cross_type) {
  48. case 'la_wh_wa': // 全输 半赢 全赢
  49. win_side_c = k5*z - k2*x + k3*y/2;
  50. break;
  51. case 'la_dr_wa': // 全输 和局 全赢
  52. win_side_c = k5*z - k2*x;
  53. break;
  54. case 'la_lh_wa': // 全输 半输 全赢
  55. win_side_c = k5*z - k2*x - k4*y/2;
  56. break;
  57. case 'lh_dr_wa': // 半输 和局 全赢
  58. win_side_c = k5*z - k2*x/2;
  59. break;
  60. case 'lh_lh_wa': // 半输 半输 全赢
  61. win_side_c = k5*z - k2*x/2 - k4*y/2;
  62. break;
  63. case 'la_la_wa': // 全输 全输 全赢
  64. win_side_c = k5*z - k2*x - k4*y;
  65. break;
  66. case 'la_wa_rv': // 两盘口输赢
  67. win_side_c = 0;
  68. break;
  69. default:
  70. win_side_c = 0;
  71. }
  72. win_side_a = fixFloat(win_side_a);
  73. win_side_b = fixFloat(win_side_b);
  74. win_side_c = fixFloat(win_side_c);
  75. let win_average = 0;
  76. if (cross_type == 'la_wa_rv') {
  77. win_side_c = 0;
  78. win_average = fixFloat((win_side_a + win_side_b) / 2);
  79. }
  80. else {
  81. win_average = fixFloat((win_side_a + win_side_b + win_side_c) / 3);
  82. }
  83. return { win_side_a, win_side_b, win_side_c, win_average }
  84. }
  85. const triangleGoldCalc = (betInfo) => {
  86. const {
  87. cross_type,
  88. base_index = 0,
  89. base_stake = 10000,
  90. odds_side_a: a,
  91. odds_side_b: b,
  92. odds_side_c: c,
  93. rebate_side_a: A = 0,
  94. rebate_side_b: B = 0,
  95. rebate_side_c: C = 0,
  96. rebate_type_side_a: TA = 0,
  97. rebate_type_side_b: TB = 0,
  98. rebate_type_side_c: TC = 0,
  99. } = betInfo;
  100. if (typeof a !== 'number' || typeof b !== 'number' || typeof c !== 'number') {
  101. return;
  102. }
  103. const k1 = TA == 1 ? a + A : a * (1 + A);
  104. const k2 = 1 - A;
  105. const k3 = TB == 1 ? b + B : b * (1 + B);
  106. const k4 = 1 - B;
  107. const k5 = TC == 1 ? c + C : c * (1 + C);
  108. const k6 = 1 - C;
  109. let x = base_stake;
  110. let y = (k1 + k2) * x / (k3 + k4);
  111. let z;
  112. switch (cross_type) {
  113. case 'la_wh_wa': // 全输 半赢 全赢
  114. z = k3 * y / 2 / (k5 + k6);
  115. break;
  116. case 'la_dr_wa': // 全输 和局 全赢
  117. z = k3 * y / (k5 + k6);
  118. break;
  119. case 'la_lh_wa': // 全输 半输 全赢
  120. z = (k3 + k4 / 2) * y / (k5 + k6);
  121. break;
  122. case 'lh_dr_wa': // 半输 和局 全赢
  123. z = (k3 * y - k2 * x / 2) / (k5 + k6);
  124. break;
  125. case 'lh_lh_wa': // 半输 半输 全赢
  126. z = ((k3 + k4/2) * y - k2 * x / 2) / (k5 + k6);
  127. break;
  128. case 'la_la_wa': // 全输 全输 全赢
  129. z = (k3 + k4) * y / (k5 + k6);
  130. break;
  131. case 'la_wa_rv': // 两盘口输赢
  132. z = 0;
  133. break;
  134. default:
  135. z = 0;
  136. }
  137. if (base_index == 1) {
  138. const scale = base_stake / y;
  139. x = x * scale;
  140. y = base_stake;
  141. z = z * scale;
  142. }
  143. else if (base_index == 2) {
  144. const scale = base_stake / z;
  145. x = x * scale;
  146. y = y * scale;
  147. z = base_stake;
  148. }
  149. if (x < 0 || y < 0 || z < 0) {
  150. return;
  151. }
  152. return {
  153. gold_side_a: fixFloat(x),
  154. gold_side_b: fixFloat(y),
  155. gold_side_c: fixFloat(z),
  156. };
  157. }
  158. const eventSolutions = (betInfo, showGolds=false) => {
  159. const goldsInfo = triangleGoldCalc(betInfo);
  160. if (!goldsInfo) {
  161. return;
  162. }
  163. const profitInfo = triangleProfitCalc({ ...betInfo, ...goldsInfo }, showGolds);
  164. const { gold_side_a, gold_side_b, gold_side_c } = goldsInfo;
  165. const { win_side_a, win_side_b, win_side_c, win_average } = profitInfo;
  166. const {
  167. cross_type, base_index = 0, base_stake = 10000,
  168. odds_side_a, odds_side_b, odds_side_c,
  169. rebate_side_a, rebate_side_b, rebate_side_c,
  170. rebate_type_side_a, rebate_type_side_b, rebate_type_side_c,
  171. } = betInfo;
  172. // const win_average_rate = fixFloat(win_average / base_stake * 100);
  173. const win_profit_rate = fixFloat(win_average / (gold_side_a + gold_side_b + gold_side_c) * 100);
  174. let result = {
  175. odds_side_a, odds_side_b, odds_side_c,
  176. rebate_side_a, rebate_side_b, rebate_side_c,
  177. rebate_type_side_a, rebate_type_side_b, rebate_type_side_c,
  178. win_average, /*win_average_rate,*/ win_profit_rate, cross_type,
  179. base_index, base_stake,
  180. }
  181. if (showGolds) {
  182. result = {
  183. ...result,
  184. gold_side_a, gold_side_b, gold_side_c,
  185. win_side_a, win_side_b, win_side_c,
  186. }
  187. }
  188. return result;
  189. }
  190. export default eventSolutions;