SHOW:
|
|
- or go back to the newest paste.
| 1 | // ================================================================ | |
| 2 | var enableBetting = true; // Режим ставок вкл/выкл | |
| 3 | var baseBet = getBaseBet(); // Базовая ставка в битсах | |
| 4 | var GI_bet = baseBet; // Базовая ставка GI в битсах | |
| 5 | var PI_bet = baseBet; // Базовая ставка PI в битсах | |
| 6 | var FLY_bet = baseBet; // Базовая ставка FLY в битсах | |
| 7 | var FLY_crash = 10; // Базовая ставка FLY в битсах | |
| 8 | var baseStop = 10; // Базовый % выигрыша для остановки | |
| 9 | // ================================================================ | |
| 10 | var round = 0; // Раунд игры | |
| 11 | var last; // Сыгравший коэфициент в предыдущей игре | |
| 12 | // ================================================================ | |
| 13 | var cashedOut = true; // Коэфициент | |
| 14 | // ================================================================ | |
| 15 | var lastGamePlay; // Результат предыдущей игры | |
| 16 | var startBR = engine.getBalance(); // Изначальный банкролл | |
| 17 | var maxBR = startBR; // Максимальный банкролл за игру | |
| 18 | var minBR = startBR; // Минимальный банкролл за игру | |
| 19 | var curBR = startBR; // Текущий банкролл | |
| 20 | var userName = engine.getUsername(); // Имена текущих игроков | |
| 21 | var gamesWon = 0; // Количество выиграных ставок | |
| 22 | var gamesLost = 0; // Количество проигранных ставок | |
| 23 | var unplayed = 0; // Количество пропущеных игр | |
| 24 | var net = 0; // Профит | |
| 25 | var loseGames = 0; // Череда проигрышей | |
| 26 | var winGames = 0; // Череда выигрышей | |
| 27 | var maxBet = 0; // Максимальная ставка за игру | |
| 28 | var winProc = 0; // Выигрыш в процентах | |
| 29 | var timeStart = Date.now(); // Время начала работы бота | |
| 30 | var timeToMaxBet = 0; // Время максимальной ставки | |
| 31 | var timeToloseGames = 0; // Время максимальной череды неудач | |
| 32 | var timeTowinGames = 0; // Время максимальной череды удач | |
| 33 | // ================================================================ | |
| 34 | var busts = new Array(); // Массив сыгравших ставок | |
| 35 | var losePeriods = new Array(); // Массив времен для проигрышей | |
| 36 | var winsPeriods = new Array(); // Массив времен для выигрышей | |
| 37 | // ================================================================ | |
| 38 | var dataCollection = false; // Флаг сбора данных | |
| 39 | var Strategy = false; // Стратегия | |
| 40 | // ================================================================ | |
| 41 | var falseGames = 0; // Счетчик пропуска раундов | |
| 42 | var wins = 0; // Счетчик выигрышей | |
| 43 | var loses = 0; // Счетчик проигрышей | |
| 44 | var procStop = baseStop; // Счетчик % выигрыша для остановки | |
| 45 | // ================================================================ | |
| 46 | var h = 0; // часы | |
| 47 | var m = 0; // минуты | |
| 48 | var s = 0; // секунды | |
| 49 | var stopped = 0; // время остновки | |
| 50 | // ================================================================ | |
| 51 | engine.on('game_starting', function (data) {
| |
| 52 | StartGame(); | |
| 53 | }); | |
| 54 | // ================================================================ | |
| 55 | engine.on('game_started', function (data) {
| |
| 56 | ||
| 57 | }); | |
| 58 | // ================================================================ | |
| 59 | engine.on('game_crash', function (data) {
| |
| 60 | console.clear(); | |
| 61 | lastGamePlay = engine.lastGamePlay(); | |
| 62 | round += 1; | |
| 63 | last = data.game_crash / 100; | |
| 64 | busts.unshift(last); | |
| 65 | curBR = engine.getBalance(); | |
| 66 | if (curBR < minBR) {
| |
| 67 | minBR = curBR; | |
| 68 | } else if (curBR > maxBR) {
| |
| 69 | maxBR = curBR; | |
| 70 | } | |
| 71 | net = curBR - startBR; | |
| 72 | if (lastGamePlay == "WON") {
| |
| 73 | gamesWon += 1; | |
| 74 | } else if (lastGamePlay == "LOST") {
| |
| 75 | gamesLost += 1; | |
| 76 | } else {
| |
| 77 | unplayed += 1; | |
| 78 | } | |
| 79 | logRound(); | |
| 80 | }); | |
| 81 | // ================================================================ | |
| 82 | engine.on('cashed_out', function (data) {
| |
| 83 | if (data.username == userName) {
| |
| 84 | cashedOut = true; | |
| 85 | } else {
| |
| 86 | // Здесь будем собирать коэфициенты других игроков | |
| 87 | } | |
| 88 | }); | |
| 89 | // ================================================================ | |
| 90 | engine.on('player_bet', function (data) {
| |
| 91 | if (data.username == userName) {
| |
| 92 | cashedOut = false; | |
| 93 | } else {
| |
| 94 | // Здесь будем собирать ставки других игроков | |
| 95 | } | |
| 96 | }); | |
| 97 | // ================================================================ | |
| 98 | engine.on('msg', function (data) {
| |
| 99 | ||
| 100 | }); | |
| 101 | // ================================================================ | |
| 102 | engine.on('connect', function (data) {
| |
| 103 | ||
| 104 | }); | |
| 105 | // ================================================================ | |
| 106 | engine.on('disconnect', function (data) {
| |
| 107 | ||
| 108 | }); | |
| 109 | // ================================================================ | |
| 110 | function getTime(timeStop) {
| |
| 111 | if (!timeStop) {
| |
| 112 | var timeStop = Date.now(); | |
| 113 | } | |
| 114 | var timer = new Date(timeStop - timeStart); | |
| 115 | h = (timer.getHours() - 3); | |
| 116 | m = (timer.getMinutes()); | |
| 117 | s = (timer.getSeconds()); | |
| 118 | return h + ":" + m + ":" + s; | |
| 119 | } | |
| 120 | // ================================================================ | |
| 121 | function getBaseBet(proc) {
| |
| 122 | if (!proc) {
| |
| 123 | return 1; | |
| 124 | } else {
| |
| 125 | return (Math.floor(engine.getBalance() / 100 / proc)); | |
| 126 | } | |
| 127 | } | |
| 128 | // ================================================================ | |
| 129 | function cashOut() {
| |
| 130 | if (!cashedOut) {
| |
| 131 | engine.cashOut(); | |
| 132 | cashedOut = true; | |
| 133 | } | |
| 134 | } | |
| 135 | // ================================================================ | |
| 136 | function placeBet(bet, cash, autoCash) {
| |
| 137 | if (bet) {
| |
| 138 | if (bet > 0) {
| |
| 139 | if (cash) {
| |
| 140 | if (cash >= 1) {
| |
| 141 | if (enableBetting) {
| |
| 142 | cashedOut = false; | |
| 143 | cash = parseInt(cash * 100); | |
| 144 | engine.placeBet(bet * 100, cash, autoCash); | |
| 145 | } | |
| 146 | } | |
| 147 | } | |
| 148 | } | |
| 149 | } | |
| 150 | } | |
| 151 | // ================================================================ | |
| 152 | function getProc() {
| |
| 153 | return ((net / (startBR / 100)).toFixed(2)); | |
| 154 | } | |
| 155 | // ================================================================ | |
| 156 | function getWinsPeriod() {
| |
| 157 | if (winsPeriods.length > 0) {
| |
| 158 | return "\nСредний период стека выигрыша: " + getTime(median(winsPeriods)); | |
| 159 | } else {
| |
| 160 | return ""; | |
| 161 | } | |
| 162 | } | |
| 163 | function getLosePeriod() {
| |
| 164 | if (losePeriods.length > 0) {
| |
| 165 | return "\nСредний период стека проигрыша: " + getTime(median(losePeriods)); | |
| 166 | } else {
| |
| 167 | return ""; | |
| 168 | } | |
| 169 | } | |
| 170 | // ================================================================ | |
| 171 | function logRound() {
| |
| 172 | var timer = getTime(); | |
| 173 | var m1Busts = busts.slice(); | |
| 174 | var m2Busts = busts.slice(); | |
| 175 | var m3Busts = busts.slice(); | |
| 176 | var botTitleStr = "Afodar's BustaBitBot\n"; | |
| 177 | var timeStr = "\nВремя работы: " + getTime(false); | |
| 178 | var enableBettingStr = "\nСтавки включены: " + enableBetting; | |
| 179 | var baseBetStr = "\nБазовая ставка: " + baseBet; | |
| 180 | var roundStr = "\nРаунд: " + round; | |
| 181 | var lastStr = "\nСыграло в предыдущей игре: " + last; | |
| 182 | // ================================================================ | |
| 183 | var lastGamePlayStr = "\nПредыдущая игра: " + lastGamePlay; | |
| 184 | var startBRStr = "\nСтартовый банкролл: " + startBR; | |
| 185 | var maxBRStr = "\nМаксимальный банкролл: " + maxBR; | |
| 186 | var minBRStr = "\nМинимальный банкролл: " + minBR; | |
| 187 | var curBRStr = "\nТекущий банкролл: " + curBR; | |
| 188 | var balanceProcStr = "\nВыиграно % от банкролла: " + getProc(); | |
| 189 | var userNameStr = "\nАккаунт: " + userName; | |
| 190 | var gamesWonStr = "\nВыигано раудов: " + gamesWon; | |
| 191 | var gamesLostStr = "\nПроиграно раундов: " + gamesLost; | |
| 192 | var unplayedStr = "\nНе сыграно раундов: " + unplayed; | |
| 193 | var wonsStr = "\nЧереда выигрышей макс.: " + winGames + " [" + getTime(timeTowinGames) + "] назад"; | |
| 194 | var lostsStr = "\nЧереда проигрышей макс.: " + loseGames + " [" + getTime(timeToloseGames) + "] назад"; | |
| 195 | var maxBetStr = "\nМаксимальная ставка: " + maxBet + " [" + getTime(timeToMaxBet) + "] назад"; | |
| 196 | var meanStr = "\nСредняя по коэфициентам: " + mean(m1Busts).toFixed(2); | |
| 197 | var medianStr = "\nЭкспоненциональная по коэфициентам: " + median(m2Busts).toFixed(2); | |
| 198 | var modeStr = "\nНаиболее часто играющий коэфициент: " + mode(m3Busts).toFixed(2); | |
| 199 | var netStr = "\nПрофит: " + net; | |
| 200 | console.log("\n" +
| |
| 201 | botTitleStr + | |
| 202 | timeStr + | |
| 203 | enableBettingStr + | |
| 204 | baseBetStr + | |
| 205 | roundStr + | |
| 206 | lastStr + | |
| 207 | lastGamePlayStr + | |
| 208 | startBRStr + | |
| 209 | maxBRStr + | |
| 210 | minBRStr + | |
| 211 | curBRStr + | |
| 212 | balanceProcStr + | |
| 213 | userNameStr + | |
| 214 | gamesWonStr + | |
| 215 | gamesLostStr + | |
| 216 | unplayedStr + | |
| 217 | wonsStr + | |
| 218 | getWinsPeriod() + | |
| 219 | lostsStr + | |
| 220 | getLosePeriod() + | |
| 221 | maxBetStr + | |
| 222 | meanStr + | |
| 223 | medianStr + | |
| 224 | modeStr + | |
| 225 | netStr + | |
| 226 | "\n" | |
| 227 | // busts | |
| 228 | ); | |
| 229 | } | |
| 230 | // Для сортировки массива | |
| 231 | // ================================================================ | |
| 232 | numberSort = function (a, b) {
| |
| 233 | return a - b; | |
| 234 | }; | |
| 235 | ||
| 236 | // Средняя из массива | |
| 237 | // ================================================================ | |
| 238 | function mean(arr) {
| |
| 239 | if (arr) {
| |
| 240 | if (arr.constructor === Array) {
| |
| 241 | if (arr.length >= 1) {
| |
| 242 | var sum = 0; | |
| 243 | for (var i = 0; i < arr.length; i++) {
| |
| 244 | sum += arr[i]; | |
| 245 | } | |
| 246 | return (sum / arr.length); | |
| 247 | } | |
| 248 | } | |
| 249 | } | |
| 250 | return -1; | |
| 251 | } | |
| 252 | ||
| 253 | // Экспоненциональная средняя из массива | |
| 254 | // ======================================================= | |
| 255 | function median(arr) {
| |
| 256 | if (arr) {
| |
| 257 | if (arr.constructor === Array) {
| |
| 258 | if (arr.length >= 1) {
| |
| 259 | arr = arr.sort(numberSort); | |
| 260 | if ((arr.length % 2) == 0) {
| |
| 261 | // Even | |
| 262 | return (((arr[arr.length / 2] + arr[(arr.length / 2) - 1])) / 2); | |
| 263 | } else {
| |
| 264 | // Odd | |
| 265 | return (arr[Math.floor(arr.length / 2)]) | |
| 266 | } | |
| 267 | } | |
| 268 | } | |
| 269 | } | |
| 270 | return -1; | |
| 271 | } | |
| 272 | ||
| 273 | // Подсчет экспоненциональная средней разрыва между коэфициентами | |
| 274 | // ======================================================= | |
| 275 | function stepMA(arr, cr) {
| |
| 276 | if (arr) {
| |
| 277 | if (arr.constructor === Array) {
| |
| 278 | if (arr.length >= 1) {
| |
| 279 | var stepsMA = []; | |
| 280 | var stepInc = 0; | |
| 281 | for (var i = 0; i < arr.length; i++) {
| |
| 282 | stepInc++; | |
| 283 | if (((arr[i] >= cr) && (arr[i] < (cr + 1))) || ((arr[i] >= cr) && (cr == 5))) {
| |
| 284 | stepsMA.push(stepInc); | |
| 285 | stepInc = 0; | |
| 286 | } | |
| 287 | } | |
| 288 | var sArr = stepsMA.sort(); | |
| 289 | return mean(sArr); | |
| 290 | } | |
| 291 | } | |
| 292 | } | |
| 293 | return -1; | |
| 294 | } | |
| 295 | ||
| 296 | // Подсчет количества коэфициентов с начала массива до запрашиваемого коэфицента | |
| 297 | // ======================================================= | |
| 298 | function stepCR(arr, cr) {
| |
| 299 | if (arr) {
| |
| 300 | if (arr.constructor === Array) {
| |
| 301 | if (arr.length >= 1) {
| |
| 302 | for (var i = 0; i < arr.length; i++) {
| |
| 303 | if (((arr[i] >= cr) && (arr[i] < (cr + 1))) || ((arr[i] >= cr) && (cr == 5))) {
| |
| 304 | return (i + 1); | |
| 305 | } | |
| 306 | } | |
| 307 | } | |
| 308 | } | |
| 309 | } | |
| 310 | return -1; | |
| 311 | } | |
| 312 | ||
| 313 | // Поиск наиболее встречающегося элемента в массиве | |
| 314 | // ======================================================= | |
| 315 | function mode(arr) {
| |
| 316 | if (arr) {
| |
| 317 | if (arr.constructor === Array) {
| |
| 318 | if (arr.length < 1) {
| |
| 319 | return -2; | |
| 320 | } else {
| |
| 321 | var modeMap = {};
| |
| 322 | var maxEl = arr[0], maxCount = 1; | |
| 323 | for (var i = 0; i < arr.length; i++) {
| |
| 324 | var el = arr[i]; | |
| 325 | if (modeMap[el] == null) {
| |
| 326 | modeMap[el] = 1; | |
| 327 | } else {
| |
| 328 | modeMap[el]++; | |
| 329 | } | |
| 330 | if (modeMap[el] > maxCount) {
| |
| 331 | maxEl = el; | |
| 332 | maxCount = modeMap[el]; | |
| 333 | } | |
| 334 | } | |
| 335 | if (maxCount == 1) {
| |
| 336 | return -3; | |
| 337 | } | |
| 338 | return maxEl; | |
| 339 | } | |
| 340 | } | |
| 341 | } | |
| 342 | return -1; | |
| 343 | } | |
| 344 | function StartGame() {
| |
| 345 | // Сбор данных до начала игры | |
| 346 | // ======================================================= | |
| 347 | function DataCollection(sample) {
| |
| 348 | if (round < sample) {
| |
| 349 | console.log("======Сбор данных======");
| |
| 350 | console.log("Осталось сборать " + (sample - round));
| |
| 351 | console.log(" ");
| |
| 352 | } else {
| |
| 353 | console.log("======Данные собраны включаем тактику PI======");
| |
| 354 | console.log(" ");
| |
| 355 | dataCollection = true; | |
| 356 | Strategy = "FLY"; | |
| 357 | } | |
| 358 | } | |
| 359 | // Стратегия GI(1-10) | |
| 360 | // ======================================================= | |
| 361 | function GI() {
| |
| 362 | lastGamePlay = engine.lastGamePlay(); | |
| 363 | console.log("Последние два коэфициента " + busts[0] + " / " + busts[1]);
| |
| 364 | if (lastGamePlay == "LOST") {
| |
| 365 | GI_bet = GI_bet * 2; | |
| 366 | if (GI_bet > maxBet) {
| |
| 367 | maxBet = GI_bet; | |
| 368 | } | |
| 369 | if (loseGames > 6) {
| |
| 370 | loseGames = 0; | |
| 371 | GI_bet = baseBet; | |
| 372 | } | |
| 373 | } else if (lastGamePlay == "WON") {
| |
| 374 | GI_bet = baseBet; | |
| 375 | loseGames = 0; | |
| 376 | } | |
| 377 | if ((busts[0] < 1.97) && (busts[1] < 1.97)) {
| |
| 378 | falseGames++; | |
| 379 | if (falseGames > 3) {
| |
| 380 | GI_crash = 0; | |
| 381 | for (i = 5; i >= 2; i--) {
| |
| 382 | var arrL = busts; | |
| 383 | var s_CR = stepCR(arrL, i); | |
| 384 | var arrL = busts; | |
| 385 | var s_MA = stepMA(arrL, i); | |
| 386 | if (((s_CR > 0) && (s_MA > 0)) && (s_CR > s_MA)) {
| |
| 387 | GI_crash = i; | |
| 388 | break; | |
| 389 | } | |
| 390 | } | |
| 391 | if (GI_crash > 0) {
| |
| 392 | console.log("======GI 2R======");
| |
| 393 | console.log(" Ставка: " + GI_bet);
| |
| 394 | console.log(" Коэфициент: " + GI_crash);
| |
| 395 | console.log(" ");
| |
| 396 | placeBet(GI_bet, GI_crash, false); | |
| 397 | } | |
| 398 | falseGames = 0; | |
| 399 | } else {
| |
| 400 | console.log("Условие на 2 красных выполнено. Осталось дождаться ещё " + (3 - falseGames) + " совпадений данного условия.");
| |
| 401 | } | |
| 402 | } else {
| |
| 403 | console.log("Условие на 2 красных не выполнено. Ждем.");
| |
| 404 | } | |
| 405 | } | |
| 406 | // Стратегия FLY(1.05) | |
| 407 | // ======================================================= | |
| 408 | function FLY() {
| |
| 409 | if (lastGamePlay == "LOST") {
| |
| 410 | loses++; | |
| 411 | if (loses % 2) {
| |
| 412 | FLY_bet++; | |
| 413 | } | |
| 414 | FLY_crash = FLY_crash + (0.3 + (loses / 100)); | |
| 415 | } else if (lastGamePlay == "WON") {
| |
| 416 | loses = 0; | |
| 417 | FLY_bet = 1; | |
| 418 | FLY_crash = 10; | |
| 419 | } | |
| 420 | placeBet(FLY_bet, FLY_crash, false); | |
| 421 | } | |
| 422 | // Стратегия PI(1.37) | |
| 423 | // ======================================================= | |
| 424 | function PI() {
| |
| 425 | if (lastGamePlay == "LOST") {
| |
| 426 | var multiple = 2.3; | |
| 427 | loses++; | |
| 428 | if (loses > 3) {
| |
| 429 | var t_s = (losePeriods.length > 0) ? losePeriods[0] : timeStart; | |
| 430 | var t_e = Date.now(); | |
| 431 | losePeriods.push(t_e - t_s); | |
| 432 | } | |
| 433 | wins = 0; | |
| 434 | if (loses > loseGames) {
| |
| 435 | loseGames = loses; | |
| 436 | timeToloseGames = Date.now(); | |
| 437 | } | |
| 438 | if (loses > 4) {
| |
| 439 | PI_bet = 1; | |
| 440 | } else {
| |
| 441 | if (busts[0] != 0) {
| |
| 442 | PI_bet = Math.floor(PI_bet * multiple * busts[0]); | |
| 443 | } else {
| |
| 444 | PI_bet = Math.floor(PI_bet * 3); | |
| 445 | } | |
| 446 | } | |
| 447 | if (PI_bet > maxBet) {
| |
| 448 | maxBet = PI_bet; | |
| 449 | timeToMaxBet = Date.now(); | |
| 450 | } | |
| 451 | } else if (lastGamePlay == "WON") {
| |
| 452 | wins++; | |
| 453 | if (wins > 3) {
| |
| 454 | var t_s = (winsPeriods.length > 0) ? winsPeriods[0] : timeStart; | |
| 455 | var t_e = Date.now(); | |
| 456 | winsPeriods.push(t_e - t_s); | |
| 457 | } | |
| 458 | if (wins > winGames) {
| |
| 459 | winGames = wins; | |
| 460 | timeTowinGames = Date.now(); | |
| 461 | } | |
| 462 | PI_bet = baseBet; | |
| 463 | loses = 0; | |
| 464 | } | |
| 465 | var PI_crash = 0; | |
| 466 | var m1Busts = busts.slice(); | |
| 467 | var m2Busts = busts.slice(); | |
| 468 | var m3Busts = busts.slice(); | |
| 469 | var sa = parseFloat(mean(m1Busts).toFixed(2)); | |
| 470 | var se = parseFloat(median(m2Busts).toFixed(2)); | |
| 471 | var chi = parseFloat(mode(m3Busts).toFixed(2)); | |
| 472 | if (sa > 0 && se > 0 && chi > 0) {
| |
| 473 | if ((se * 2 < sa) && (se > chi) && (se > 1.1)) {
| |
| 474 | if (getProc() > procStop && lastGamePlay != "LOST") {
| |
| 475 | if (stopped == 0) {
| |
| 476 | stopped = Date.now() + parseInt(Math.random() * 10800000 + 1); | |
| 477 | } | |
| 478 | var lastTime = new Date(stopped - Date.now()); | |
| 479 | if (lastTime > 0) {
| |
| 480 | console.log("======PI T1======");
| |
| 481 | console.log("Игра окончена. Следующий старт игры через [" + getTime(lastTime) + "]");
| |
| 482 | console.log(" ");
| |
| 483 | } else {
| |
| 484 | stopped = 0; | |
| 485 | procStop += baseStop; | |
| 486 | } | |
| 487 | } | |
| 488 | PI_crash = parseFloat(((Math.random() * (se - chi)) + chi).toFixed(2)); | |
| 489 | console.log("======PI T1======");
| |
| 490 | console.log(" Ставка: " + PI_bet);
| |
| 491 | console.log(" Коэфициент: " + PI_crash);
| |
| 492 | console.log(" ");
| |
| 493 | placeBet(PI_bet, PI_crash, false); | |
| 494 | } | |
| 495 | console.log("======PI T1======");
| |
| 496 | console.log(" SA: " + sa);
| |
| 497 | console.log(" SE: " + se);
| |
| 498 | console.log(" CHI: " + chi);
| |
| 499 | console.log(" ");
| |
| 500 | } else {
| |
| 501 | console.log("======PI T1======");
| |
| 502 | console.log(" SA: " + sa);
| |
| 503 | console.log(" SE: " + se);
| |
| 504 | console.log(" CHI: " + chi);
| |
| 505 | console.log(" ");
| |
| 506 | } | |
| 507 | } | |
| 508 | // Стратегия PlusCoup | |
| 509 | // ======================================================= | |
| 510 | function PlusCoup() {
| |
| 511 | console.log("======PlusCoup IS NOT DEFINED MODE======");
| |
| 512 | console.log("======END GAME PLEASE======");
| |
| 513 | } | |
| 514 | if (!dataCollection) {
| |
| 515 | DataCollection(0); | |
| 516 | } else {
| |
| 517 | switch (Strategy) {
| |
| 518 | case "GI": | |
| 519 | GI(); | |
| 520 | break; | |
| 521 | case "FLY": | |
| 522 | FLY(); | |
| 523 | break; | |
| 524 | case "PI": | |
| 525 | PI(); | |
| 526 | break; | |
| 527 | case "PlusCoup": | |
| 528 | PlusCoup(); | |
| 529 | break; | |
| 530 | } | |
| 531 | } | |
| 532 | } |