Пример #1
0
 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;
     }
 }
Пример #2
0
        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);
                    }
                }
            }
        }