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; }
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); }