/// <summary>
        ///
        /// </summary>
        /// <param name="rows"></param>
        /// <param name="transactionParameter"></param>
        /// <returns></returns>
        public BrokerTransactionBuilder Build(List <IWebElement> rows,
                                              TransactionParameter transactionParameter)
        {
            var date              = transactionParameter.GetFromDate();
            var symbol            = transactionParameter.Symbol;
            var brokerTransaction = new BrokerTransaction
            {
                Id          = $"{symbol}-{date:yyyyMMMdd}",
                Symbol      = symbol,
                CreatedDate = date
            };

            foreach (var row in rows)
            {
                var columns = row.FindElements(By.TagName("td"));
                try
                {
                    var code        = columns[1].Text;
                    var buyVolume   = columns[3].Text;
                    var buyAmount   = columns[4].Text;
                    var buyAverage  = columns[5].Text;
                    var sellVolume  = columns[6].Text;
                    var sellAmount  = columns[7].Text;
                    var sellAverage = columns[8].Text;
                    var netAmount   = columns[9].Text;
                    var totalValue  = columns[10].Text;

                    var brokerTransactionDetail = new BrokerTransactionDetail
                    {
                        Code        = code,
                        BuyVolume   = decimal.Parse(buyVolume),
                        BuyAmount   = decimal.Parse(buyAmount),
                        BuyAverage  = decimal.Parse(buyAverage),
                        SellVolume  = decimal.Parse(sellVolume),
                        SellAmount  = decimal.Parse(sellAmount),
                        SellAverage = decimal.Parse(sellAverage),
                        NetAmount   = decimal.Parse(netAmount),
                        TotalValue  = decimal.Parse(totalValue)
                    };
                    brokerTransaction.Details.Add(brokerTransactionDetail);
                }
                catch (WebDriverException e)
                {
                    Logger.Error("error has been encountered trying to retrieve broker infos from columns.", e);
                    throw;
                }
            }
            Transactions.Add(brokerTransaction);
            Logger.Info($"created brokerTransaction: {brokerTransaction}");
            return(this);
        }
示例#2
0
        private void SellCallBack(object obj)
        {
            BrokerTransaction tran = obj as BrokerTransaction;

            var checkMatchScored = ScoredMatchs.FirstOrDefault(m => (String.Equals(m.HomeTeamName, tran.BuyMatchOdd.HomeTeamName, StringComparison.CurrentCultureIgnoreCase) ||
                                                                     String.Equals(m.AwayTeamName, tran.BuyMatchOdd.AwayTeamName, StringComparison.CurrentCultureIgnoreCase)) &&
                                                               tran.SumScore != (m.HomeScore + m.AwayScore));

            if (checkMatchScored != null)
            {
                tran.FinishTransaction = true;
                tran.SellTimer.Dispose();
                return;
            }

            if (tran.SumMoneyBuy <= MaxPointCheck)
            {
                tran.FinishTransaction = true;
                tran.SellTimer.Dispose();
                return;
            }

            lock (LockBetSellEngine)
            {
                BetSellEngines.Shuffle();

                foreach (var sellEngine in BetSellEngines)
                {
                    if ((!tran.FastSell && sellEngine.ServerType != tran.ServerSell) ||
                        (tran.FastSell && tran.ServerSell != eServerType.Unknown && sellEngine.ServerType != tran.ServerSell))
                    {
                        continue;
                    }

                    if ((tran.ServerSell == eServerType.Ibet && sellEngine.EngineId == LastIbetEngineIdSell) ||
                        (tran.ServerSell == eServerType.Sbo && sellEngine.EngineId == LastSboEngineIdSell))
                    {
                        continue;
                    }

                    var sellPrepare = sellEngine.PrepareBetBroker(tran.BuyMatchOdd, tran.SellBetType, tran.BuyMatchOdd.Odd);
                    if (sellPrepare != null)
                    {
                        bool last      = (tran.SellSuccessCount + 1) >= tran.CountBuyEngine;
                        int  sellMoney = last ? tran.SumMoneyBuy : tran.SellMoneyAverage;

                        int sellPoint = ConvertMoneyToPoint(sellMoney, sellEngine.ExchangeRate);
                        if (sellPoint > sellPrepare.MaxBet)
                        {
                            sellPoint = sellPrepare.MaxBet;
                        }
                        sellPoint = GetGoodPoint(sellPoint, sellPrepare.MaxBet, true, last);

                        if (sellEngine.ConfirmBetBroker(sellPoint))
                        {
                            if (tran.ServerSell == eServerType.Ibet)
                            {
                                LastIbetEngineIdSell = sellEngine.EngineId;
                            }
                            else
                            {
                                LastSboEngineIdSell = sellEngine.EngineId;
                            }

                            tran.SumMoneyBuy -= ConvertPointToMoney(sellPoint, sellEngine.ExchangeRate);

                            if (tran.FastSell)
                            {
                                UpdateWriteTextLog(string.Format("BÁN NHANH [{6}] sau {8} phút  {0} vs {1} {2}:{3} PICK {4}: {5}  *stake: {7}",
                                                                 tran.BuyMatchOdd.HomeTeamName, tran.BuyMatchOdd.AwayTeamName,
                                                                 tran.BuyMatchOdd.OddType, tran.BuyMatchOdd.Odd, tran.SellBetType, sellPrepare.NewOdd, sellEngine.UserName, sellPoint, tran.TimeCheckScan), eLogTextType.Warning, eBrokerStatus.Sell);
                            }
                            else
                            {
                                UpdateWriteTextLog(string.Format("BÁN [{6}]: {0} vs {1} {2}:{3} PICK {4}: {5}  **stake: {7}",
                                                                 tran.BuyMatchOdd.HomeTeamName, tran.BuyMatchOdd.AwayTeamName,
                                                                 tran.BuyMatchOdd.OddType, tran.BuyMatchOdd.Odd, tran.SellBetType, sellPrepare.NewOdd, sellEngine.UserName, sellPoint), eLogTextType.Warning, eBrokerStatus.Sell);
                            }

                            tran.SellSuccessCount++;
                            if (tran.SumMoneyBuy <= MaxPointCheck)
                            {
                                tran.FinishTransaction = true;
                                tran.SellTimer.Dispose();
                                break;
                            }
                            else
                            {
                                tran.SellTimer.Change(WaitSellTimes[R.Next(WaitSellTimes.Count)], 60000);
                                break;
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        private void SboEnOnUpdateLiveDataChange(List <MatchOddDTO> matchOddDtos, bool isLive, int type)
        {
            if (matchOddDtos == null)
            {
                return;
            }

            try
            {
                var scoredMatch = ScoredMatchs.Where(sm => !sm.FinishCheck);
                if (scoredMatch.Any())
                {
                    foreach (var matchBroker in scoredMatch)
                    {
                        var sboMatch = matchOddDtos.Where(m =>
                                                          (String.Equals(m.HomeTeamName, matchBroker.HomeTeamName, StringComparison.CurrentCultureIgnoreCase) ||
                                                           String.Equals(m.AwayTeamName, matchBroker.AwayTeamName, StringComparison.CurrentCultureIgnoreCase)) &&
                                                          (m.OddType == eOddType.HCP))
                                       .OrderBy(sm => sm.AbsOdd).ToList();

                        if (!sboMatch.Any(s => s.AbsOdd >= GoalDefCheck))
                        {
                            matchBroker.CountTimeCheck++;
                            continue;
                        }

                        MatchOddDTO correctSboMatchOdd;
                        eBetType    buyBetType;
                        eServerType serverBuy;
                        OddDTO      ibetOdd;
                        if (HasGoodMatchOdd(sboMatch, out correctSboMatchOdd, out buyBetType, out serverBuy, out ibetOdd))
                        {
                            lock (LockBetBuyEngine)
                            {
                                if (BetBuyEngines.Count < 2)
                                {
                                    //khong du bet engine thoat khoi ham
                                    matchBroker.CountTimeCheck = 30;
                                    break;
                                }

                                var buyEngines = BetBuyEngines.Where(be => be.AccountStatus == eAccountStatus.Online &&
                                                                     be.ServerType == serverBuy);
                                BetBuyEngines.Shuffle();

                                float buyOdd   = 0f;
                                int   moneyBuy = 0;

                                foreach (var buyEngine in buyEngines)
                                {
                                    var buyPrepare = buyEngine.PrepareBetBroker(correctSboMatchOdd, buyBetType, correctSboMatchOdd.Odd, ibetOdd);
                                    if (buyPrepare != null)
                                    {
                                        int pointBuy = ConvertMoneyToPoint(StakeBuy, buyEngine.ExchangeRate);

                                        if (pointBuy > buyPrepare.MaxBet)
                                        {
                                            pointBuy = buyPrepare.MaxBet;
                                        }

                                        pointBuy = GetGoodPoint(pointBuy, buyPrepare.MaxBet, false);
                                        float bOdd = buyPrepare.NewOdd;

                                        if (buyEngine.ConfirmBetBroker(pointBuy))
                                        {
                                            buyOdd   = bOdd;
                                            moneyBuy = ConvertPointToMoney(pointBuy, buyEngine.ExchangeRate);;

                                            UpdateWriteTextLog(string.Format("MUA [{6}]: {0} vs {1} {2}:{3} PICK {4}: {5} **stake: {7}",
                                                                             correctSboMatchOdd.HomeTeamName, correctSboMatchOdd.AwayTeamName, correctSboMatchOdd.OddType, correctSboMatchOdd.Odd, buyBetType, buyPrepare.NewOdd,
                                                                             buyEngine.UserName, pointBuy), eLogTextType.Warning, eBrokerStatus.Buy);

                                            break;
                                        }
                                    }
                                }

                                if (moneyBuy != 0)
                                {
                                    BrokerTransaction trans = new BrokerTransaction();
                                    trans.SumScore      = matchBroker.HomeScore + matchBroker.AwayScore;
                                    trans.BuyMatchOdd   = correctSboMatchOdd;
                                    trans.BuyTime       = DateTime.Now;
                                    trans.BuyBetType    = buyBetType;
                                    trans.TimeCheckScan = CalTimeCheckScan(matchBroker.TimeType, matchBroker.Minutes);

                                    trans.SumMoneyBuy      = moneyBuy;
                                    trans.CountBuyEngine   = TotalAccSell;
                                    trans.SellMoneyAverage = moneyBuy / TotalAccSell;
                                    trans.BuyOdd           = buyOdd;

                                    trans.SellBetType = GetAgainstBetType(buyBetType);
                                    SellMatchs.Add(trans);

                                    matchBroker.CountTimeCheck = 30;
                                    continue;
                                }
                            }
                        }
                        else
                        {
                            matchBroker.CountTimeCheck++;
                            continue;
                        }
                    }

                    ScoredMatchs.Where(sm => sm.CountTimeCheck > 20 && !sm.FinishCheck).Select(c =>
                    {
                        c.FinishCheck = true;
                        return(c);
                    }).ToList();
                }
            }
            catch (Exception ex)
            {
                Logger.Error("SboEnOnUpdateLiveDataChange func", ex);
            }
        }
        private void SboEnOnUpdateLiveDataChange(List <MatchOddDTO> matchOddDtos, bool isLive, int type)
        {
            if (matchOddDtos == null)
            {
                return;
            }

            try
            {
                lock (LockScoredMatch)
                {
                    if (ScoredMatchs.Any())
                    {
                        foreach (var matchBroker in ScoredMatchs)
                        {
                            var sboMatch = matchOddDtos.Where(m =>
                                                              (String.Equals(m.HomeTeamName, matchBroker.HomeTeamName, StringComparison.CurrentCultureIgnoreCase) ||
                                                               String.Equals(m.AwayTeamName, matchBroker.AwayTeamName, StringComparison.CurrentCultureIgnoreCase)) &&
                                                              (m.OddType == eOddType.HCP))
                                           .OrderBy(sm => sm.AbsOdd).ToList();

                            if (!sboMatch.Any(s => s.AbsOdd >= GoalDefCheck))
                            {
                                matchBroker.CountTimeCheck++;
                                continue;
                            }

                            MatchOddDTO correctSboMatchOdd;
                            eBetType    buyBetType;
                            if (HasGoodMatchOdd(sboMatch, out correctSboMatchOdd, out buyBetType))
                            {
                                if (BetEngine.Count < 2)
                                {
                                    //khong du bet engine thoat khoi ham
                                    matchBroker.CountTimeCheck = 20;
                                    break;
                                }

                                int buyEngineCount = BetEngine.Count(be => be.AccountStatus == eAccountStatus.Online) / 2;
                                BetEngine.Shuffle();
                                List <string>        engineUsedId = new List <string>();
                                List <IEngineBroker> sellEngines  = new List <IEngineBroker>();
                                float sumBuyOdd = 0f;
                                int   moneyBuy  = 0;
                                int   mnBuy     = StakeBuy / buyEngineCount;
                                for (int i = 0; i < buyEngineCount; i++)
                                {
                                    var buyEngine  = BetEngine.First(be => be.AccountStatus == eAccountStatus.Online && !engineUsedId.Contains(be.EngineId));
                                    var buyPrepare = buyEngine.PrepareBetBroker(correctSboMatchOdd, buyBetType, correctSboMatchOdd.Odd);
                                    if (buyPrepare != null)
                                    {
                                        int pointBuy = ConvertMoneyToPoint(mnBuy, buyEngine.ExchangeRate);

                                        if (pointBuy > buyPrepare.MaxBet)
                                        {
                                            pointBuy = buyPrepare.MaxBet;
                                        }

                                        pointBuy = GetGoodPoint(pointBuy);
                                        float buyOdd = buyPrepare.NewOdd;

                                        if (buyEngine.ConfirmBetBroker(pointBuy))
                                        {
                                            sumBuyOdd += buyOdd;
                                            moneyBuy  += ConvertPointToMoney(pointBuy, buyEngine.ExchangeRate);;
                                            engineUsedId.Add(buyEngine.EngineId);
                                            var sellEngine = BetEngine.First(be => be.AccountStatus == eAccountStatus.Online && !engineUsedId.Contains(be.EngineId));
                                            sellEngines.Add(sellEngine);
                                            engineUsedId.Add(sellEngine.EngineId);

                                            UpdateWriteTextLog(string.Format("MUA [{6}]: {0}-{1} {2}:{3} PICK {4}: {5} **stake: {7}",
                                                                             correctSboMatchOdd.HomeTeamName, correctSboMatchOdd.AwayTeamName, correctSboMatchOdd.OddType, correctSboMatchOdd.Odd, buyBetType, buyPrepare.NewOdd,
                                                                             buyEngine.UserName, pointBuy), eLogTextType.Warning, eBrokerStatus.Bet);
                                        }
                                    }
                                }

                                if (sellEngines.Any())
                                {
                                    BrokerTransaction trans = new BrokerTransaction();
                                    trans.SumScore         = matchBroker.HomeScore + matchBroker.AwayScore;
                                    trans.BuyMatchOdd      = correctSboMatchOdd;
                                    trans.BuyTime          = DateTime.Now;
                                    trans.BuyBetType       = buyBetType;
                                    trans.TimeCheckScan    = CalTimeCheckScan(matchBroker.TimeType, matchBroker.Minutes);
                                    trans.BetEngineIdUsed  = engineUsedId;
                                    trans.BetSellEngine    = sellEngines;
                                    trans.SumMoneyBuy      = moneyBuy;
                                    trans.CountSellEngine  = sellEngines.Count;
                                    trans.SellMoneyAverage = moneyBuy / trans.CountSellEngine;
                                    trans.BuyOdd           = sumBuyOdd / trans.CountSellEngine;
                                    //trans.BuyOdd = buyBetType == eBetType.Home ?
                                    //    correctSboMatchOdd.HomeOdd : correctSboMatchOdd.AwayOdd;
                                    trans.SellBetType = GetAgainstBetType(buyBetType);
                                    lock (LockSellMatch)
                                    {
                                        SellMatchs.Add(trans);
                                    }

                                    matchBroker.CountTimeCheck = 20;
                                    continue;
                                }
                            }
                            else
                            {
                                matchBroker.CountTimeCheck++;
                                continue;
                            }
                        }

                        ScoredMatchs.RemoveAll(sm => sm.CountTimeCheck > 7);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("SboEnOnUpdateLiveDataChange func", ex);
            }
        }