/// <summary>
        ///  Caluclate position per currency pair per customer
        /// </summary>
        public void CalculatePosistionPerCurrencyPairPerCustomer()
        {
            var myTradeLocker        = new object();
            var clientBalancesLocker = new object();

            cleanUp = myTrades.Connect(trade => (trade.Status == Status.Open || trade.Status == Status.Pending))
                      .WhereReasonsAre(ChangeReason.Add, ChangeReason.Remove)
                      .Synchronize(myTradeLocker)
                      .Group(t => t.Pair)
                      .SubscribeMany(groupedData =>
            {
                var PositionPerPairPerCustomer = groupedData.Cache.Connect()
                                                 .WhereReasonsAre(ChangeReason.Add, ChangeReason.Remove)
                                                 .Group(t => t.ClientId)
                                                 .Synchronize(clientBalancesLocker)
                                                 .SubscribeMany(clienttrades =>
                {
                    var positionpercustomer = clienttrades.Cache.Connect(q => q.Pair == groupedData.Key && q.ClientId == clienttrades.Key)
                                              .Synchronize(clientBalancesLocker)
                                              .QueryWhenChanged(query =>
                    {
                        var amount1buy  = clienttrades.Cache.Items.Where(trade => trade.Amount1 > 0).Sum(trade => trade.Amount1);
                        var amount1sell = clienttrades.Cache.Items.Where(trade => trade.Amount1 < 0).Sum(trade => trade.Amount1);
                        var amount2buy  = clienttrades.Cache.Items.Where(trade => trade.Amount2 > 0).Sum(trade => trade.Amount2);
                        var amount2sell = clienttrades.Cache.Items.Where(trade => trade.Amount2 < 0).Sum(trade => trade.Amount2);

                        var pairpos = new CurPairPositionPerClient
                        {
                            ClientPair = clienttrades.Key + "_" + groupedData.Key,
                            ClientId   = clienttrades.Key,
                            Pair       = groupedData.Key,
                            Amount1    = amount1buy + amount1sell,
                            Amount2    = amount2buy + amount2sell,
                            Cur1       = groupedData.Key.Substring(0, 3),
                            Cur2       = groupedData.Key.Substring(groupedData.Key.Length - 3, 3),
                        };


                        curPairPositionPerClient.AddOrUpdate(pairpos);
                        //Console.WriteLine(pairpos);
                        LogInfo("positionpercustomer- " + pairpos.ToString());
                        return(pairpos);
                    }
                                                                )
                                              .Subscribe();
                    return(new CompositeDisposable(positionpercustomer));
                })
                                                 .Subscribe();

                return(new CompositeDisposable(PositionPerPairPerCustomer));
            })
                      .Subscribe();
        }
 public void PushCurPairPositionPerClientRemove(CurPairPositionPerClient curPairPositionPerClient)
 {
     Console.WriteLine(curPairPositionPerClient);
 }