Skip to content
DiceSim

Oscar's Grind · 49.5% chance

Oscar's Grind dice strategy script (Lua)

Oscar's Grind plays in cycles, and each cycle aims to finish one unit ahead. This dice script bets 49.5% for a 2.00x payout and uses the base bet as the unit. After a loss the bet stays the same. After a win it goes up by one unit, unless a smaller bet is enough to bring the cycle to +1 unit.

When the cycle reaches +1 unit, the script starts a new one at the base bet. A straight losing run costs one unit per loss, because the bet does not grow after a loss. The bet grows during stretches of mixed wins and losses while the cycle is still behind.

The script

Lua 5.4 with DiceBot-style globals. The top level runs once to set chance and the first nextbet, then dobet() runs after every roll. Every global is described in the Lua reference.

luaoscars-grind.lua
-- Oscar's Grind (+1 unit per cycle)
-- Each cycle aims to finish exactly one unit (the base bet) ahead. Keep the bet after a
-- loss, raise it by one unit after a win, but never above the amount that would take
-- the cycle past +1 unit. When the cycle reaches +1 unit, start a new one.

chance  = 49.5
bethigh = false

basebet = params.basebet or balance / 5000
nextbet = basebet

local unit   = basebet                       -- one unit = the base bet
local payout = (100 - houseedge) / chance    -- 2.00x at a 1% house edge

local cycleProfit = 0

function dobet()
  if win then
    cycleProfit = cycleProfit + previousbet * (payout - 1)
  else
    cycleProfit = cycleProfit - previousbet
  end

  -- cycle complete: bank the unit and start over
  if cycleProfit >= unit - unit * 1e-9 then
    cycleProfit = 0
    nextbet = unit
    return
  end

  local bet = previousbet
  if win then
    bet = previousbet + unit
  end

  -- never bet more than a win needs to finish the cycle at +1 unit
  local needed = (unit - cycleProfit) / (payout - 1)
  if bet > needed then
    bet = needed
  end
  nextbet = bet
end

How it works

  1. chance = 49.5 and bethigh = false win on a roll below 49.5.
  2. basebet is params.basebet or balance / 5000, which is 0.02% of the starting balance.
  3. unit is set to basebet. payout = (100 - houseedge) / chance is worked out once at the start: 2.00x at a 1% house edge. cycleProfit starts at 0.
  4. In dobet(), a win adds previousbet * (payout - 1) to cycleProfit and a loss subtracts previousbet.
  5. If cycleProfit has reached one unit (with a tiny allowance for rounding), it goes back to 0 and the next bet is one unit.
  6. Otherwise the next bet is previousbet, plus one unit after a win. It is then capped at (unit - cycleProfit) / (payout - 1), the bet that would finish the cycle at exactly +1 unit if it wins.

Risk at a glance

Settings: 49.5% chance, 1% house edge, starting balance 0.005 (the template default, BTC in the simulator), base bet 0.000001 (balance / 5000).

Payout2.00x(100 - 1) / 49.5
Single ruin streakNoneThis script can run out of money without one long losing streak, so no single streak length marks the end. See the table below.

The calculator's model raises the bet after a loss, which Oscar's Grind never does. In a straight losing run every bet is one unit, so the table below shows small numbers. The bet grows only after wins that leave the cycle behind, so the risk is a long cycle of mixed results, where the bet climbs and each loss at the higher bet costs more. The house edge applies to every bet either way.

Cost of a straight losing run from a fresh start
Losses in a rowChance of the streakResult from a fresh start
101 in 927 (0.108%)Lost 0.00001 (0.2%), next bet 0.000001
151 in 28,225 (0.0035%)Lost 0.000015 (0.3%), next bet 0.000001
201 in 859,355 (0.00012%)Lost 0.00002 (0.4%), next bet 0.000001

Theoretical figures for a fresh start, not a simulation. The chance of N losses in a row is qN with q = 1 - chance / 100, the same formula the dice calculator uses. None of this changes the expected result: at a 1% house edge the average loss is 1% of the total wagered, whatever the progression.

Tuning it

Each setting below is read as params.name or default, so the script runs with the default until something passes a value in.

Parameters read by the Oscar's Grind script
ParamDefaultWhat changing it does
params.basebetbalance / 5000One unit: the first bet of every cycle, the step added after a win, and the profit each cycle aims for.

There is no stop rule or bet cap in this script. If you want one, add a check in dobet() that calls stop() when nextbet passes a limit you choose.

FAQ

Does Oscar's Grind win in the long run on dice?

No. Every completed cycle ends exactly one unit up, which makes the balance look steady, but the house edge applies to every bet. Over many rolls the expected result is a loss of about 1% of the total wagered. It tends to arrive as an occasional long cycle with large bets.

Why does the script sometimes bet less than the last bet plus one unit?

Oscar's Grind never bets more than it takes to finish the cycle at +1 unit. If the cycle is 1 unit behind, a win on a 2 unit bet at 2.00x brings it to +1, so the bet is held at 2 units even when the rule would raise it further. The script works this out as (unit - cycleProfit) / (payout - 1).

Does a losing streak raise the bet?

No. A loss keeps the same bet, so 20 losses in a row from the start of a cycle cost 20 units. The bet grows only after a win that leaves the cycle short of +1 unit, and once it has grown, every later loss costs the larger amount.

Can I run this script in DiceBot or another Lua dice bot?

The script uses the global names from Seuntjie's DiceBot (chance, bethigh, nextbet, previousbet, win, dobet()). The params table only exists in DiceSim, so replace each params.name or value with the value before you paste it into another bot. It also reads houseedge, so check that your bot provides it. DiceSim itself never places bets on a casino.

Other scripts

Martingale

Doubles the bet after each loss and goes back to the base bet after a win.

Chance
49.5%
Type
Martingale

Delayed escalation

Bets 3.35% for a 29.55x payout. Flat bets through 50 losses, then 4% more per loss.

Chance
3.35%
Type
Dynamic scaling

Paroli 3-step

Doubles after a win, banks the profit after 3 wins in a row, resets on any loss.

Chance
49.5%
Type
Paroli

Dynamic recovery

Sizes each bet so one win recovers the drawdown plus one base bet, capped at 10% of balance.

Chance
33%
Type
Recovery

D'Alembert

Adds one unit after a loss and removes one after a win, never going below the base bet.

Chance
49.5%
Type
D'Alembert

Labouchere

Bets the first plus the last number of a list. Wins cross numbers off, losses add one.

Chance
49.5%
Type
Labouchere

Fibonacci

Bets follow the Fibonacci sequence: one step up after a loss, two steps back after a win.

Chance
49.5%
Type
Fibonacci

1-3-2-6

Bets 1, 3, 2 and 6 units on consecutive wins. Any loss, or the 4th win, resets to 1.

Chance
49.5%
Type
Positive progression

Flat betting

Same bet on every roll, with a stop loss and a take profit at 10% of the starting balance.

Chance
49.5%
Type
Flat betting

Martingale + vault

Martingale that moves half of every 1% profit step to the vault with vault().

Chance
49.5%
Type
Martingale