This can be done in many ways - Here's one example that gets the job done without a single conditional if statement.
class mm - Risk Manager - drop in one instance where you need it.
public class mm
{
// used to obtain current risk
private final int OBTAIN_R = 0;
// used to select path to new risk following a win
private final int SELECT_W = 1;
// used to select path to new risk following a loss
private final int SELECT_L = 2;
// current state
Object[] state;
// states: root
Object[] ROOT = new Object[3];
// states: left column
Object[] L1 = new Object[3];
Object[] L2 = new Object[3];
Object[] L3 = new Object[3];
// states: centre column
Object[] C1 = new Object[3];
Object[] C2 = new Object[3];
Object[] C3 = new Object[3];
Object[] C4 = new Object[3];
Object[] C5 = new Object[3];
Object[] C6 = new Object[3];
// states: right column
Object[] R1 = new Object[3];
// constructor: configures the graph structure according to the spec
public mm()
{
ROOT[OBTAIN_R] = new Double(3d/100d);
ROOT[SELECT_W] = L1;
ROOT[SELECT_L] = C1;
L1[OBTAIN_R] = new Double(3d/100d);
L1[SELECT_W] = L2;
L1[SELECT_L] = C1;
L2[OBTAIN_R] = new Double(3d/100d);
L2[SELECT_W] = L3;
L2[SELECT_L] = C1;
L3[OBTAIN_R] = new Double(4d/100d);
L3[SELECT_W] = ROOT;
L3[SELECT_L] = C1;
C1[OBTAIN_R] = new Double(2d/100d);
C1[SELECT_W] = R1;
C1[SELECT_L] = C2;
C2[OBTAIN_R] = new Double(1d/100d);
C2[SELECT_W] = C3;
C2[SELECT_L] = C2;
C3[OBTAIN_R] = new Double(1d/100d);
C3[SELECT_W] = C4;
C3[SELECT_L] = C3;
C4[OBTAIN_R] = new Double(1d/100d);
C4[SELECT_W] = C5;
C4[SELECT_L] = C4;
C5[OBTAIN_R] = new Double(1d/100d);
C5[SELECT_W] = C6;
C5[SELECT_L] = C5;
C6[OBTAIN_R] = new Double(1d/100d);
C6[SELECT_W] = ROOT;
C6[SELECT_L] = C6;
R1[OBTAIN_R] = new Double(2d/100d);
R1[SELECT_W] = ROOT;
R1[SELECT_L] = C2;
state = ROOT;
}
// commit - move on to next node on losing path
public void bookLoss()
{
state = (Object[])state[SELECT_L];
}
// commit - move on to next node on winning path
public void bookWin()
{
state = (Object[])state[SELECT_W];
}
// return - risk at current node
public double getRisk()
{
return ((Double)(state[OBTAIN_R])).doubleValue();
}
// peek (without moving) risk at losing node from current node
public double getRiskOnLoss()
{
return ((Double)((Object[])state[SELECT_L])[OBTAIN_R]).doubleValue();
}
// peek (without moving) risk at winning node from current node
public double getRiskOnWin()
{
return ((Double)((Object[])state[SELECT_W])[OBTAIN_R]).doubleValue();
}
// reset to root node
public void reset()
{
state = ROOT;
}
}
class testmm - Risk Manager Tester - Place in same directory as the manager to test it out.
public class testmm
{
public static void main(String[] args) throws Exception
{
// create a new risk managers
mm manager = new mm();
System.out.println("======================================================");
System.out.println("mm initial risk: " + manager.getRisk());
System.out.println("mm risk on loss will be: " + manager.getRiskOnLoss());
System.out.println("mm risk on win will be: " + manager.getRiskOnWin());
System.out.println("======================================================");
// simulate 30 trades
int trade = 0;
while(trade < 30)
{
System.out.println("current risk after trade " + trade + " : " + manager.getRisk());
System.out.println("risk on loss will be: " + manager.getRiskOnLoss());
System.out.println("risk on win will be: " + manager.getRiskOnWin());
// generate random 0 or 1 to mean loss or win
if(Math.round(Math.random()) == 0)
{
// post increment trade then print
System.out.println(++trade + " TRADE LOSS... ");
// tell manager we've had a loss
manager.bookLoss();
}
else
{
// post increment trade then print
System.out.println(++trade + " TRADE WIN... ");
// tell manager we've had a win
manager.bookWin();
}
System.out.println("------------------------------------------------------");
}
System.out.println("======================================================");
System.out.println("final risk after trade " + trade + " : " + manager.getRisk());
System.out.println("risk on loss will be: " + manager.getRiskOnLoss());
System.out.println("risk on win will be: " + manager.getRiskOnWin());
System.out.println("======================================================");
}
}
Sample output:
======================================================
mm initial risk: 0.03
mm risk on loss will be: 0.02
mm risk on win will be: 0.03
======================================================
current risk after trade 0 : 0.03
risk on loss will be: 0.02
risk on win will be: 0.03
1 TRADE LOSS...
------------------------------------------------------
current risk after trade 1 : 0.02
risk on loss will be: 0.01
risk on win will be: 0.02
2 TRADE LOSS...
------------------------------------------------------
current risk after trade 2 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
3 TRADE LOSS...
------------------------------------------------------
current risk after trade 3 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
4 TRADE WIN...
------------------------------------------------------
current risk after trade 4 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
5 TRADE LOSS...
------------------------------------------------------
current risk after trade 5 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
6 TRADE LOSS...
------------------------------------------------------
current risk after trade 6 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
7 TRADE WIN...
------------------------------------------------------
current risk after trade 7 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
8 TRADE WIN...
------------------------------------------------------
current risk after trade 8 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
9 TRADE LOSS...
------------------------------------------------------
current risk after trade 9 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
10 TRADE LOSS...
------------------------------------------------------
current risk after trade 10 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
11 TRADE LOSS...
------------------------------------------------------
current risk after trade 11 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
12 TRADE LOSS...
------------------------------------------------------
current risk after trade 12 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
13 TRADE WIN...
------------------------------------------------------
current risk after trade 13 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.03
14 TRADE WIN...
------------------------------------------------------
current risk after trade 14 : 0.03
risk on loss will be: 0.02
risk on win will be: 0.03
15 TRADE LOSS...
------------------------------------------------------
current risk after trade 15 : 0.02
risk on loss will be: 0.01
risk on win will be: 0.02
16 TRADE LOSS...
------------------------------------------------------
current risk after trade 16 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
17 TRADE LOSS...
------------------------------------------------------
current risk after trade 17 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
18 TRADE WIN...
------------------------------------------------------
current risk after trade 18 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
19 TRADE WIN...
------------------------------------------------------
current risk after trade 19 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
20 TRADE WIN...
------------------------------------------------------
current risk after trade 20 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
21 TRADE LOSS...
------------------------------------------------------
current risk after trade 21 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
22 TRADE LOSS...
------------------------------------------------------
current risk after trade 22 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
23 TRADE LOSS...
------------------------------------------------------
current risk after trade 23 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.01
24 TRADE WIN...
------------------------------------------------------
current risk after trade 24 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.03
25 TRADE LOSS...
------------------------------------------------------
current risk after trade 25 : 0.01
risk on loss will be: 0.01
risk on win will be: 0.03
26 TRADE WIN...
------------------------------------------------------
current risk after trade 26 : 0.03
risk on loss will be: 0.02
risk on win will be: 0.03
27 TRADE WIN...
------------------------------------------------------
current risk after trade 27 : 0.03
risk on loss will be: 0.02
risk on win will be: 0.03
28 TRADE WIN...
------------------------------------------------------
current risk after trade 28 : 0.03
risk on loss will be: 0.02
risk on win will be: 0.04
29 TRADE WIN...
------------------------------------------------------
current risk after trade 29 : 0.04
risk on loss will be: 0.02
risk on win will be: 0.03
30 TRADE LOSS...
------------------------------------------------------
======================================================
final risk after trade 30 : 0.02
risk on loss will be: 0.01
risk on win will be: 0.02
======================================================