public override Arbitrage GetArbitrage(string pair, string tradingMarket, List <ArbitrageMarket> arbitrageMarkets = null, ArbitrageType?arbitrageType = null) { if (arbitrageMarkets == null || !arbitrageMarkets.Any()) { arbitrageMarkets = new List <ArbitrageMarket> { ArbitrageMarket.ETH, ArbitrageMarket.BNB, ArbitrageMarket.USDT }; } Arbitrage arbitrage = new Arbitrage { Market = arbitrageMarkets.First(), Type = arbitrageType ?? ArbitrageType.Direct }; try { if (tradingMarket == Constants.Markets.BTC) { foreach (var market in arbitrageMarkets) { string marketPair = ChangeMarket(pair, market.ToString()); string arbitragePair = GetArbitrageMarketPair(market); if (marketPair != pair && Tickers.TryGetValue(pair, out Ticker pairTicker) && Tickers.TryGetValue(marketPair, out Ticker marketTicker) && Tickers.TryGetValue(arbitragePair, out Ticker arbitrageTicker)) { decimal directArbitragePercentage = 0; decimal reverseArbitragePercentage = 0; if (market == ArbitrageMarket.ETH) { directArbitragePercentage = (1 / pairTicker.AskPrice * marketTicker.BidPrice * arbitrageTicker.BidPrice - 1) * 100; reverseArbitragePercentage = (1 / arbitrageTicker.AskPrice / marketTicker.AskPrice * pairTicker.BidPrice - 1) * 100; } else if (market == ArbitrageMarket.BNB) { directArbitragePercentage = (1 / pairTicker.AskPrice * marketTicker.BidPrice * arbitrageTicker.BidPrice - 1) * 100; reverseArbitragePercentage = (1 / arbitrageTicker.AskPrice / marketTicker.AskPrice * pairTicker.BidPrice - 1) * 100; } else if (market == ArbitrageMarket.USDT) { directArbitragePercentage = (1 / pairTicker.AskPrice * marketTicker.BidPrice / arbitrageTicker.AskPrice - 1) * 100; reverseArbitragePercentage = (arbitrageTicker.BidPrice / marketTicker.AskPrice * pairTicker.BidPrice - 1) * 100; } if ((directArbitragePercentage > arbitrage.Percentage || !arbitrage.IsAssigned) && (arbitrageType == null || arbitrageType == ArbitrageType.Direct)) { arbitrage.IsAssigned = true; arbitrage.Market = market; arbitrage.Type = ArbitrageType.Direct; arbitrage.Percentage = directArbitragePercentage; } if ((reverseArbitragePercentage > arbitrage.Percentage || !arbitrage.IsAssigned) && (arbitrageType == null || arbitrageType == ArbitrageType.Reverse)) { arbitrage.IsAssigned = true; arbitrage.Market = market; arbitrage.Type = ArbitrageType.Reverse; arbitrage.Percentage = reverseArbitragePercentage; } } } } } catch { } return(arbitrage); }