Bitcoin Forum
December 12, 2024, 02:46:06 AM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1] 2 »  All
  Print  
Author Topic: BOTDICE online simulator - play 100k Just-Dice / Satoshidice rounds for free  (Read 5899 times)
GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
March 29, 2013, 04:45:23 PM
Last edit: July 18, 2013, 08:08:08 PM by GCInc.
 #1

We have released a test version of BotDice.

UPDATE 2013-07-18: Just-Dice.com simulation added!

Simulate thousands of Just-Dice / Satoshidice rounds with automatic progression and see how much you would win or lose with your betting strategy.

From the simple options menu you can customize your bet progression extensively. Simulation lengths available are 100 or 1000 bets, just once or 100 sessions in a row. Current options include the following:

Max rounds to play    
Initial bankroll (cash)    
Target profit %   
Game type
Payout multiplier on win
Payout multiplier on loss
   
Initial bet amount    
Adjust bet after win    
Adjust bet after loss   
Reset to initial bet after wins in a row
Reset to initial bet after losses in a row
Maximum single bet
Transaction fee per bet   
Single session (show all bets) or big data (100 sessions just results)


Try it out and see the statistical value of your strategy before risking your monies and wasting time on the Just-Dice / Satoshidice site in an attempt to find out the best strategy! It's also eye opening to notice how large effect the nasty transaction fees or their absence have on your final profit.

Special thanks to mem for the inspiration arising from his memtingale simulator giving the igniting spark for this project!

Project will be updated more or less regularly. It's still very early alpha. Please report any errors or requests to this thread.

mc_lovin
Legendary
*
Offline Offline

Activity: 1190
Merit: 1000


www.bitcointrading.com


View Profile WWW
March 29, 2013, 07:51:17 PM
 #2

Fantastic!

But when I change the game type, the multipliers don't change? 
GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
March 29, 2013, 07:53:05 PM
 #3

But when I change the game type, the multipliers don't change? 
Right, that's unfortunately still work in progress.. due to be updated when I can find 30 minutes extra for the frustrating stint Smiley

Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
March 29, 2013, 09:43:02 PM
 #4

Cool idea but I'm pretty sure the bets are not working correctly or I'm not understanding how to input correctly.

ex. I do a run

bet 1 loss bet .01
bet 2 win bet .01

Maybe it's just me but the second bet should have been at least .02.

It's like the bets for win/loss is placed after the win/loss is determined, because I then will have a string of losses where my bet increases, or same on wins.


added

I'm pretty sure that instead of resets based on number of bets it needs to be conditional on win after loss. Then max increase amount is based on balance of bank or amount of bank at risk for the game.

The increase during wins is a nice feature, but at times when there is a loss the bet decreases on the first loss???


added

bet progression issue.

#    lucky number    bet    win    Profit
0    21280    0.010    0.0190700    0.0090700

1    47454    0.020    -0.0204900    -0.0114200
2    63734    0.040    -0.0404800    -0.0519000
3    62849    0.060    -0.0604700    -0.1123700

4    19732    0.080    0.1560600       -0.0363100
5    21103    0.090    0.1756300        0.0493200
6    00138    0.100    0.1952000      0.1445200

7    48626    0.010    -0.0104950    0.1340250
8    32777    0.010    -0.0104950    0.1235300
9    44185    0.010    -0.0104950    0.1130350
10    64938    0.010    -0.0104950    0.1025400
11    57191    0.010    -0.0104950    0.0920450
12    55645    0.010    -0.0104950    0.0815500
13    57211    0.010    -0.0104950    0.0710550

14    18680    0.010    0.0190700      0.0801250

15    47337    0.020    -0.0204900    0.0596350
16    44899    0.040    -0.0404800    0.0191550
17    52247    0.060    -0.0604700    -0.0413150
18    60597    0.080    -0.0804600    -0.1217750

19    12904    0.100    0.1952000      -0.0265750
20    11133    0.110    0.2147700       0.0781950
21    19271    0.120    0.2343400       0.1925350

22    36121    0.010    -0.0104950    0.1820400
23    34679    0.010    -0.0104950    0.1715450
24    48329    0.010    -0.0104950    0.1610500

GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
March 29, 2013, 10:00:03 PM
 #5

Maybe it's just me but the second bet should have been at least .02.
On what progression plan? Please detail the settings you use for us to be able to spot the errors. There may be issues at this stage.

Quote
The increase during wins is a nice feature, but at times when there is a loss the bet decreases on the first loss???
Yes, if you go with the default settings the bet is decreased after a loss occurs (-0.01).

Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
March 29, 2013, 10:07:41 PM
 #6

Greatness you used 65536 numbers for the random number.  I was going to add that to mem's.


It seems like the variable(s) for the bets is getting overwritten/reset in a conditional in the loop.


21:47:00
Max rounds to play:      100
Initial bankroll (cash):   10
Target cash:         cash +50%
Game type:         32768
Win multiplier:         1.957
Start bet:         0.01
Adjustment after win:   0.0
Adjustment after loss:   0.022

#    lucky number    bet    win    Profit

0    64906    0.010    -0.0104950    -0.0104950
1    59444    0.010    -0.0104950    -0.0209900

2    8514    0.010    0.0190700    -0.0119200
3    5710    0.010    0.0190700    -0.0028500

4    65254    0.010    -0.0104950    -0.0133450
5    50497    0.010    -0.0104950    -0.0238400

6    23879    0.010    0.0190700    -0.0147700
7    8256    0.010    0.0190700    -0.0057000
8    21565    0.010    0.0190700    0.0033700
9    12388    0.010    0.0190700    0.0124400

10    35310    0.010    -0.0104950    0.0019450
11    43254    0.010    -0.0104950    -0.0085500
12    57363    0.010    -0.0104950    -0.0190450
13    43450    0.010    -0.0104950    -0.0295400

14    15149    0.010    0.0190700    -0.0204700

15    64072    0.010    -0.0104950    -0.0309650
16    43447    0.010    -0.0104950    -0.0414600
17    34175    0.010    -0.0104950    -0.0519550
18    51739    0.010    -0.0104950    -0.0624500



--------------------------------------

21:49:03
Max rounds to play:      100
Initial bankroll (cash):   10
Target cash:         cash +50%
Game type:         32768
Win multiplier:         1.957
Start bet:         0.01
Adjustment after win:   0.006
Adjustment after loss:   0.028


#    lucky number    bet    win    Profit
0    31475    0.010    0.0190700    0.0090700

1    37085    0.016    -0.0164920    -0.0074220
2    26712    0.044    0.0856080    0.0341860
3    48105    0.050    -0.0504750    -0.0162890
4    52380    0.078    -0.0784610    -0.0947500

5    2522    0.106    0.2069420    0.0061920

6    58901    0.112    -0.1124440    -0.1062520

7    9724    0.140    0.2734800    0.0272280
8    9565    0.146    0.2852220    0.1664500
9    49525    0.152    -0.1524240    0.0140260
10    60013    0.180    -0.1804100    -0.1663840
11    57090    0.208    -0.2083960    -0.3747800
12    57804    0.236    -0.2363820    -0.6111620
13    46878    0.264    -0.2643680    -0.8755300
14    56916    0.292    -0.2923540    -1.1678840

15    28316    0.320    0.6257400    -0.8621440
16    24838    0.326    0.6374820    -0.5506620
17    30130    0.332    0.6492240    -0.2334380
18    4186    0.338    0.6609660    0.0895280
19    2321    0.344    0.6727080    0.4182360

20    49428    0.350    -0.3503250    0.0679110
21    38101    0.378    -0.3783110    -0.3104000
GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
March 29, 2013, 10:15:29 PM
 #7

I am unable to reproduce the first series given your settings. Are you sure you didn't use max bet 0.01 or such (not every setting is displayed in the result page)?

Could you point out the error in the second sequence you quoted?

Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
March 29, 2013, 10:28:41 PM
Last edit: March 29, 2013, 10:39:04 PM by Grover
 #8

I am unable to reproduce the first series given your settings. Are you sure you didn't use max bet 0.01 or such (not every setting is displayed in the result page)?

Could you point out the error in the second sequence you quoted?

I change the loss setting to positive.  Neg/subtracting from the previous bet after a loss is not how I play the system.  I've never seen that system before.  Seems to me subtracting causes you to put funds at risk with the goal of getting a smaller return so then when a win is reached the payoff does not cover the total of all the previous losses.

What is the purpose of subtracting after a loss?

example. (I just picked numbers to increase that were about 2.5x+ greater than the previous loss.  I add .006 on wins in this example for no reason.)

bet   amt    w/l
1      .01     w
2      .016   w
3      .022     l
4      .05       l
5      .13       l
6      .3        l
7      .8        w
8      .01      w
9      .016    l
10    .04      w
11    .01      w
etc...
GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
March 29, 2013, 10:37:31 PM
 #9

What is the purpose of subtracting after a loss?
Anything. The negative figure in the default setup is there to have readily an example of substraction.

Personally I have found the reverse progression work nicely on some game types and settings, because it catches winning streaks and decreases losses on losing streaks.

Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
March 29, 2013, 11:26:35 PM
 #10

What is the purpose of subtracting after a loss?
Anything. The negative figure in the default setup is there to have readily an example of substraction.

Personally I have found the reverse progression work nicely on some game types and settings, because it catches winning streaks and decreases losses on losing streaks.


I see.  But you can't predict wins or losses.  Wins are safe zones.  With memtingale a loss means the next bet is 2.n times greater than the first lost bet.  This is to recoup more than the first loss times the win multiplier if you assume the loss was a win.

Here's the output sample from Not@Las' pure martingale bot (copied from here - https://bitcointalk.org/index.php?topic=80245.0)

The bets are increased 2x during a losing round then reset to the original 0.01 bet after the first win after a loss.  memtingale's system is Martingale but instead of a 2x multiplier you use a 2.n x multiplier to increase payout for a win.

Mem's sim follows the same rules as the bot.

Code:
Game #1
Balance: 11.37567619       Bet: 0.01       Fee: 0.0005       Total Fees: 0.0005
Balance: 11.36517619       Waiting...
Balance: 11.36521708       Lose!

Game #2
Balance: 11.36521708       Bet: 0.02       Fee: 0.0005       Total Fees: 0.001
Balance: 11.34471708       Waiting.........
Balance: 11.34479886       Lose!

Game #3
Balance: 11.34479886       Bet: 0.04       Fee: 0.0005       Total Fees: 0.0015
Balance: 11.30429886       Waiting...
Balance: 11.38554886       Win! (1 out of 3)

Game #4
Balance: 11.38554886       Bet: 0.01       Fee: 0.0005       Total Fees: 0.002
Balance: 11.37504886       Waiting.....
Balance: 11.37508975       Lose!



GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
March 30, 2013, 05:22:03 AM
 #11

I know how Martingale progression works. I do not find it superior to progression systems with static increase and decrease. Currently Botdice allows much wider customization of bets than doubling up on loss. Buy don't worry, the  basic progression scheme of multiplying your previous bet will be added soon as well, so you can compare yourself how  massive losses you'll get on average of 100.000 bets or even a single run of 1000 bets.

Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
March 30, 2013, 06:42:05 AM
Last edit: March 30, 2013, 07:17:47 AM by Grover
 #12

I know how Martingale progression works. I do not find it superior to progression systems with static increase and decrease. Currently Botdice allows much wider customization of bets than doubling up on loss. Buy don't worry, the  basic progression scheme of multiplying your previous bet will be added soon as well, so you can compare yourself how  massive losses you'll get on average of 100.000 bets or even a single run of 1000 bets.

It's a great app.

What settings do you use for best results?

added

And apologies for me not getting it.  Day off, I was in a different mind.
GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
March 30, 2013, 07:17:02 AM
 #13

BOTDICE updated to v0.55a

- fixed max and min bet limits
- fixed round number to start from 1
- added multiplication progression adjustments (making Martingale possible)
- added script benchmark


It's a great app.

What settings do you use for best results?
Thanks, I hope you like it now even more  Smiley.

Discussing the settings you can spend half of you life... but generally, I have an impression that settings increasing the bets towards the end of session rather than adjusting them down yield more. Someone proficient in math could chime in to evaluate whether that can combat the negative estimated value somewhat in a limited session.

Also, I prefer catching winning streaks by increasing bets on a 50%+ odds game type, but I'm not sure to what extent this affects the total profit with what limitations.

Naturally, with the house edge and fees taken into account, you'll fare best with the smallest number of bets and largest stakes. But it's rather interesting to run tests without house edge and fees.


Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
April 01, 2013, 02:18:19 AM
 #14

BOTDICE updated to v0.55a

- fixed max and min bet limits
- fixed round number to start from 1
- added multiplication progression adjustments (making Martingale possible)
- added script benchmark


It's a great app.

What settings do you use for best results?
Thanks, I hope you like it now even more  Smiley.

Discussing the settings you can spend half of you life... but generally, I have an impression that settings increasing the bets towards the end of session rather than adjusting them down yield more. Someone proficient in math could chime in to evaluate whether that can combat the negative estimated value somewhat in a limited session.

Also, I prefer catching winning streaks by increasing bets on a 50%+ odds game type, but I'm not sure to what extent this affects the total profit with what limitations.

Naturally, with the house edge and fees taken into account, you'll fare best with the smallest number of bets and largest stakes. But it's rather interesting to run tests without house edge and fees.



Yes, the changes are great.

Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
April 01, 2013, 06:26:53 AM
Last edit: April 01, 2013, 10:29:40 AM by Grover
 #15

Seems to be some issues with win and profit calculations in determining when a game is complete.

I understand how you determined the win amount.

If there is a note that the txfee is subtracted from the win before the win is printed to the screen, my bad for not seeing that information.  

Suggestion:
Technically in accounting for the win and the profit; the win is the return from SD and the profit is where the txfee is subtracted.
For example when a bet is won on SD 50/50 the payout is 1.957.  This is "gross profit" or the win.  
I bet 1.0 on 50/50 and win; my client will show a return of 1.957
Then profit "net profit" is where the fee is subtracted from the win.

I think this approach would also build faith in your site since people would see the exact same amounts in the client and on your site. (assuming they are always charged a fee of 0.00005 0.0005. Sometimes I'm charged a gee fee of 0.0001 0.001)

I included a round where there seems to be an issue with calculating final profit for the win multiplier, but I may be missing something.

(the code box gives better columns than quote)
Code:
x x

03:29:08
Max rounds to play: 100
Initial bankroll (cash): 10
Target cash: cash +50%
Game type: 32768
Win multiplier: 1.957
Start bet: 0.01
Max bet: 3.7
Transaction fee: 0.0005 per bet
Adjustment after win: 1.33x
Adjustment after loss: 1.33x
Reset bet size after 2 wins
Reset bet size after 2 losses

Session 1 (x 100 bets) **Session profit: 5.1445109 **High point: 1.6041109 **Low point: -0.1149065 **FINAL CASH: 15.1445 BTC
Winning sessions: 1/1 TOTAL PROFIT: 5.1445 BTC
Script Benchmark: 0.00184512138366699


# lucky number bet win Profit
1 61829 0.010 -0.0104995 -0.0104995
(for round 1, shouldn't profit should be -0.01045? (-0.01bet + -0.0005txfee + 0.00005return)
since this appears to scale the 0.0000495 difference can start to add up.
ie. if the [s][s]best[/s][/s] bet was 1.0 the difference is x100 for 0.00495 which present value in USD is $0.4554 or ~$22.77 for 50 losing 1btc bets.)

2 64331 0.023 -0.0234989 -0.0339984
3 30767 0.010 0.0190700 -0.0249284
4 59717 0.023 -0.0234989 -0.0484273
5 41464 0.054 -0.0544973 -0.1029246
6 49247 0.010 -0.0104995 -0.1134241
7 20672 0.010 0.0190700 -0.1043541
8 1388 0.023 0.0445110 -0.0828431
9 41113 0.010 -0.0104995 -0.0933426
10 10538 0.023 0.0445110 -0.0718316
11 23810 0.054 0.1051780 -0.0206536
12 60525 0.010 -0.0104995 -0.0311531
13 35887 0.023 -0.0234989 -0.0546520
14 52915 0.010 -0.0104995 -0.0651515
15 139 0.010 0.0190700 -0.0560815
16 16602 0.023 0.0445110 -0.0345705
17 54275 0.010 -0.0104995 -0.0450700
18 42251 0.023 -0.0234989 -0.0685689
19 63521 0.010 -0.0104995 -0.0790684
20 13108 0.010 0.0190700 -0.0699984
21 62780 0.023 -0.0234989 -0.0934973
22 711 0.054 0.1051780 -0.0423193
23 3546 0.126 0.2460820 0.0777627
24 62524 0.010 -0.0104995 0.0672632
25 42471 0.023 -0.0234989 0.0437643
26 18189 0.010 0.0190700 0.0528343
27 35331 0.023 -0.0234989 0.0293354
28 39488 0.054 -0.0544973 -0.0251619
29 28745 0.010 0.0190700 -0.0160919
30 55346 0.023 -0.0234989 -0.0395908
31 24864 0.054 0.1051780 0.0115872
32 55682 0.126 -0.1264937 -0.1149065
33 25389 0.294 0.5748580 0.1659515
34 540 0.685 1.3400450 0.8209965
35 41261 0.010 -0.0104995 0.8104970
36 14174 0.023 0.0445110 0.8320080
37 49108 0.054 -0.0544973 0.7775107
38 33487 0.126 -0.1264937 0.6510170
39 58588 0.010 -0.0104995 0.6405175
40 3893 0.010 0.0190700 0.6495875
41 33188 0.023 -0.0234989 0.6260886
42 64000 0.054 -0.0544973 0.5715913
43 2316 0.010 0.0190700 0.5806613
44 46643 0.023 -0.0234989 0.5571624
45 24436 0.054 0.1051780 0.6083404
46 40310 0.126 -0.1264937 0.4818467
47 11081 0.294 0.5748580 0.7627047
48 51581 0.685 -0.6854657 0.0772389
49 28769 1.596 3.1228720 1.6041109 // profit does not equal the listed TOTAL PROFIT: 5.1445 BTC
WIN TARGET +50% ACHIEVED!

bitfreak!
Legendary
*
Offline Offline

Activity: 1536
Merit: 1000


electronic [r]evolution


View Profile WWW
April 01, 2013, 07:02:38 AM
 #16

I haven't really played SD before and I'm not certain exactly how it works. At first I was losing basically every single time with your simulator, then I changed the settings and now I'm reaching a win target of +50% every single time. That can't be right can it?

XCN: CYsvPpb2YuyAib5ay9GJXU8j3nwohbttTz | BTC: 18MWPVJA9mFLPFT3zht5twuNQmZBDzHoWF
Cryptonite - 1st mini-blockchain altcoin | BitShop - digital shop script
Web Developer - PHP, SQL, JS, AJAX, JSON, XML, RSS, HTML, CSS
GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
April 01, 2013, 09:32:45 AM
 #17

Seems to be some issues with win and profit calculations in determining when a game is complete.
This was just because the last bet was not printed before the completion announcement - it's being fixed in the next version that's being uploaded soon.

Quote
If there is a note that the txfee is subtracted from the win before the win is printed to the screen, my bad for not seeing that information.
No note, the win column listed net winnings.
Quote
I bet 1.0 on 50/50 and win; my client will show a return of 1.957
Then profit "net profit" is where the fee is subtracted from the win.

I think this approach would also build faith in your site since people would see the exact same amounts in the client and on your site. (assuming they are always charged a fee of 0.00005. Sometimes I'm charged a gee of 0.0001)

Your suggestion is appreciated. The amounts need to be the same as displayed on the client.

Quote
#    lucky number    bet    win    Profit
1    61829    0.010    -0.0104995    -0.0104995
(for round 1, shouldn't profit should be -0.01045? (-0.01bet + -0.0005txfee + 0.00005return)
since this appears to scale the 0.0000495 difference can start to add up.
I think we both are confusing the number of zeros here. The loss return rate is 0.005 times your bet, which affects returns extensively for small bet amounts. This has been fixed for the default menu.

[From private message]
Quote from: Grover
Also it appears possible to bet more than is in the bank

The "bank" is misleading, it should be "cash per session". Big data mode works by separating sessions, so the possible loss of more cash than initial bank per session is by design.

Quote
Last, I think SD uses 0 to 65535 inclusive.
That's true. It's correct in the software, but will fix for the description as well.

There seems to be some inconsistency on what fees Satoshidice deducts from winning payments. On their site they state: "On a win or a lose a transaction fee of 0.0005 is subtracted from the payment amount." However, we received back exactly 1.957000x our winning bet upon test, without fees substracted.

GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
April 01, 2013, 10:42:47 AM
Last edit: April 01, 2013, 10:53:44 AM by GCInc.
 #18

BOTDICE update

2013-04-01   v0.56a
    
- fixed last bet display error
- fixed default lose multiplier
- adjusted bet and win amounts to be uniform with real wallet results


Next to do:
- automatic multipliers for game types
- limit last bet of session to not exceed bankroll

At first I was losing basically every single time with your simulator, then I changed the settings and now I'm reaching a win target of +50% every single time. That can't be right can it?
It depends on what you mean "every single time". With target profit of 50% and less it is not uncommon to reach target 10 times in a row. You are expected to reach 50% profit more often than not, unless you use exceedingly bad strategies.

Use the big data mode to review a strategy you have found good from the single session analysis. If you still end up in profit after 100 sessions of 1000 rounds, you are set to be very wealthy Grin

In such a case, a more likely possibility is that there are errors in the software. That's why it's still in alpha phase and all user reports are welcome.

[EDIT: you can easily end up in profit in the big data mode as well. However multiple big data runs should yield clearly negative total result (because your big data losses can end up very large, even if you win more runs than lose).]

Grover
Full Member
***
Offline Offline

Activity: 137
Merit: 100


I was thinking Stay Puft, but Gozer said Grover


View Profile
April 01, 2013, 10:50:22 AM
 #19

I bet 1.0 on 50/50 and win; my client will show a return of 1.957
Then profit "net profit" is where the fee is subtracted from the win.

I think this approach would also build faith in your site since people would see the exact same amounts in the client and on your site. (assuming they are always charged a fee of 0.00005. Sometimes I'm charged a gee fee of 0.0001)
I did mistakenly add an extra 0 in each of the above statements.  

Your suggestion is appreciated. The amounts need to be the same as displayed on the client.

And for some shameless self promotion I sent you a small donation for the site. I've tried many more different variations on betting that I've been meaning to test but never have.  Thanks!
GCInc. (OP)
Hero Member
*****
Offline Offline

Activity: 566
Merit: 500


View Profile WWW
April 01, 2013, 10:56:52 AM
 #20

Thanks for the donation! Every bitcent helps in keeping up the motivation Wink

Pages: [1] 2 »  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!