public void ProfitCorrectlyCalculatedAfterReversing() { var pos = new CurrencyPosition(_currency); decimal fxRate = 1.35m; int quantity = 1000; var transaction1 = new FXTransaction { Quantity = quantity, Proceeds = fxRate * quantity, Cost = -fxRate * quantity, FXCurrency = _currency }; pos.AddFXTransaction(transaction1); decimal newFxRate = 1.36m; int newQuantity = -2000; var transaction2 = new FXTransaction { Quantity = newQuantity, Proceeds = newFxRate * newQuantity, Cost = -newFxRate * newQuantity, FXCurrency = _currency }; pos.AddFXTransaction(transaction2); Assert.AreEqual(quantity * (newFxRate - fxRate), pos.RealizedPnL); pos.Update(newFxRate); Assert.AreEqual(quantity * (newFxRate - fxRate), pos.TotalPnL); }
public void QuantityAndPriceReflectAddedTransactions() { var pos = new CurrencyPosition(_currency); decimal fxRate = 1.35m; int quantity = 1000; var transaction1 = new FXTransaction { Quantity = quantity, Proceeds = fxRate * quantity, Cost = -fxRate * quantity, FXCurrency = _currency }; pos.AddFXTransaction(transaction1); Assert.AreEqual(quantity, pos.Quantity); Assert.AreEqual(fxRate, pos.CostBasis); Assert.AreEqual(fxRate, pos.PriorPeriodCostBasis); }
public void Update(DateTime currentDate, Dictionary <int, TimeSeries> data, Dictionary <int, TimeSeries> fxData) { TodaysPnL = 0; if (!Open) { return; } //Update positions foreach (var kvp in Positions) { int id = kvp.Key; Position p = kvp.Value; decimal fxRate = p.Currency == null || p.Currency.ID <= 1 ? 1 : fxData[p.Currency.ID][0].Close; TodaysPnL += p.GetPnL(data[id].CurrentBar < 0 ? (decimal?)null : data[id][0].Close, fxRate); } //Update currency positions foreach (var kvp in CurrencyPositions) { int id = kvp.Key; if (fxData[id].CurrentBar < 0) { continue; } CurrencyPosition p = kvp.Value; decimal fxRate = fxData[id][0].Close; TodaysPnL += p.Update(fxRate); } if (Positions.Any(x => x.Value.Capital.Gross.Count > 0)) { Capital.AddLong(Positions.Sum(x => x.Value.Capital.Long.Last())); Capital.AddShort(Positions.Sum(x => x.Value.Capital.Short.Last())); } if (Capital.TodaysCapitalGross != 0) { _currentEquity *= (double)(1 + TodaysPnL / Capital.TodaysCapitalGross); } #if DEBUG _logger.Log(LogLevel.Trace, string.Format("Trade tracker ID {0} @ {1}, todays capital usage {2:0.00}, P/L: {3:0.00}", Trade.ID, currentDate, Capital.TodaysCapitalGross, TodaysPnL)); #endif Capital.EndOfDay(); _totalPnL += TodaysPnL; CumulativeReturns.Add(currentDate, _currentEquity); CumulativePnL.Add(currentDate, _totalPnL); Open = Positions.Values.Sum(x => x.Quantity) != 0 || CurrencyPositions.Values.Sum(x => x.Quantity) != 0 || (_ordersRemaining > 0 && _ordersRemaining < Trade.Orders.Count); }
public void RealizedProfitsWithUpdateBetweenTradesCalculatedCorrectly() { var pos = new CurrencyPosition(_currency); decimal fxRate = 1.35m; int quantity = 1000; var transaction1 = new FXTransaction { Quantity = quantity, Proceeds = fxRate * quantity, Cost = -fxRate * quantity, FXCurrency = _currency }; pos.AddFXTransaction(transaction1); decimal newFxRate = 1.36m; pos.Update(newFxRate); Assert.AreEqual(quantity * (newFxRate - fxRate), pos.TotalPnL); int newQuantity = -1000; decimal newFxRate2 = 1.37m; var transaction2 = new FXTransaction { Quantity = newQuantity, Proceeds = newFxRate2 * newQuantity, Cost = -newFxRate2 * newQuantity, FXCurrency = _currency }; pos.AddFXTransaction(transaction2); Assert.AreEqual(-newQuantity * (newFxRate2 - fxRate), pos.RealizedPnL); }