public double GetTotalEquity( ITradingDataProvider provider, DateTime period, EquityEvaluationMethod method) { if (provider == null) { throw new ArgumentNullException("provider"); } double totalEquity = CurrentCapital; // cash is the core equity if (method == EquityEvaluationMethod.CoreEquity) { // do nothing } else { foreach (var kvp in _activePositions) { string code = kvp.Key; Bar bar; if (!provider.GetLastEffectiveBar(code, period, out bar)) { throw new InvalidOperationException( string.Format("Can't get data from data provider for code {0}, time {1}", code, period)); } if (method == EquityEvaluationMethod.TotalEquity) { int volume = kvp.Value.Sum(e => e.Volume); totalEquity += volume * bar.ClosePrice; } else if (method == EquityEvaluationMethod.ReducedTotalEquity) { foreach (var position in kvp.Value) { totalEquity += position.Volume * Math.Min(bar.ClosePrice, position.StopLossPrice); } } } } return(totalEquity); }
public double GetCurrentEquity(DateTime period, EquityEvaluationMethod method) { return(_equityManager.GetTotalEquity(_provider, period, method)); }
public double GetTotalEquity( ITradingDataProvider provider, DateTime period, EquityEvaluationMethod method) { if (provider == null) { throw new ArgumentNullException("provider"); } if (method == EquityEvaluationMethod.InitialEquity) { return(InitialCapital); } double equity = CurrentCapital; // cash is the core equity if (method == EquityEvaluationMethod.CoreEquity) { return(equity); } foreach (var kvp in _activePositions) { var code = kvp.Key; Bar bar; var index = provider.GetIndexOfTradingObject(code); if (index < 0) { throw new InvalidOperationException(string.Format("Can't get index for code {0}", code)); } if (!provider.GetLastEffectiveBar(index, period, out bar)) { throw new InvalidOperationException( string.Format("Can't get data from data provider for code {0}, time {1}", code, period)); } if (method == EquityEvaluationMethod.TotalEquity || method == EquityEvaluationMethod.LossControlTotalEquity || method == EquityEvaluationMethod.LossControlInitialEquity) { var volume = kvp.Value.Sum(e => e.Volume); equity += volume * bar.ClosePrice; } else if (method == EquityEvaluationMethod.ReducedTotalEquity || method == EquityEvaluationMethod.LossControlReducedTotalEquity) { equity += kvp.Value.Sum(position => position.Volume * Math.Min(bar.ClosePrice, position.StopLossPrice)); } } if (method == EquityEvaluationMethod.TotalEquity || method == EquityEvaluationMethod.ReducedTotalEquity) { return(equity); } else if (method == EquityEvaluationMethod.LossControlInitialEquity) { return(equity > InitialCapital ? InitialCapital : 2 * equity - InitialCapital); } else if (method == EquityEvaluationMethod.LossControlTotalEquity) { return(equity > InitialCapital ? equity : 2 * equity - InitialCapital); } else if (method == EquityEvaluationMethod.LossControlReducedTotalEquity) { return(equity > InitialCapital ? equity : 2 * equity - InitialCapital); } else { throw new NotImplementedException(); } }