stake-simulator / src /streamlit_app.py
widichandra's picture
Upload streamlit_app.py
83e89fc verified
Raw
History Blame Contribute Delete
3.23 kB
import streamlit as st
import pandas as pd
import random
import hmac
import hashlib
st.set_page_config(page_title="Stake Dice Strategy - v2.3", layout="wide")
st.title("🎲 Stake Dice Auto Strategy Simulator - v2.3 (Manual-Only Features)")
st.sidebar.header("Simulation Settings")
initial_balance = st.sidebar.number_input("Starting Balance (USD)", value=200.0)
base_bet = st.sidebar.number_input("Base Bet (USD)", value=0.0001, step=0.0001, format="%.4f")
num_bets = st.sidebar.number_input("Number of Bets", value=5000, step=1000)
num_runs = st.sidebar.number_input("Number of Runs", value=5, step=1)
random_seed = st.sidebar.number_input("Random Seed", value=42, step=1)
random.seed(random_seed)
st.sidebar.markdown("---")
st.sidebar.subheader("πŸ” Provably Fair Dice (Optional)")
use_provably_fair = st.sidebar.checkbox("Use Provably Fair Dice", value=False)
client_seed = st.sidebar.text_input("Client Seed", value="widichandra")
server_seed = "serverseed123"
house_edge = 1.0
def roll_dice(nonce):
if use_provably_fair:
message = f"{client_seed}:{nonce}"
hmac_hash = hmac.new(server_seed.encode(), message.encode(), hashlib.sha256).hexdigest()
int_val = int(hmac_hash[:13], 16)
float_val = int_val / float(2**52)
roll = (float_val * 10001) / 100
return min(round(roll, 5), 100.00000)
else:
roll = (random.random() * 10001) / 100
return min(round(roll, 5), 100.00000)
def simulate_v23(run_id):
balance = initial_balance
bet = base_bet
win_chance = 2.02
multiplier = (100 - house_edge) / win_chance
win_streak = 0
loss_count = 0
over_under = "Under"
max_bet_cap = initial_balance * 0.2
data = []
for i in range(num_bets):
if balance < bet or bet > max_bet_cap:
break
roll = roll_dice(i + run_id * num_bets)
is_win = roll < win_chance if over_under == "Under" else roll > (100 - win_chance)
result = {
"Run": run_id,
"Round": i + 1,
"Bet": bet,
"Roll": roll,
"Over/Under": over_under
}
if is_win:
win = bet * multiplier
balance += win - bet
bet = base_bet
win_streak += 1
loss_count = 0
if win_streak % 2 == 0:
over_under = "Over" if over_under == "Under" else "Under"
else:
balance -= bet
loss_count += 1
win_streak = 0
if loss_count % 10 == 0:
bet *= 2
bet = min(bet, max_bet_cap)
result["Balance"] = round(balance, 4)
result["Result"] = "Win" if is_win else "Loss"
data.append(result)
df = pd.DataFrame(data)
return df
st.subheader("πŸ“Š Simulation Result")
all_data = []
for run in range(1, num_runs + 1):
df = simulate_v23(run)
df["Strategy"] = "Improved v2.3 (Manual Only)"
all_data.append(df)
result_df = pd.concat(all_data, ignore_index=True)
st.dataframe(result_df)
st.download_button("πŸ“₯ Download CSV", data=result_df.to_csv(index=False), file_name="stake_dice_v23_simulation.csv")
with st.expander("πŸ” Show Full Log"):
st.dataframe(result_df)