Hi, here's a short C++ program that computes the optimal fraction of account that one should bet for a set of user defined probabilities and their payouts: Code: /* optimal_bet_fraction.cpp Author: U.M. in Germany (user botpro @ www.elitetrader.com) 2016-02-02-Tu: init Solution to this online posting: http://www.elitetrader.com/et/index.php?threads/how-much-should-you-risk.297565/ There is a 35% chance that you win 20% of your bet; There is a 25% chance that you lose 15% of your bet; There is a 20% chance that you win 12% of your bet; There is a 15% chance that you lose 6% of your bet; There is a 4% chance that you win 50% of your bet; There is a 1% chance that you lose 100% of your bet. What percentage of your betting account should you risk to maximize your potential gain? Compile using a C++11 conformant C++ compiler, here using GNU g++ under Linux: g++ -Wall -O2 -std=c++11 optimal_bet_fraction.cpp -o optimal_bet_fraction.exe Run: ./optimal_bet_fraction.exe >data.csv And the answer is: MaxGrowthRate=2.87735% @ fraction=77.79000% Misc: You can change the pre-set conditions, and also add new conditions or del some conditions, then recompile and execute the program. */ #include <cstdio> #include <cstdlib> #include <cmath> #include <vector> using namespace std; int optimal_betfraction() { /* creates a csv file of all iterations (this can be analysed in Excel/LibreOffice-Calc), and prints the maximum to stderr */ // set these input data (vp and vr must both be same size): const vector<double> vp = { 0.35, 0.25, 0.2, 0.15, 0.04, 0.01 }; // probabilities const vector<double> vr = { 0.2, -0.15, 0.12, -0.06, 0.5, -1.0 }; // payouts const double PctStep = 0.01; // 0.001; // 1.0; double MaxGrowthRate = -1e9, xPctForMaxGR = 0; // will be filled below printf("r,f\n"); for (double xPct = 0.0; xPct <= 100.0; xPct += PctStep) { const double x = xPct / 100.0; double GrowthRate = 1.0; for (size_t i = 0; i < vp.size(); ++i) { if (vr[i] >= 0.0) GrowthRate *= pow(1.0 + x * fabs(vr[i]), vp[i]); else GrowthRate *= pow(1.0 - x * fabs(vr[i]), vp[i]); } printf("%.5f,%.5f\n", (GrowthRate - 1.0) * 100.0, xPct); if (GrowthRate > MaxGrowthRate) MaxGrowthRate = GrowthRate, xPctForMaxGR = xPct; } fprintf(stderr, "MaxGrowthRate=%.5f%% @ fraction=%.5f%%\n", (MaxGrowthRate - 1.0) * 100.0, xPctForMaxGR); return 0; } int main() { optimal_betfraction(); return 0; } And the same also in a zip file:
I think it's because of the vector initializer method used here. Of course one can change that easily, then C++11 should not be required anymore. One can of course also replace the two vectors wholly by classic arrays.