/// <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); }
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; } } } } } }
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); } }