Exemple #1
0
        public void ChangeStakeBackTest()
        {
            IoCContainer.Kernel.Unbind <IMediator>();
            IoCContainer.Kernel.Bind <IMediator>().To <MyMessageMediator>().InSingletonScope();


            IoCContainer.Kernel.Unbind <IChangeTracker>();
            IoCContainer.Kernel.Bind <IChangeTracker>().To <ChangeTracker>().InSingletonScope();
            var ChangeTracker = IoCContainer.Kernel.Get <IChangeTracker>();

            IoCContainer.Kernel.Unbind <ITicketHandler>();
            IoCContainer.Kernel.Bind <ITicketHandler>().To <TicketHandler>().InSingletonScope();
            var TicketHandler = IoCContainer.Kernel.Get <ITicketHandler>();

            TipItemVw tiv1 = new TipItemVw(new TestOdd()
            {
                OutcomeId = 1, OddId = { Value = 1 }, BetDomain = new TestBetDomain()
                {
                    BetDomainId = 1, Match = new TestMatchLn()
                    {
                        MatchId = 1
                    }
                }, Value = { Value = 1.85M }
            })
            {
                IsChecked = true
            };

            TicketHandler.TicketsInBasket.Add(new Ticket());
            TicketHandler.TicketsInBasket[0]        = new Ticket();
            TicketHandler.TicketsInBasket[0].MaxBet = 5000;
            TicketHandler.TicketsInBasket[0].TipItems.Add(tiv1);
            ChangeTracker.CurrentUser = new LoggedInUser(0, "", 1000.20m, 10, 10, 10);

            var model = new BaseViewModel();

            TicketHandler.OnChangeStake("+0.50", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);

            Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 0.50m);
            TicketHandler.OnChangeStake("+0.50", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);

            Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 1.00m);
            TicketHandler.OnChangeStake("+100", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);
            TicketHandler.OnChangeStake("+0.50", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);

            Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 101.50m);

            TicketHandler.OnChangeStake("back", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);

            Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 101.00m);
            TicketHandler.OnChangeStake("back", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);

            Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 10.00m);
        }
Exemple #2
0
        private static int?minCombinationOfAll(TipItemVw item)
        {
            int?minComb = 0;

            //if (item != null && item.Odd != null && item.Odd.BetDomain != null)
            //{
            //    minComb = item.Odd.BetDomain.MinCombination;
            //    var curMatch = item.Odd.BetDomain.Match;
            //    if (curMatch != null && curMatch.MinCombination > minComb)
            //    {
            //        minComb = curMatch.MinCombination;
            //    }
            //}
            return(minComb);
        }
Exemple #3
0
        public void ChangeStakeTest()
        {
            IoCContainer.Kernel.Unbind <IMediator>();
            IoCContainer.Kernel.Bind <IMediator>().To <MyMessageMediator>().InSingletonScope();
            IoCContainer.Kernel.Unbind <IChangeTracker>();
            IoCContainer.Kernel.Bind <IChangeTracker>().To <ChangeTracker>().InSingletonScope();
            var ChangeTracker = IoCContainer.Kernel.Get <IChangeTracker>();

            IoCContainer.Kernel.Unbind <ITicketHandler>();
            IoCContainer.Kernel.Bind <ITicketHandler>().To <TicketHandler>().InSingletonScope();
            var TicketHandler = IoCContainer.Kernel.Get <ITicketHandler>();

            TicketHandler.TicketsInBasket.Add(new Ticket());
            TranslationProvider.Setup(x => x.Translate(MultistringTags.ADD_XX_TO_STAKE)).Returns("{0}");
            TranslationProvider.Setup(x => x.Translate(MultistringTags.TERMINAL_STAKE_EXCEEDED_MAXBET)).Returns("maxbet");


            TipItemVw tiv1 = new TipItemVw(new TestOdd()
            {
                OutcomeId = 1, OddId = { Value = 1 }, BetDomain = new TestBetDomain()
                {
                    BetDomainId = 1, Match = new TestMatchLn()
                    {
                        MatchId = 1
                    }
                }, Value = { Value = 1.85M }
            })
            {
                IsChecked = true
            };

            TicketHandler.TicketsInBasket[0].MaxBet = 5000;
            TicketHandler.TicketsInBasket[0].TipItems.Add(tiv1);
            ChangeTracker.CurrentUser = new LoggedInUser(0, "", 10.20m, 10, 10, 10);

            var model = new BaseViewModel();

            TicketHandler.OnChangeStake("max", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);
            TicketHandler.OnChangeStake("max", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);
            TicketHandler.OnChangeStake("max", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool);
            Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 10.20m);
            var resultString = TicketHandler.OnChangeStake("5", TicketHandler.TicketsInBasket[0], 0);

            //Assert.AreEqual(MultistringTags.TERMINAL_STAKE_EXCEEDED_MAXBET, resultString.Item1);
            Assert.AreEqual(TicketHandler.TicketsInBasket[0].MaxBet, 5000.00m);
            Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 10.20m);
        }
Exemple #4
0
        public static bool RemoveBank(OddVw curOdd)
        {
            int       count      = 0;
            TipItemVw modifyItem = null;

            foreach (TipItemVw curItem in TipItems)
            {
                if (curItem.Odd.BetDomain.BetDomainId == curOdd.LineObject.BetDomain.BetDomainId)
                {
                    count++;
                    modifyItem = curItem;
                }
            }
            if (count < 2 && modifyItem != null)
            {
                modifyItem.IsBank = false;
            }
            return(count < 2);
        }
Exemple #5
0
        public static void UpdateSystemOrCombiticket(Ticket ticketToCalculate)
        {
            lock (locker)
            {
                if (ticketToCalculate == null)
                {
                    ticketToCalculate = ChangeTracker.NewTicket;
                }

                List <TipItemVw> localTipItems = new List <TipItemVw>();
                localTipItems = ticketToCalculate.TipItems.Where(x => x.IsChecked).ToList();

                decimal oddVal         = 1;
                decimal multiWayOddVal = 1;
                int?    minCombMax     = 0;
                int     bonusTipsCount = 0;

                Dictionary <int, List <TipItemVw> > tipItemDict = new Dictionary <int, List <TipItemVw> >();
                foreach (TipItemVw t in localTipItems)
                {
                    int iSvrMatchId = (int)t.Match.MatchId;

                    if (tipItemDict.ContainsKey(iSvrMatchId))
                    {
                        tipItemDict[iSvrMatchId].Add(t);
                    }
                    else
                    {
                        List <TipItemVw> list = new List <TipItemVw>();
                        list.Add(t);
                        tipItemDict.Add(iSvrMatchId, list);
                    }
                }
                // de: Anzahl der Wege berechnen                // en: Number of ways to calculate
                // de: h?chste Quote der Mehrwege finden        // en: highest rate of multipath are
                //
                int pathCount    = 0;
                int rowCount     = 1;
                int singlesCount = 0;
                foreach (List <TipItemVw> list in tipItemDict.Values)
                {
                    if (list.Count >= 1)
                    {
                        decimal maxOdd = 1;
                        foreach (TipItemVw tip in list)
                        {
                            if (maxOdd < tip.Odd.Value.Value)
                            {
                                maxOdd = tip.Odd.Value.Value;
                            }
                        }
                        TipItemVw t = list[0];
                        if (t.IsBank || list.Count > 1)
                        {
                            pathCount++;
                            rowCount       *= list.Count;
                            multiWayOddVal *= maxOdd;
                        }
                        else
                        {
                            oddVal *= maxOdd;
                            singlesCount++;
                        }
                        int?curCombMax = minCombinationOfAll(t);
                        if (curCombMax > minCombMax)
                        {
                            minCombMax = curCombMax;
                        }
                        if (list.Count == 1 && ticketToCalculate.TicketState == TicketStates.Multy)
                        {
                            if (t.Odd.Value.Value >= BonusFromOdd)
                            {
                                //Bonus gibt es nicht bei Mehrwegen
                                bonusTipsCount++;
                            }
                        }
                    }
                }

                TipListInfo.MinCombination           = minCombMax;
                TipListInfo.NumOfTipps               = tipItemDict.Count;
                TipListInfo.PathCount                = pathCount;
                TipListInfo.RowCount                 = rowCount;
                TipListInfo.MultiWayOddFactor        = multiWayOddVal;
                TipListInfo.CurrentTicketPossibleWin = 0;
                TipListInfo.FullOddFactor            = 0;

                TipListInfo.ManipulationFeePercentage = StationRepository.GetManipulationFeePercentage(ticketToCalculate);
                TipListInfo.BonusFactor = StationRepository.GetBonusValueForBets(ticketToCalculate) / 100 + 1;

                switch (ticketToCalculate.TicketState)
                {
                default:
                    if (localTipItems.Count > 1 && ticketToCalculate.TicketState != TicketStates.MultySingles)
                    {
                        ticketToCalculate.TicketState = TicketStates.Multy;
                        UpdateSystemOrCombiticket(ticketToCalculate);
                        return;
                    }
                    foreach (var tipItem in localTipItems)
                    {
                        tipItem.IsBank = false;
                    }
                    if (localTipItems.Count == 1 && ticketToCalculate.TicketState != TicketStates.MultySingles)
                    {
                        UpdateSingleticketItems(localTipItems, ticketToCalculate);
                    }
                    if (localTipItems.Count == 0)
                    {
                        TipListInfo.MinBet     = 0;
                        TipListInfo.OddOfTipps = 0;
                        TipListInfo.MaxBet     = 0;
                        TipListInfo.MinWin     = 0;
                        TipListInfo.MaxWin     = 0;
                        TipListInfo.ManipulationFeePercentage = 0;
                        TipListInfo.ResetNumXY();
                    }
                    break;

                case TicketStates.MultySingles:
                    return;

                case TicketStates.Multy:
                    //rowCount = 1;
                    TipListInfo.ResetNumXY();
                    if (localTipItems.Count < 2)
                    {
                        ticketToCalculate.TicketState = TicketStates.Single;
                        UpdateSystemOrCombiticket(ticketToCalculate);
                        return;
                    }
                    //TipListInfo.FullOddFactor = oddVal * multiWayOddVal * TipListInfo.BonusFactor;
                    TipListInfo.FullOddFactor = oddVal * multiWayOddVal;
                    if (TipListInfo.FullOddFactor >= MaxOdd)
                    {
                        TipListInfo.IsMaxOddBet = true;
                        if (TipListInfo.FullOddFactor > MaxOdd)
                        {
                            TipListInfo.IllegalOddFactor     = TipListInfo.FullOddFactor;
                            ticketToCalculate.MaxOddExceeded = true;
                        }
                        TipListInfo.FullOddFactor = MaxOdd;
                        TipListInfo.OddOfTipps    = MaxOdd;
                    }
                    else
                    {
                        TipListInfo.OddOfTipps           = oddVal * multiWayOddVal;
                        TipListInfo.IllegalOddFactor     = 0;
                        TipListInfo.IsMaxOddBet          = false;
                        ticketToCalculate.MaxOddExceeded = false;
                    }
                    foreach (var tipItem in localTipItems)
                    {
                        tipItem.IsBank = false;
                    }
                    TipListInfo.MinBet = MinStakeCombiBet;
                    TipListInfo.MaxBet = StationRepository.GetMaxStakeCombi(ticketToCalculate);

                    TipListInfo.MinWin = TipListInfo.FullOddFactor * TipListInfo.MinBet / rowCount * (100 - TipListInfo.ManipulationFeePercentage) / 100;

                    var manipulationFee = (TipListInfo.MaxBet / rowCount * TipListInfo.ManipulationFeePercentage) / 100;
                    //TipListInfo.MaxWin = ((TipListInfo.MaxBet / rowCount - manipulationFee) * TipListInfo.FullOddFactor * TipListInfo.BonusFactor) - TipListInfo.MaxBet / rowCount;
                    //TipListInfo.MaxWin *= rowCount;
                    TipListInfo.MaxWin = (((TipListInfo.MaxBet - manipulationFee) / rowCount) * TipListInfo.FullOddFactor * TipListInfo.BonusFactor) - TipListInfo.MaxBet;

                    var maxWinMultiBetFromAdmin = StationRepository.GetMaxWinMultiBet(ticketToCalculate);
                    if (maxWinMultiBetFromAdmin > 0 && TipListInfo.MaxWin > maxWinMultiBetFromAdmin)
                    {
                        var a0 = 100 * maxWinMultiBetFromAdmin * rowCount;
                        var a1 = (100 - TipListInfo.ManipulationFeePercentage);
                        var a2 = (a1 * TipListInfo.BonusFactor * TipListInfo.FullOddFactor);

                        var varX = (a0) / (a2 - 100 * rowCount);

                        TipListInfo.MaxBet = Round(varX, 2);
                        //manipulationFee = (TipListInfo.MaxBet / rowCount * TipListInfo.ManipulationFeePercentage) / 100;
                    }

                    //var posWin = TipListInfo.FullOddFactor * TipListInfo.Bet / rowCount;
                    //TipListInfo.CurrentTicketPossibleWin = posWin * ((100 - TipListInfo.ManipulationFeePercentage) / 100) * TipListInfo.BonusFactor;

                    var pw1 = (TipListInfo.Bet - (TipListInfo.Bet * TipListInfo.ManipulationFeePercentage / 100)) * TipListInfo.BonusFactor * TipListInfo.FullOddFactor;
                    TipListInfo.CurrentTicketPossibleWin = pw1 / rowCount;

                    //TipListInfo.MaxWin = (TipListInfo.MaxBet - manipulationFee) * TipListInfo.FullOddFactor * TipListInfo.BonusFactor / rowCount;
                    TipListInfo.MaxWin        = ((TipListInfo.MaxBet - (TipListInfo.MaxBet * TipListInfo.ManipulationFeePercentage / 100)) * TipListInfo.BonusFactor * TipListInfo.FullOddFactor) / rowCount;
                    TipListInfo.FullOddFactor = TipListInfo.FullOddFactor;
                    break;

                case TicketStates.System:
                    TipListInfo.SystemX          = ticketToCalculate.SystemX;
                    TipListInfo.IllegalOddFactor = 0;

                    int ind = 0;
                    if (!LimitHandling.SystemBetYAllowed(TipListInfo.SystemY))
                    {
                        //avoid useless time and memory consuming calculations
                        TipListInfo.MinBet     = 0;
                        TipListInfo.OddOfTipps = 0;
                        TipListInfo.MaxBet     = 0;
                        TipListInfo.MinWin     = 0;
                        TipListInfo.MaxWin     = 0;
                        TipListInfo.ManipulationFeePercentage = 0;
                        TipListInfo.ResetNumXY();
                        //UpdateSystemOrCombiticket(ticketToCalculate);
                        return;
                    }
                    if (TipListInfo.SystemX == 0)
                    {
                        TipListInfo.ResetNumXY();
                    }


                    decimal[] oddVals        = new decimal[TipListInfo.SystemY];
                    bool      disableBankBtn = TipListInfo.PathCount + TipListInfo.MinSystemY >= TipListInfo.NumOfTipps;
                    decimal   dBankTipValue  = 0;
                    foreach (TipItemVw t in localTipItems)
                    {
                        if (!t.IsBank && t.Odd != null)
                        {
                            if (ind < oddVals.Length)
                            {
                                oddVals[ind++] = t.Odd.Value.Value;
                            }
                            else
                            {
                            }


                            t.IsBankEnabled = !disableBankBtn;
                        }
                        else if (t.IsBank && t.Odd != null)
                        {
                            if (dBankTipValue == 0)
                            {
                                dBankTipValue = 1;     // to make multiplication possible;
                            }
                            dBankTipValue *= t.Odd.Value.Value;
                        }
                    }
                    RefreshBanks();

                    decimal maxOdd = OddUtilities.AllCombinationsSum(oddVals, TipListInfo.SystemX);     // TipListInfo.SystemX
                    if (maxOdd == 0)
                    {
                        ticketToCalculate.TicketState = TicketStates.Multy;
                        UpdateSystemOrCombiticket(ticketToCalculate);
                        return;
                    }

                    if (maxOdd * TipListInfo.MultiWayOddFactor > MaxOdd)
                    {
                        maxOdd = MaxOdd;
                        TipListInfo.MultiWayOddFactor    = 1;
                        ticketToCalculate.MaxOddExceeded = true;
                    }
                    else
                    {
                        ticketToCalculate.MaxOddExceeded = false;
                    }

                    if (oddVals.Length < TipListInfo.SystemX)
                    {
                        UpdateSystemOrCombiticket(ticketToCalculate);
                        return;
                    }

                    //ViewControl.SetTicketErrorMessage(TicketError.NoError);
                    TipListInfo.MinBet = MinStakeSystemBet;
                    //TipListInfo.MaxBet = StationSettings.Station.MaxStakeSystemBet;
                    TipListInfo.OddOfTipps = maxOdd;

                    decimal manFee = 0;
                    manFee = StationRepository.GetManipulationFeePercentage(ChangeTracker.NewTicket);
                    //TipListInfo.MaxBet = (100 * StationRepository.GetMaxWinSystemBet(ChangeTracker.NewTicket)) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount));

                    TipListInfo.MaxBet = (100 * StationRepository.GetMaxWinSystemBet(ChangeTracker.NewTicket) * TipListInfo.RowCount) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor));

                    TipListInfo.MaxBet = Round(Math.Min(TipListInfo.MaxBet, StationRepository.GetMaxStakeSystemBet(ChangeTracker.NewTicket)), 2);

                    TipListInfo.MinWin = TipListInfo.MinBet * maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount;
                    //TipListInfo.MaxWin = TipListInfo.MaxBet * maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount * TipListInfo.BonusFactor * (100 - TipListInfo.ManipulationFeePercentage) / 100;

                    TipListInfo.MaxWin = ((TipListInfo.MaxBet * (100 - TipListInfo.ManipulationFeePercentage) / 100) * TipListInfo.BonusFactor * maxOdd * TipListInfo.MultiWayOddFactor) / TipListInfo.RowCount;


                    /////////////////////////////////////////////
                    var maxWinSystemBetFromAdmin = StationRepository.GetMaxWinSystemBet(ticketToCalculate);
                    if (maxWinSystemBetFromAdmin > 0 && TipListInfo.MaxWin > maxWinSystemBetFromAdmin)
                    {
                        TipListInfo.MaxWin = maxWinSystemBetFromAdmin;
                        //manFee = StationRepository.GetManipulationFeePercentage(ChangeTracker.NewTicket);
                        //TipListInfo.MaxBet = (100 * TipListInfo.MaxWin) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount));
                        TipListInfo.MaxBet = Round((100 * StationRepository.GetMaxWinSystemBet(ChangeTracker.NewTicket) * TipListInfo.RowCount) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor)), 2);
                    }
                    /////////////////////////////////////////////

                    if (dBankTipValue > 0)
                    {
                        if (maxOdd * (multiWayOddVal / rowCount) > MaxOdd)
                        {
                            TipListInfo.FullOddFactor        = MaxOdd;
                            ticketToCalculate.MaxOddExceeded = true;
                        }
                        else
                        {
                            TipListInfo.FullOddFactor        = maxOdd * multiWayOddVal;
                            ticketToCalculate.MaxOddExceeded = false;
                        }
                    }
                    else
                    {
                        TipListInfo.FullOddFactor = maxOdd;
                    }
                    //TipListInfo.CurrentTicketPossibleWin = TipListInfo.Bet * maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount * TipListInfo.BonusFactor * (100 - TipListInfo.ManipulationFeePercentage) / 100;

                    TipListInfo.CurrentTicketPossibleWin = ((TipListInfo.Bet - ((TipListInfo.Bet * TipListInfo.ManipulationFeePercentage) / 100)) * TipListInfo.BonusFactor * maxOdd * TipListInfo.MultiWayOddFactor) / TipListInfo.RowCount;

                    TipListInfo.OddOfTipps = maxOdd;


                    break;
                }


                ticketToCalculate.NumberOfBets         = localTipItems.Count;
                ticketToCalculate.TotalOddDisplay      = TipListInfo.FullOddFactor;
                ticketToCalculate.ManipulationFeeValue = TipListInfo.ManipulationFeeValue;
                ticketToCalculate.MaxBet = TipListInfo.MaxBet;
                //ticketToCalculate.MaxBet = Math.Min(TipListInfo.MaxBet, StationRepository.GetMaxStake(ticketToCalculate));
                //ticketToCalculate.MaxBet = Math.Min(TipListInfo.MaxBet, TipListInfo.Bet);
                ticketToCalculate.MinBet                   = TipListInfo.MinBet;
                ticketToCalculate.BonusPercentage          = TipListInfo.BonusFactorPerc;
                ticketToCalculate.BonusValue               = TipListInfo.BonusValue / TipListInfo.RowCount;
                ticketToCalculate.MaxWin                   = TipListInfo.MaxWin;
                ticketToCalculate.RowCount                 = TipListInfo.RowCount;
                ticketToCalculate.StakeByRow               = ticketToCalculate.Stake / TipListInfo.RowCount;
                ticketToCalculate.CurrentTicketPossibleWin = TipListInfo.CurrentTicketPossibleWin;
                ticketToCalculate.SystemX                  = TipListInfo.SystemX;
                ticketToCalculate.SystemY                  = TipListInfo.SystemY;
                //ticketToCalculate.SystemButtonName = string.Format(TranslationProvider.Translate(MultistringTags.SYSTEM_FORMAT) as string, TipListInfo.SystemX, TipListInfo.SystemY, "+Banker");
            }
        }
Exemple #6
0
        public void VerifySelectedOdds(SortableObservableCollection <ITipItemVw> socSelectedOdds, SyncHashSet <ITipItemVw> hsOddsToRemove = null)
        {
            CheckTime ct = new CheckTime(true, "VerifySelectedOdds(TipCount={0})", socSelectedOdds.Count);

            ExcpHelper.ThrowIf <ArgumentNullException>(socSelectedOdds == null, "VerifySelectedOdds(NULL) ERROR");

            lock (_verifyLocker)
            {
                ct.AddEvent("Lock Entered");

                if (hsOddsToRemove != null)
                {
                    hsOddsToRemove.Clear();
                }
                else
                {
                    hsOddsToRemove = new SyncHashSet <ITipItemVw>();
                }

                SyncList <ITipItemVw> lTipItems = socSelectedOdds.ToSyncList();

                foreach (TipItemVw tiv in lTipItems)
                {
                    // Check if selected odd is not expired
                    if (!CheckOdd(tiv.Odd))
                    {
                        hsOddsToRemove.Add(tiv);
                    }
                    // Check if selected odd is not yet in current collection (m_lSelectedOdds)
                    else if (!m_lSelectedOdds.Contains(tiv.Odd))
                    {
                        m_lSelectedOdds.Add(tiv.Odd);
                        tiv.Odd.BetDomain.Match.SetSelected(tiv.Odd, true);
                    }
                }

                ct.AddEvent("Check Completed");

                // Remove from socSelectedOdds and m_lSelectedOdds
                for (int i = 0; i < lTipItems.Count;)
                {
                    var tiv = lTipItems[i];

                    if (hsOddsToRemove.Contains(tiv))
                    {
                        // This Odd is expired
                        lTipItems.Remove(tiv);
                        socSelectedOdds.Remove(tiv);
                        m_lSelectedOdds.Remove(tiv.Odd);
                        tiv.Odd.BetDomain.Match.SetSelected(tiv.Odd, false);
                    }
                    else
                    {
                        i++;
                    }
                }

                ct.AddEvent("Remove from List Completed");

                // Remove from m_lSelectedOdd those items were not removed in previous cycle
                for (int i = 0; i < m_lSelectedOdds.Count;)
                {
                    IOddLn odd = m_lSelectedOdds[i];

                    TipItemVw tiv = new TipItemVw(odd);

                    if (!lTipItems.Contains(tiv))
                    {
                        m_lSelectedOdds.Remove(odd);
                        tiv.Odd.BetDomain.Match.SetSelected(tiv.Odd, false);
                    }
                    else
                    {
                        i++;
                    }
                }

                ct.AddEvent("Remove from List2 Completed");
            }

            ct.Info(m_logger);
        }