private void ShowDDCharts(SystemStateSummary summary) { const string SimulationDDTooltipFormat = "#VALX{N2}%, Length: #VAL"; chartDDTicks.LoadData(SystemDrawDown2PointChartMapper.Map(summary.DDTicks), SimulationDDTooltipFormat); chartDDPositions.LoadData(SystemDrawDown2PointChartMapper.Map(summary.DDClosedPositions), SimulationDDTooltipFormat); }
private void ShowSimulationResult(SystemState systemState, SystemStateSummary summary) { DisplaySummary(summary); ShowPositions(systemState); ShowEquityCharts(systemState); ShowDDCharts(summary); ShowProfitCharts(systemState); }
private static void CalcProbabilities(SystemStateSummary summary) { if (summary.ClosedPositionsCount == 0) { return; } summary.WinProbability = summary.Wins / (float)summary.ClosedPositionsCount; summary.LossProbability = summary.Losses / (float)summary.ClosedPositionsCount; }
public static void Calculate(SystemStateSummary summary, SystemState systemState) { summary.ProcessedTicks = systemState.Equity.Count; summary.ClosedPositionsCount = systemState.PositionsClosed.Count; SumWinsLossesAndCalcAvgs(summary, systemState); CalcProbabilities(summary); summary.ExpectedPositionValue = ExpectedValue(summary.WinProbability, summary.AvgWin, summary.AvgLoss); summary.ExpectedUnitReturn = ExpectedValue(summary.WinProbability, summary.AvgWinLossRatio, 1); }
public static SystemStateSummary Calculate(SystemState systemState) { SystemStateSummary summary = CreateNewSummary(); GetSystemValues(summary, systemState); ProcessWinsLosses(summary, systemState); CalculateDrawDowns(summary, systemState); CalculateEquityDistribution(summary, systemState); return(summary); }
private static void GetSystemValues(SystemStateSummary summary, SystemState systemState) { summary.StartTS = systemState.Equity.FirstOrDefault().TS; summary.StopTS = systemState.Equity.LastOrDefault().TS; summary.InitialValue = systemState.InitialCash; summary.FinalValueOnLastTick = systemState.Equity.LastOrDefault().Value; summary.FinalValueOnClosedPositions = systemState.ClosedPositionsEquity.LastOrDefault().Value; double yearsOfSim = (summary.StopTS - summary.StartTS).TotalDays / 365.0; summary.CummYProfitPcntOnTicks = (float)Math.Pow(summary.FinalValueOnLastTick / summary.InitialValue, 1 / yearsOfSim) - 1f; }
private static void SumWinsLossesAndCalcAvgs(SystemStateSummary summary, SystemState systemState) { float sumPcntWins = 0; float sumPcntLosses = 0; systemState.PositionsClosed.ForEach(p => { float value = p.Value(); if (value > 0) { summary.Wins++; summary.SumWins += value; sumPcntWins += value / p.OpenValue(); } else { summary.Losses++; summary.SumLosses -= value; sumPcntLosses += value / p.OpenValue(); } }); if (summary.Wins > 0) { summary.AvgWin = summary.SumWins / summary.Wins; summary.AvgPcntWin = sumPcntWins / summary.Wins; } if (summary.Losses > 0) { summary.AvgLoss = summary.SumLosses / summary.Losses; summary.AvgPcntLoss = sumPcntLosses / summary.Losses; } if (summary.AvgLoss != 0) { summary.AvgWinLossRatio = summary.AvgWin / summary.AvgLoss; } }
private void DisplaySummary(SystemStateSummary summary) { lblSDRStartTS.Text = summary.StartTS.ToDisplay(); lblSDRStopTS.Text = summary.StopTS.ToDisplay(); lblSDRProcessedTicks.Text = summary.ProcessedTicks.ToDisplay(); lblSDRInitialValue.Text = summary.InitialValue.ToDisplay(); lblSDRFinalValueOnClosedPositions.Text = summary.FinalValueOnClosedPositions.ToDisplay(); lblSDRFinalValueOnLastTick.Text = summary.FinalValueOnLastTick.ToDisplay(); lblSDRProfitPcntOnTicks.Text = summary.CummYProfitPcntOnTicks.ToDisplayPcnt(); lblSDRClosedPositionsCount.Text = summary.ClosedPositionsCount.ToDisplay(); lblSDRWins.Text = summary.Wins.ToDisplay(); lblSDRWinProbability.Text = summary.WinProbability.ToDisplay(); lblSDRLosses.Text = summary.Losses.ToDisplay(); lblSDRLossProbability.Text = summary.LossProbability.ToDisplay(); lblSDRSumWins.Text = summary.SumWins.ToDisplay(); lblSDRAvgWin.Text = summary.AvgWin.ToDisplay(); lblSDRAvgPcntWin.Text = summary.AvgPcntWin.ToDisplayPcnt(); lblSDRSumLosses.Text = summary.SumLosses.ToDisplay(); lblSDRAvgLoss.Text = summary.AvgLoss.ToDisplay(); lblSDRAvgPcntLoss.Text = summary.AvgPcntLoss.ToDisplayPcnt(); lblSDRAvgWinLossRatio.Text = summary.AvgLoss != 0 ? summary.AvgWinLossRatio.ToDisplay() : "---"; lblSDRExpectedUnitReturn.Text = summary.AvgLoss != 0 ? summary.ExpectedUnitReturn.ToDisplay() : "---"; lblSDRExpectedPositionValue.Text = summary.AvgLoss != 0 ? summary.ExpectedPositionValue.ToDisplay() : "---"; lblSDRMaxDDOnTicks.Text = summary.DDTicks.MaxDD().ToDisplayPcnt(); lblSDRMaxDDOnPositions.Text = summary.DDClosedPositions.MaxDD().ToDisplayPcnt(); lblSDREqDistrAvg.Text = summary.EquityDistribution.Average.ToDisplay(4); lblSDREqDistrStdDev.Text = summary.EquityDistribution.StdDev.ToDisplay(4); edtMonteCarloWinProb.Value = (decimal)summary.WinProbability; edtMonteCarloAvgPcntWin.Value = (decimal)(100f * summary.AvgPcntWin); edtMonteCarloAvgPcntLoss.Value = (decimal)(100f * summary.AvgPcntLoss); }
private async void btnSim_Click(object sender, EventArgs e) { if (_currentSimSystemDef == null) { _msgDisplay.Error("System definition not loaded."); return; } edtSimDataLog.Clear(); while (tcSimulationCharts.TabCount > 2) { tcSimulationCharts.TabPages.RemoveAt(tcSimulationCharts.TabCount - 1); } paramsSim.SaveParams(_currentSimSystemDef.SystemParams); //using (var frm = new FormLongLastingWork()) // await frm.Execute("Processing simulation...", "Simulation error", () => // { // _currentSimSystemState = new SystemState() { InitialCash = (float)edtInitialCash.Value, Cash = (float)edtInitialCash.Value }; // SystemRunner runner = new SystemRunner(_dataProvider, _systemDataLoader); // runner.Run(_currentSimSystemDef, _currentSimSystemState, dtpSimFrom.Value.Date, dtpSimTo.Value.Date); // _currentSimSystemSummary = SystemStateSummaryCalculator.Calculate(_currentSimSystemState); // //ShowSimulationResult(_currentSimSystemState, _currentSimSystemSummary); // }); //ShowSimulationResult(_currentSimSystemState, _currentSimSystemSummary); _currentSimSystemState = new SystemState() { InitialCash = (float)edtInitialCash.Value, Cash = (float)edtInitialCash.Value }; SystemRunner runner = new SystemRunner(_dataProvider, _systemDataLoader); runner.Run(_currentSimSystemDef, _currentSimSystemState, dtpSimFrom.Value.Date, dtpSimTo.Value.Date); _currentSimSystemSummary = SystemStateSummaryCalculator.Calculate(_currentSimSystemState); ShowSimulationResult(_currentSimSystemState, _currentSimSystemSummary); }
public void SetUp() { _state = new SystemState(); _summary = new SystemStateSummary(); }
private static void CalculateEquityDistribution(SystemStateSummary summary, SystemState systemState) { summary.EquityDistribution = EquityDistributionCalculator.Calculate(systemState.Equity); }
private static void CalculateDrawDowns(SystemStateSummary summary, SystemState systemState) { summary.DDTicks = DrawDownsCalculator.Calculate(systemState.Equity); summary.DDClosedPositions = DrawDownsCalculator.Calculate(systemState.ClosedPositionsEquity); }
private static void ProcessWinsLosses(SystemStateSummary summary, SystemState systemState) => WinsLossesCalculator.Calculate(summary, systemState);