This is a just for fun implementation in Pyhton, probably a bit over-engineered

You can change the parameters in main() or write an argument parser.
$ python -m sssplan
Price mB left mB sold k$ out mB val. k$ sum total val.
2 9000 1000 2 18 2 20
4 8100 900 4 32 6 38
8 7290 810 6 58 12 70
16 6561 729 12 105 24 129
32 5905 656 21 189 45 234
64 5314 590 38 340 83 423
128 4783 531 68 612 151 763
256 4305 478 122 1102 273 1375
512 3874 430 220 1984 493 2477
1024 3487 387 397 3570 890 4461def iter_price(initial_price, steps, base=2):
for i in steps:
yield initial_price * base ** i
def iter_mbtc_left(initial_btc, rake, steps):
base = (1 - rake)
for i in steps:
yield initial_btc * base ** i
def iter_mbtc_sold(initial_btc, rake, steps):
piece = initial_btc * rake
base = (1 - rake)
for i in steps:
yield piece * base ** (i - 1)
def iter_kusd_out(mbtc_sold, price):
for mbtc, usd in zip(mbtc_sold, price):
yield mbtc * usd / 1000.
def iter_kusd_sum(kusd_out):
s = 0
for kusd in kusd_out:
s += kusd
yield s
def iter_mbtc_val(mbtc_left, prices):
for mbtc, price in zip(mbtc_left, prices):
yield mbtc * price / 1000.
def iter_total_val(mbtc_val, kusd_sum):
for item in zip(mbtc_val, kusd_sum):
yield sum(item)
def main():
base = 2 # doubling
numof_steps = 10
initial_price = 1 # kUSD
inital_btc_stash = 10000 # mBTC
rake = 0.1
steps = range(1, numof_steps + 1)
prices = list(iter_price(initial_price, steps, base=base))
mbtc_left = list(iter_mbtc_left(inital_btc_stash, rake, steps))
mbtc_sold = list(iter_mbtc_sold(inital_btc_stash, rake, steps))
kusd_out = list(iter_kusd_out(mbtc_sold, prices))
mbtc_val = list(iter_mbtc_val(mbtc_left, prices))
kusd_sum = list(iter_kusd_sum(kusd_out))
total_val = list(iter_total_val(mbtc_val, kusd_sum))
print ' Price mB left mB sold k$ out mB val. k$ sum total val.'
fstr = ' {0:4} {1:6.0f} {2:8.0f} {3:7.0f} {4:8.0f} {5:7.0f} {6:8.0f}'
for args in zip(prices, mbtc_left, mbtc_sold,
kusd_out, mbtc_val, kusd_sum, total_val):
print fstr.format(*args)
if __name__ == '__main__':
main()