示例#1
0
 public void CorrectCapitalUsageReturnedWhenAddingOrderToEmptyPosition()
 {
     var pos = new Position(_instrument);
     var o = new Order
     {
         Quantity = 100,
         Price = 12,
         Instrument = _instrument,
         FXRateToBase = 1
     };
     var res = pos.AddOrder(o);
     Assert.AreEqual(1200, res);
 }
示例#2
0
        public void CorrectCapitalUsageReturnedWhenRemovingFromExistingPosition()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 12,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -50,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            var res = pos.AddOrder(o2);

            Assert.AreEqual(0, res);
        }
示例#3
0
        public void AddOrderReturnsCorrectCurrentCapitalUsageWhenOpeningAPosition()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 12,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            decimal capUsage = pos.AddOrder(o);

            Assert.AreEqual(1200, capUsage);
        }
示例#4
0
        public void CumulativeCapitalUsedHasCorrectValueWhenReversing()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 12,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -200,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            Assert.AreEqual(12 * 100 + 11 * 100, pos.Capital.TodaysCapitalGross);
            Assert.AreEqual(12 * 100 - 11 * 100, pos.Capital.TodaysCapitalNet);
            Assert.AreEqual(12 * 100, pos.Capital.TodaysCapitalLong);
            Assert.AreEqual(11 * 100, pos.Capital.TodaysCapitalShort);
        }
示例#5
0
 public void CorrectPriceBasisUpdateWhenAddingOrderToEmptyPosition()
 {
     var pos = new Position(_instrument);
     var o = new Order
     {
         Quantity = 100,
         Price = 12,
         Instrument = _instrument,
         FXRateToBase = 1
     };
     pos.AddOrder(o);
     Assert.AreEqual(12, pos.CostBasis);
 }
示例#6
0
        public void MultiPeriodCapitalUsageIsRecordedCorrectly()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            Assert.AreEqual(1000, pos.Capital.TodaysCapitalGross);
            Assert.AreEqual(1000, pos.Capital.TodaysCapitalLong);
            pos.GetPnL(10, 1);

            var o2 = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            var o3 = new Order
            {
                Quantity = -200,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o3);

            pos.GetPnL(10, 1);

            Assert.AreEqual(2000, pos.Capital.Gross.Last());
            Assert.AreEqual(2000, pos.Capital.Long.Last());

            pos.GetPnL(10, 1);

            var o4 = new Order
            {
                Quantity = 150,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o4);

            pos.GetPnL(10, 1);


            List<decimal> expectedCapitalGross = new List<decimal> { 1000, 2000, 0, 1500 };
            for (int i = 0; i < expectedCapitalGross.Count; i++)
            {
                Assert.AreEqual(expectedCapitalGross[i], pos.Capital.Gross[i]);
            }
        }
示例#7
0
        public void AddingAnOrderForTheWrongInstrumentThrowsException()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -50,
                Price = 11,
                Instrument = new Instrument { ID = 2, Multiplier = 1, AssetCategory = AssetClass.Stock },
                FXRateToBase = 1
            };

            ActualValueDelegate<object> testDelegate = () => pos.AddOrder(o2);

            Assert.That(testDelegate, Throws.Exception);
        }
示例#8
0
        public void FifoPnLTakesIntoAccountFXRate()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1.1m
            };
            pos.AddOrder(o2);

            Assert.AreEqual(0, o.PerTradeFIFOPnL);
            Assert.AreEqual(100, o2.PerTradeFIFOPnL);
        }
示例#9
0
        public void RealizedPnLValuesReflectFXRateChanges()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -100,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1.05m
            };
            pos.AddOrder(o2);

            Assert.AreEqual(155, pos.RealizedPnL);
        }
示例#10
0
        public void ROACValueReflectsFXRateChanges()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -50,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            pos.GetPnL(10, 1.1m);

            Assert.AreEqual(1.1, pos.ROAC);
        }
示例#11
0
        public void ROACValueIsCorrectWithCashTransactions()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var c = new CashTransaction
            {
                Amount = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddCashTransaction(c);

            pos.GetPnL(10, 1);

            Assert.AreEqual(1.01, pos.ROAC);
        }
示例#12
0
        public void ROACValueIsCorrectAfterPartialExit()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -50,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            pos.GetPnL(10, 1);

            Assert.AreEqual(1.05, pos.ROAC);
        }
示例#13
0
        public void ROACValueIsCorrectAfterReversing()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -150,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            pos.GetPnL(11, 1);

            Assert.AreEqual(Math.Round(1 + (1.0 * 100) / (10 * 100 + 11 * 50), 5), Math.Round(pos.ROAC, 5));
        }
示例#14
0
        public void CorrectPriceBasisUpdateWhenReversingExistingPosition()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 12,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -150,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            Assert.AreEqual(11, pos.CostBasis);
        }
示例#15
0
        public void AddOrderReturnsCorrectCurrentCapitalUsageWhenRemovingFromPosition()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 100,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);


            var o2 = new Order
            {
                Quantity = -50,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            var capUsage = pos.AddOrder(o2);

            Assert.AreEqual(0, capUsage);
        }
示例#16
0
        public void RealizedPnLValuesIncludeCommissions()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                Commission = -5
            };
            pos.AddOrder(o);

            Assert.AreEqual(-5, pos.RealizedPnL);

            var o2 = new Order
            {
                Quantity = -100,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1,
                Commission = -5
            };
            pos.AddOrder(o2);

            Assert.AreEqual(90, pos.RealizedPnL);
        }
示例#17
0
        public void AddOrderTakesIntoAccountFXRate()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 100,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);


            var o2 = new Order
            {
                Quantity = -200,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1.1m
            };
            var capUsage = pos.AddOrder(o2);

            Assert.AreEqual(1100, capUsage);
        }
示例#18
0
        public void GetPnLReturnsCorrectPnLForShortPositions()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = -100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            Assert.AreEqual(-100, pos.GetPnL(11, 1));
            Assert.AreEqual(100, pos.GetPnL(10, 1));
        }
示例#19
0
        public void FifoPnLIsCorrectAfterAddingToPosition()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = 100,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            Assert.AreEqual(0, o.PerTradeFIFOPnL);
            Assert.AreEqual(0, o2.PerTradeFIFOPnL);
        }
示例#20
0
        public void GetPnLIncludesCommissions()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                Commission = -5
            };
            pos.AddOrder(o);

            Assert.AreEqual(100 - 5, pos.GetPnL(11, 1));
            Assert.AreEqual(-100, pos.GetPnL(10, 1));
        }
示例#21
0
        public void UnrealizedPnLReturnsDiffernceBetweenTotalAndRealizedPnL()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -50,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o2);

            pos.GetPnL(11, 1);

            Assert.AreEqual(50, pos.UnrealizedPnL);
        }
示例#22
0
        public void GetPnLReturnsCorrectPnLWithBothRealizedAndUnrealizedPnL()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -50,
                Price = 11,
                Instrument = _instrument,
                FXRateToBase = 1,
            };
            pos.AddOrder(o2);

            Assert.AreEqual(50 * 1 + 50 * 2, pos.GetPnL(12, 1));
            Assert.AreEqual(-2 * 50, pos.GetPnL(10, 1));
        }
示例#23
0
        public void PnLIsDeferredForROACCalculationsIfNoCapitalIsUsed()
        {
            var pos = new Position(_instrument);
            var c = new CashTransaction
            {
                Amount = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddCashTransaction(c);

            pos.GetPnL(10, 1);

            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            pos.GetPnL(10, 1);

            Assert.AreEqual(1 + (10d / (10 * 100)), pos.ROAC);
        }
示例#24
0
        public void GetPnLReturnsCorrectPnLIncludingFXRateChanges()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1
            };
            pos.AddOrder(o);

            Assert.AreEqual(45, pos.GetPnL(11, 0.95m));
        }
示例#25
0
        public void CapitalUsageWhenEnteringAndExitingNearCloseIsCounted()
        {
            var pos = new Position(_instrument);
            var o = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                TradeDate = new DateTime(2000, 1, 1, 15, 59, 0)
            };
            pos.AddOrder(o);

            var o2 = new Order
            {
                Quantity = -100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                TradeDate = new DateTime(2000, 1, 1, 15, 59, 1)
            };
            pos.AddOrder(o2);

            pos.GetPnL(10, 1);

            Assert.AreEqual(1000, pos.Capital.Gross.Last());
            Assert.AreEqual(1000, pos.Capital.Long.Last());
        }
示例#26
0
        public void CapitalUsageWhenEnteringAndExitingMultipleOrdersNearCloseIsCountedWithShortPosition()
        {
            var pos = new Position(_instrument);
            decimal orderCapitalUsage = 0;

            var o = new Order
            {
                Quantity = -100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                TradeDate = new DateTime(2000, 1, 1, 15, 59, 0)
            };
            orderCapitalUsage = pos.AddOrder(o);
            Assert.AreEqual(0, orderCapitalUsage);

            var o2 = new Order
            {
                Quantity = -100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                TradeDate = new DateTime(2000, 1, 1, 15, 59, 1)
            };
            orderCapitalUsage = pos.AddOrder(o2);
            Assert.AreEqual(0, orderCapitalUsage);

            var o3 = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                TradeDate = new DateTime(2000, 1, 1, 15, 59, 2)
            };
            orderCapitalUsage = pos.AddOrder(o3);
            Assert.AreEqual(1000, orderCapitalUsage);

            var o4 = new Order
            {
                Quantity = 100,
                Price = 10,
                Instrument = _instrument,
                FXRateToBase = 1,
                TradeDate = new DateTime(2000, 1, 1, 15, 59, 3)
            };
            orderCapitalUsage = pos.AddOrder(o4);
            Assert.AreEqual(1000, orderCapitalUsage);

            pos.GetPnL(10, 1);

            Assert.AreEqual(2000, pos.Capital.Gross.Last());
            Assert.AreEqual(2000, pos.Capital.Short.Last());
        }