private void SetCumulativePnL(Deal deal) { if (Deals.Count > 0) { deal.CumulativePnL = deal.PnL + Deals.Last().CumulativePnL; if (deal.IsProfit == Deals.Last().IsProfit) { deal.InSeries = Deals.Last().InSeries + 1; deal.InSeriesMax = deal.InSeries; Deals.Last().InSeriesMax = 0; } else { deal.InSeries = 1; deal.InSeriesMax = 1; } } else { deal.CumulativePnL = deal.PnL; deal.InSeries = 1; deal.InSeriesMax = 1; } }
public void OnItemAdded(Trade item) { if (Portfolio != item.Portfolio) { return; } if (Symbol != item.Symbol) { return; } //разобрать трейд по модулю лота, т.е. на максимальнео количество частей //определить направление трейда //проверить очередь противоположного направления, на наличие соответсвующего открывающего трейда //если есть соответсвующий открывающий трейд, извлекаем //определяем направление закрытой позиции //определяем результат закрытой позиции //если нет соответствия, помещаем в очередь своего направления //определить направление трейда int count = (int)System.Math.Abs(item.Amount); if (item.Action == TradeAction.Buy) { //разобрать трейд по модулю лота, т.е. на максимальнео количество частей for (int i = 0; i < count; i++) { Trade tradeBuy = new Trade(item); tradeBuy.Amount = 1; //проверить очередь противоположного направления, на наличие соответсвующего открывающего трейда if (SellTrades.Any()) { //если есть соответсвующий открывающий трейд, извлекаем Trade tradeSell_1 = SellTrades.Dequeue(); //определяем направление закрытой позиции //определяем результат закрытой позиции Deal deal = new Deal(TradeAction.Sell, tradeBuy, tradeSell_1); SetCumulativePnL(deal); Deals.Add(deal); } else { //если нет соответствия, помещаем в очередь своего направления BuyTrades.Enqueue(tradeBuy); } } } else if (item.Action == TradeAction.Sell) { for (int i = 0; i < count; i++) { Trade tradeSell = new Trade(item); tradeSell.Amount = -1; if (BuyTrades.Any()) { Trade tradeBuy_1 = BuyTrades.Dequeue(); Deal deal = new Deal(TradeAction.Buy, tradeBuy_1, tradeSell); SetCumulativePnL(deal); Deals.Add(deal); } else { SellTrades.Enqueue(tradeSell); } } } }