Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }