public async void Update(StaticArbitrageInfo info, IStaticArbitrageUpdateListener listener)
        {
            if (concurrentTickersCount2 > 8)
            {
                return;
            }
            Interlocked.Increment(ref concurrentTickersCount2);

            info.NextOverdueMs          = 6000;
            info.StartUpdateMs          = timer.ElapsedMilliseconds;
            info.ObtainingData          = true;
            info.ObtainDataSuccessCount = 0;
            info.ObtainDataCount        = 0;

            Task task = Task.Factory.StartNew(() => {
                if (info.AltBase.UpdateOrderBook())
                {
                    info.ObtainDataSuccessCount++;
                }
                info.ObtainDataCount++;
                if (info.AltUsdt.UpdateOrderBook())
                {
                    info.ObtainDataSuccessCount++;
                }
                info.ObtainDataCount++;
                if (info.BaseUsdt.UpdateOrderBook())
                {
                    info.ObtainDataSuccessCount++;
                }
                info.ObtainDataCount++;
            });

            await task;

            Interlocked.Decrement(ref concurrentTickersCount2); //todo
            if (info.ObtainDataCount == info.Count)
            {
                info.IsActual      = info.ObtainDataSuccessCount == info.Count;
                info.IsUpdating    = true;
                info.ObtainingData = false;
                info.UpdateTimeMs  = (int)(timer.ElapsedMilliseconds - info.StartUpdateMs);
                if (listener != null)
                {
                    listener.OnUpdateInfo(info, true);
                }
            }
            info.LastUpdate = DateTime.UtcNow;
        }
        public async void Update(TriplePairArbitrageInfo info, IStaticArbitrageUpdateListener listener)
        {
            info.NextOverdueMs          = 6000;
            info.StartUpdateMs          = timer.ElapsedMilliseconds;
            info.ObtainingData          = true;
            info.ObtainDataSuccessCount = 0;
            info.ObtainDataCount        = 0;

            Task task = Task.Factory.StartNew(() => {
                if (info.AltBase.UpdateOrderBook())
                {
                    info.ObtainDataSuccessCount++;
                }
                info.ObtainDataCount++;
                if (info.AltUsdt.UpdateOrderBook())
                {
                    info.ObtainDataSuccessCount++;
                }
                info.ObtainDataCount++;
                if (info.BaseUsdt.UpdateOrderBook())
                {
                    info.ObtainDataSuccessCount++;
                }
                info.ObtainDataCount++;
            });

            await task;

            if (info.ObtainDataCount == info.Count)
            {
                info.IsActual      = info.ObtainDataSuccessCount == info.Count;
                info.IsUpdating    = true;
                info.ObtainingData = false;
                info.UpdateTimeMs  = (int)(timer.ElapsedMilliseconds - info.StartUpdateMs);
                if (listener != null)
                {
                    listener.OnUpdateInfo(info, true);
                }
            }
            info.LastUpdate = DateTime.UtcNow;
        }