コード例 #1
0
        public void SetPnLAndCost(PnLElement pnl, OpenOrder oo = null)
        {
            double initValue    = CurrentRate.Rate;
            double totPnLReturn = Return;

            AverageCost = pnl.AverageCost;
            if (oo != null)
            {
                AverageCost = oo.NewCost;
                PreviouslyExecutedVolume = oo.Volume + oo.PreviouslyExecutedVolume;
                TotalPnL     = oo.TotalPnL;
                totPnLReturn = Rate.Rate / oo.Rate.Rate - 1;
                initValue    = oo.Rate.Rate;
            }
            double currentPosition = pnl.Position;

            NewCost = AverageCost;
            if (IsBuyOrder)
            {
                currentPosition += PreviouslyExecutedVolume;
                NewCost          = (Volume * Rate.Rate + currentPosition * AverageCost) / (currentPosition + Volume);
            }
            else
            {
                currentPosition -= PreviouslyExecutedVolume;
                RealizedPnL      = (Rate.Rate - AverageCost) * Volume;
            }
            TotalPnL += totPnLReturn * currentPosition * initValue;
        }
コード例 #2
0
        public static List <OpenOrder> SortOpenOrders(this List <OpenOrder> list,
                                                      Dictionary <string, PnLElement> pnlInfo,
                                                      CurrencyPair cp)
        {
            Currency   cryptoCcy = cp.GetCryptoFiatPair.Crypto;
            PnLElement pnl       = pnlInfo[cryptoCcy.ToFullName()];

            List <OpenOrder> res = new List <OpenOrder> {
            };

            foreach (OpenOrder item in list)
            {
                if (cp.IsEquivalent(item.CurPair))
                {
                    res.Add(item);
                }
            }
            res.Sort((x, y) => Math.Abs(x.Return).CompareTo(Math.Abs(y.Return)));

            OpenOrder lastBuy  = null;
            OpenOrder lastSell = null;

            foreach (var item in res)
            {
                if (item.Return > 0)
                {
                    item.SetPnLAndCost(pnl, lastSell);
                    lastSell = item;
                }
                else
                {
                    item.SetPnLAndCost(pnl, lastBuy);
                    lastBuy = item;
                }
            }
            return(res);
        }