Ejemplo n.º 1
0
 protected Money calculateCurrencyGain(IFundPositionTx posTx, IsOpenClose isOpen)
 {
     Money gain = null;
     if (!posTx.DoNotRealize)
     {
         // calculate the gain caused by the foreign currency
         if (!this.InstrumentCurrency.IsBase && isOpen != IsOpenClose.Open)
         {
             Money realisedAmount = null;
             if (isOpen == IsOpenClose.Close)
                 realisedAmount = posTx.BookValueIC;
             else // if (isOpen == IsOpenClose.Both)
                 realisedAmount = Money.Multiply(posTx.BookValueIC, (Size.Quantity / posTx.Size.Quantity), true);
             if (posTx.ExchangeRate - AvgOpenExRate != 0)
             {
                 gain = realisedAmount.Convert(posTx.ExchangeRate - AvgOpenExRate, InstrumentCurrency.BaseCurrency, 7);
                 RealisedCurrencyGain = Money.Add(RealisedCurrencyGain, gain, true);
                 RealisedCurrencyGainToDate = Money.Add(RealisedCurrencyGainToDate, gain, true);
             }
         }
     }
     return gain;
 }
Ejemplo n.º 2
0
        protected void getPosTxInfo(IFundPositionTx posTx, out InstrumentSize newSize, out IsOpenClose isOpen)
        {
            isOpen = IsOpenClose.Close;
            newSize = InstrumentSize.Add(posTx.Size, Size, true);

            // Determine if it is opening or closing
            if (Size == null || Size.IsZero)
                isOpen = IsOpenClose.Open;
            else if (newSize.Sign != Size.Sign && newSize.IsNotZero)
                isOpen = IsOpenClose.Both;
            // short position -> gets larger
            else if (!Size.Sign && newSize.Sign == Size.Sign && newSize.Abs() > Size.Abs())
                isOpen = IsOpenClose.Open;
            else
            {
                if (IsSecurityValuationMutation)
                {
                    if (posTx.Side == Side.Sell || posTx.Side == Side.XO)
                        isOpen = IsOpenClose.Close;
                    else
                        isOpen = IsOpenClose.Open;
                }
                else
                {
                    // Cash -> just check the effect of the transaction
                    if (Size.Sign == posTx.Size.Sign)
                        isOpen = IsOpenClose.Open;
                    else
                        isOpen = IsOpenClose.Close;
                }
            }
        }
Ejemplo n.º 3
0
        protected void calculateBookStuff(IFundPositionTx posTx, IsOpenClose isOpen, InstrumentSize newSize, Money realisedAmount, Money baseRealisedAmount)
        {
            // Book Value & AvgOpenExRate
            if (isOpen == IsOpenClose.Close)
            {
                if (!posTx.DoNotRealize)
                {
                    Money oldBookValue = BookValue;
                    Money oldBookValueIC = BookValueIC;

                    if (Size.IsNotZero && newSize.IsNotZero)
                    {
                        BookValueIC = Money.Add(Money.Add(BookValueIC, posTx.BookValueIC, true), realisedAmount, true);
                        if (newSize.IsZero && BookValueIC.IsNotZero) BookValueIC = BookValueIC.ZeroedAmount();

                        //BookValue = Money.Add(Money.Add(BookValue, posTx.BookValue, true), baseRealisedAmount, true);
                        BookValue = Money.Add(BookValue, posTx.Size.CalculateAmount(this.BookPrice), true);
                        if (newSize.IsZero && BookValue.IsNotZero) BookValue = BookValue.ZeroedAmount();
                    }
                    else
                    {
                        BookValueIC = BookValueIC.Clone(0M);
                        BookValue = BookValue.Clone(0M);
                    }

                    BookChange = Money.Add(BookChange, Money.Subtract(BookValue, oldBookValue, true), true);
                    BookChangeIC = Money.Add(BookChangeIC, Money.Subtract(BookValueIC, oldBookValueIC, true), true);
                }
                else
                {
                    BookChange = BookValue.Clone(0M);
                    BookChangeIC = BookValueIC.Clone(0M);
                }
            }
            else if (isOpen == IsOpenClose.Open)
            {
                Money bookChange = posTx.BookValue;
                BookChange = Money.Add(BookChange, bookChange, true);
                BookValue = Money.Add(BookValue, bookChange, true);

                Money bookChangeIC = posTx.BookValueIC;
                BookChangeIC = Money.Add(BookChangeIC, bookChangeIC, true);
                BookValueIC = Money.Add(BookValueIC, bookChangeIC, true);

                if (newSize.IsNotZero)
                {
                    BookPrice = Money.Divide(BookValue, newSize, true);
                    if (Size != null)
                    {
                        // for a conversion the avg ExRate does not change
                        if (!posTx.IsConversion)
                        {
                            if (!InstrumentCurrency.IsBase)
                            {
                                Money currentCostAmount = Size.CalculateAmount(CostPrice, true);
                                Money totalAmtIC = Money.Add(currentCostAmount, posTx.BookValueIC, true);
                                //Money totalAmt = Money.Add(Money.Convert(Money.Multiply(Size, CostPrice, true), (1M / AvgOpenExRate), InstrumentCurrency.BaseCurrency, true), posTx.BookValue, true);
                                Money totalAmt = Money.Add(currentCostAmount.ConvertToBase((1M / AvgOpenExRate), true), posTx.BookValue, true);

                                AvgOpenExRate = totalAmtIC.Quantity / totalAmt.Quantity;
                            }
                            else
                                AvgOpenExRate = 1M;
                        }
                    }
                    else
                        AvgOpenExRate = posTx.ExchangeRate;
                }
            }
            else //  IsOpenClose.Both
            {
                // if swap -> take the price from the Tx
                if (posTx.Price.Underlying.IsBase)
                    BookPrice = posTx.Price;
                else
                    BookPrice = posTx.Price.Convert((1 / posTx.ExchangeRate), posTx.Price.Underlying.BaseCurrency);

                // In Instrument currency
                Money bookChange = newSize.CalculateAmount(posTx.Price, true);
                BookChangeIC = bookChange;
                BookValueIC = bookChange;

                // Convert to Base Currency
                if (!((ICurrency)bookChange.Underlying).IsBase)
                    bookChange = bookChange.Convert(1 / posTx.ExchangeRate, ((ICurrency)bookChange.Underlying).BaseCurrency, 7);
                BookChange = bookChange;
                BookValue = bookChange;
                AvgOpenExRate = Math.Round(posTx.ExchangeRate, 7);
            }
        }