type Rebalancer = float -> float -> float -> float-> Command
let balanceStock cash r1 r2 r3 p1 p2 p3 =
let numStockA1 = Math.Round(cash / 100.0 * r1 / p1)
let numStockA2 = Math.Round(cash / 100.0 * r2 / p2)
let numStockA3 = Math.Round(cash / 100.0 * r3 / p3)
(numStockA1, numStockA2, numStockA3)
let calcActiva p1 p2 p3 s1 s2 s3 =
let calcFlow beforeRebalance afterRebalance =
beforeRebalance - afterRebalance
let rebalance value price1 price2 price3 ratio1 ratio2 ratio3=
let stock1,stock2,stock3 = balanceStock value ratio1 ratio2 ratio3 price1 price2 price3
let valueAfterRebalance = calcActiva price1 price2 price2 stock1 stock2 stock3
((calcFlow value valueAfterRebalance), stock1, stock2, stock3)
let startingCash = 5000.0
let flow, stockA1, stockA2, stockA3 = (rebalance startingCash 54.0 21.0 102.0 70.0 30.0 0.0)
let newActiva = (calcActiva 59.0 21.0 102.0 stockA1 stockA2 stockA3)
let nFlow, nStockA1, nStockA2, nStockA3 = (rebalance (newActiva + flow) 59.0 21.0 102.0 70.0 30.0 0.0)
let rec AutoRebalance s1 s2 s3 price1 price2 price3 inflow=
let r1,r2,r3 = (50.0, 50.0, 0.0)
let newValue = (calcActiva price1 price2 price3 s1 s2 s3) + inflow
printfn "New activa value: %A" newValue
let stock1,stock2,stock3 = balanceStock newValue r1 r2 r3 price1 price2 price3
printfn "Number of stock A1: %A" stock1
printfn "Number of stock A2: %A" stock2
printfn "Number of stock A3: %A" stock3
let valueAfterRebalance = calcActiva price1 price2 price3 stock1 stock2 stock3
let newFlow = (calcFlow newValue valueAfterRebalance)
printfn "The flow of this rebalance: %A" newFlow
Some (AutoRebalance stock1 stock2 newFlow)
let f1 = AutoRebalance 0.0 0.0 0.0 100.0 100.0 100.0 5000.0
| Some f -> f 102.0 97.0 1.0 100.0
| Some f -> f 105.0 93.0 1.0 100.0
| Some f -> f 108.0 96.0 1.0 100.0
| Some f -> f 110.0 93.0 1.0 100.0
| Some f -> f 108.0 100.0 1.0 100.0