void ISimulationDataProvider.OnNewItem(IInputDataWithTime item)
        {
            ArbitrageStatisticsItem st   = (ArbitrageStatisticsItem)item;
            TickerCollection        coll = Listener.ArbitrageList.FirstOrDefault(c => c.BaseCurrency == st.BaseCurrency && c.MarketCurrency == st.MarketCurrency);

            if (coll == null)
            {
                return;
            }

            coll.Arbitrage.LowestAskHost     = st.LowestAskHost;
            coll.Arbitrage.HighestBidHost    = st.HighestBidHost;
            coll.Arbitrage.Time              = st.Time;
            coll.Arbitrage.LowestAskEnabled  = st.LowestAskEnabled;
            coll.Arbitrage.HighestBidEnabled = st.HighestBidEnabled;
            coll.Arbitrage.LowestAsk         = st.LowestAsk;
            coll.Arbitrage.HighestBid        = st.HighestBid;
            coll.Arbitrage.Spread            = st.Spread;
            coll.Arbitrage.Amount            = st.Amount;
            coll.Arbitrage.MaxProfit         = st.MaxProfit;
            coll.Arbitrage.MaxProfitUSD      = st.MaxProfitUSD;
            if (coll.Arbitrage.UsdTicker != null)
            {
                coll.Arbitrage.UsdTicker.Last = st.RateInUSD;
            }

            coll.Arbitrage.History.Add(st);

            OnArbitrageChanged(Listener, new ArbitrageChangedEventArgs()
            {
                Arbitrage = coll.Arbitrage, TickersInfo = coll
            });
        }
Beispiel #2
0
        public ActionResult <IEnumerable <string> > Get()
        {
            List <TickerCollection> items = ClassicArbitrageListener.ArbitrageList.Where(a => a.MaxProfitUSD > 0).ToList();

            string[]      res = new string[1];
            StringBuilder b   = new StringBuilder();

            b.Append('[');
            for (int i = 0; i < items.Count; i++)
            {
                TickerCollection info = items[i];
                b.Append('{');
                b.Append("\"time\":"); b.Append('"'); b.Append(info.LastUpdate.ToString()); b.Append("\",");
                b.Append("\"update_time\":"); b.Append('"'); b.Append(info.UpdateTimeMs.ToString()); b.Append("\",");
                b.Append("\"name\":"); b.Append('"'); b.Append(info.Name); b.Append("\",");
                b.Append("\"ask\":"); b.Append(info.LowestAsk.ToString("0.00000000")); b.Append(',');
                b.Append("\"bid\":"); b.Append(info.HighestBid.ToString("0.00000000")); b.Append(',');
                b.Append("\"spread\":"); b.Append(info.Spread.ToString("0.00000000")); b.Append(',');
                b.Append("\"max_profit_usd\":"); b.Append(info.MaxProfitUSD.ToString("0.000")); b.Append(',');
                b.Append("\"ask_webpage\":"); b.Append('"'); b.Append(info.LowestAskTicker.WebPageAddress); b.Append("\",");
                b.Append("\"bid_webpage\":"); b.Append('"'); b.Append(info.HighestBidTicker.WebPageAddress); b.Append("\",");
                b.Append('}');
                if (i < items.Count - 1)
                {
                    b.Append(',');
                }
            }
            b.Append(']');
            res[0] = b.ToString();
            return(res);
        }
        void UpdateArbitrageInfo(TickerCollection info, ITickerCollectionUpdateListener listener)
        {
            info.ObtainDataSuccessCount = 0;
            info.ObtainDataCount        = 0;
            info.NextOverdueMs          = 6000;
            info.StartUpdateMs          = timer.ElapsedMilliseconds;
            info.ObtainingData          = true;
            info.UpdateTimeMs           = 0;

            for (int i = 0; i < info.Count; i++)
            {
                info.Tickers[i].Exchange.UpdateOrderBookAsync(info.Tickers[i], 10, (e) => {
                    if (e.Result)
                    {
                        e.Ticker.OrderBook.UpdateHistory();
                    }
                    if (e.Result)
                    {
                        info.ObtainDataSuccessCount++;
                    }
                    info.ObtainDataCount++;

                    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.OnUpdateTickerCollection(info, true);
                        }
                    }
                });
            }
            //Task task = Task.Factory.StartNew(() => {
            //    for(int i = 0; i < info.Count; i++) {
            //        if(info.Tickers[i].UpdateOrderBook(OrderBook.Depth)) {
            //            //if(info.Tickers[i].UpdateTrades() && info.Tickers[i].TradeStatistic.Count > 0)
            //            //    info.Tickers[i].OrderBook.TradeInfo = info.Tickers[i].TradeStatistic.Last();
            //            //info.Tickers[i].OrderBook.CalcStatistics();
            //            info.Tickers[i].OrderBook.UpdateHistory();
            //            info.ObtainDataSuccessCount++;
            //        }
            //        info.ObtainDataCount++;
            //    }
            //});

            //await task;

            info.LastUpdate = DateTime.UtcNow;
        }
        async void UpdateArbitrageInfo(TickerCollection info, ITickerCollectionUpdateListener listener)
        {
            info.ObtainDataSuccessCount = 0;
            info.ObtainDataCount        = 0;
            info.NextOverdueMs          = 6000;
            info.StartUpdateMs          = timer.ElapsedMilliseconds;
            info.ObtainingData          = true;

            Task task = Task.Factory.StartNew(() => {
                for (int i = 0; i < info.Count; i++)
                {
                    if (info.Tickers[i].UpdateArbitrageOrderBook())
                    {
                        //if(info.Tickers[i].UpdateTrades() && info.Tickers[i].TradeStatistic.Count > 0)
                        //    info.Tickers[i].OrderBook.TradeInfo = info.Tickers[i].TradeStatistic.Last();
                        //info.Tickers[i].OrderBook.CalcStatistics();
                        info.Tickers[i].OrderBook.UpdateHistory();
                        info.ObtainDataSuccessCount++;
                    }
                    info.ObtainDataCount++;
                }
            });

            await task;

            Interlocked.Decrement(ref concurrentTickersCount); //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);
                //Debug.WriteLine(string.Format("{0} = {1}", info.Name, info.UpdateTimeMs));
                if (listener != null)
                {
                    listener.OnUpdateTickerCollection(info, true);
                }
            }
            info.LastUpdate = DateTime.UtcNow;
        }
 public void Update(TickerCollection collection, ITickerCollectionUpdateListener listener)
 {
     Interlocked.Increment(ref concurrentTickersCount);
     UpdateArbitrageInfo(collection, listener);
 }
Beispiel #6
0
 public ArbitrageInfo(TickerCollection collection)
 {
     Owner   = collection;
     Tickers = Owner.Tickers;
 }
 public void Update(TickerCollection collection, ITickerCollectionUpdateListener listener)
 {
     UpdateArbitrageInfo(collection, listener);
 }
Beispiel #8
0
        public ActionResult <string> Get(string id)
        {
            if (id == "log")
            {
                ResizeableArray <LogMessage> items = LogManager.Default.Messages;
                StringBuilder b = new StringBuilder();
                b.Append('[');
                for (int i = items.Count - 1; i >= 0; i++)
                {
                    LogMessage info = items[i];
                    b.Append('{');
                    b.Append("\"type\":"); b.Append('"'); b.Append(info.Type); b.Append("\",");
                    b.Append("\"name\":"); b.Append('"'); b.Append(info.Name); b.Append("\",");
                    b.Append("\"time\":"); b.Append('"'); b.Append(info.Time.ToLongTimeString()); b.Append("\",");
                    b.Append("\"text\":"); b.Append('"'); b.Append(info.Text); b.Append("\",");
                    b.Append("\"description\":"); b.Append('"'); b.Append(info.Description); b.Append("\",");
                    b.Append("}\n");
                    if (i < items.Count - 1)
                    {
                        b.Append(',');
                    }
                }
                b.Append(']');
                return(b.ToString());
            }
            else if (id == "profit" || id == "items")
            {
                ResizeableArray <TickerCollection> items = id == "profit"?
                                                           ResizeableArray <TickerCollection> .FromList(ClassicArbitrageListener.ArbitrageList.Where(a => a.MaxProfitUSD > 0).ToList()):
                                                           ClassicArbitrageListener.ArbitrageList;

                StringBuilder b = new StringBuilder();
                b.Append('[');
                for (int i = 0; i < items.Count; i++)
                {
                    TickerCollection info = items[i];
                    b.Append('{');
                    b.Append("\"time\":"); b.Append('"'); b.Append(info.LastUpdate.ToString()); b.Append("\",");
                    b.Append("\"update_time\":"); b.Append('"'); b.Append(info.UpdateTimeMs.ToString()); b.Append("\",");
                    b.Append("\"isActual\":"); b.Append('"'); b.Append(info.IsActual); b.Append("\",");
                    b.Append("\"name\":"); b.Append('"'); b.Append(info.Name); b.Append("\",");
                    b.Append("\"ask\":"); b.Append(info.LowestAsk.ToString("0.00000000")); b.Append(',');
                    b.Append("\"bid\":"); b.Append(info.HighestBid.ToString("0.00000000")); b.Append(',');
                    b.Append("\"spread\":"); b.Append(info.Spread.ToString("0.00000000")); b.Append(',');
                    b.Append("\"max_profit_usd\":"); b.Append(info.MaxProfitUSD.ToString("0.000")); b.Append(',');
                    b.Append("\"ask_webpage\":"); b.Append('"');
                    if (info.LowestAskTicker != null)
                    {
                        b.Append(info.LowestAskTicker.WebPageAddress);
                    }
                    b.Append("\",");
                    b.Append("\"bid_webpage\":"); b.Append('"');
                    if (info.HighestBidTicker != null)
                    {
                        b.Append(info.HighestBidTicker.WebPageAddress);
                    }
                    b.Append("\",");
                    b.Append('}');
                    if (i < items.Count - 1)
                    {
                        b.Append(',');
                    }
                }
                b.Append(']');
                return(b.ToString());
            }
            else if (id == "timing")
            {
                ResizeableArray <TickerCollection> items = ClassicArbitrageListener.ArbitrageList;
                StringBuilder b = new StringBuilder();
                b.Append('[');
                for (int i = 0; i < items.Count; i++)
                {
                    TickerCollection info = items[i];
                    b.Append('{');
                    b.Append("\"name\":"); b.Append('"'); b.Append(info.Name); b.Append("\",");
                    b.Append("\"timeFromLastUpdateSec\":"); b.Append('"'); b.Append((DateTime.UtcNow - info.LastUpdate).TotalMilliseconds.ToString()); b.Append("\",");
                    b.Append("\"updateTime\":"); b.Append('"'); b.Append(info.UpdateTimeMs.ToString()); b.Append("\",");
                    b.Append("\"isActual\":"); b.Append('"'); b.Append(info.IsActual); b.Append("\",");
                    b.Append("}\n");
                    if (i < items.Count - 1)
                    {
                        b.Append(',');
                    }
                }
                b.Append(']');
                return(b.ToString());
            }
            else if (id == "updating")
            {
                ResizeableArray <TickerCollection> items = ClassicArbitrageListener.ArbitrageList;
                StringBuilder b = new StringBuilder();
                b.Append('[');
                for (int i = 0; i < items.Count; i++)
                {
                    if (!items[i].ObtainingData)
                    {
                        continue;
                    }
                    TickerCollection info = items[i];
                    b.Append('{');
                    b.Append("\"name\":"); b.Append('"'); b.Append(info.Name); b.Append("\",");
                    b.Append("\"timeFromLastUpdateSec\":"); b.Append('"'); b.Append((DateTime.UtcNow - info.LastUpdate).TotalMilliseconds.ToString()); b.Append("\",");
                    b.Append("\"updateTime\":"); b.Append('"'); b.Append(info.UpdateTimeMs.ToString()); b.Append("\",");
                    b.Append("\"isActual\":"); b.Append('"'); b.Append(info.IsActual); b.Append("\",");
                    b.Append("}\n");
                    if (i < items.Count - 1)
                    {
                        b.Append(',');
                    }
                }
                b.Append(']');
                return(b.ToString());
            }
            else if (id == "history")
            {
                StringBuilder b = new StringBuilder();
                b.Append('[');
                int end = Math.Max(0, ArbitrageHistoryHelper.Default.History.Count - 1 - 100);
                for (int i = ArbitrageHistoryHelper.Default.History.Count - 1; i >= 0 && i >= end; i--)
                {
                    ArbitrageStatisticsItem info = ArbitrageHistoryHelper.Default.History[i];
                    b.Append('{');
                    b.Append("\"time\":"); b.Append('"'); b.Append(info.Time); b.Append("\",");
                    b.Append("\"name\":"); b.Append('"'); b.Append(info.BaseCurrency + "-" + info.MarketCurrency); b.Append("\",");
                    b.Append("\"ask\":"); b.Append(info.LowestAsk.ToString("0.00000000")); b.Append(',');
                    b.Append("\"bid\":"); b.Append(info.HighestBid.ToString("0.00000000")); b.Append(',');
                    b.Append("\"spread\":"); b.Append(info.Spread.ToString("0.00000000")); b.Append(',');
                    b.Append("\"max_profit_usd\":"); b.Append(info.MaxProfitUSD.ToString("0.000")); b.Append(',');
                    b.Append('}');
                    if (i > end)
                    {
                        b.Append(',');
                    }
                }
                b.Append(']');
                return(b.ToString());
            }
            else if (id == "positive_history")
            {
                StringBuilder b = new StringBuilder();
                b.Append('[');
                int end = 0;
                for (int i = ArbitrageHistoryHelper.Default.History.Count - 1; i >= 0 && i >= end; i--)
                {
                    ArbitrageStatisticsItem info = ArbitrageHistoryHelper.Default.History[i];
                    if (info.MaxProfitUSD <= 0)
                    {
                        continue;
                    }
                    b.Append('{');
                    b.Append("\"time\":"); b.Append('"'); b.Append(info.Time); b.Append("\",");
                    b.Append("\"name\":"); b.Append('"'); b.Append(info.BaseCurrency + "-" + info.MarketCurrency); b.Append("\",");
                    b.Append("\"ask\":"); b.Append(info.LowestAsk.ToString("0.00000000")); b.Append(',');
                    b.Append("\"bid\":"); b.Append(info.HighestBid.ToString("0.00000000")); b.Append(',');
                    b.Append("\"spread\":"); b.Append(info.Spread.ToString("0.00000000")); b.Append(',');
                    b.Append("\"max_profit_usd\":"); b.Append(info.MaxProfitUSD.ToString("0.000")); b.Append(',');
                    b.Append('}');
                    if (i > end)
                    {
                        b.Append(',');
                    }
                }
                b.Append(']');
                return(b.ToString());
            }
            else
            {
                TickerCollection coll = ClassicArbitrageListener.ArbitrageList.FirstOrDefault(a => a.Name == id);
                if (coll == null)
                {
                    return(string.Empty);
                }

                StringBuilder b = new StringBuilder();
                b.Append('[');
                int end = Math.Max(0, coll.Arbitrage.History.Count - 1 - 10);
                for (int i = coll.Arbitrage.History.Count - 1; i >= 0 && i >= end; i--)
                {
                    ArbitrageStatisticsItem info = coll.Arbitrage.History[i];
                    b.Append('{');
                    b.Append("\"time\":"); b.Append('"'); b.Append(info.Time); b.Append("\",");
                    b.Append("\"ask\":"); b.Append(info.LowestAsk.ToString("0.00000000")); b.Append(',');
                    b.Append("\"bid\":"); b.Append(info.HighestBid.ToString("0.00000000")); b.Append(',');
                    b.Append("\"spread\":"); b.Append(info.Spread.ToString("0.00000000")); b.Append(',');
                    b.Append("\"max_profit_usd\":"); b.Append(info.MaxProfitUSD.ToString("0.000")); b.Append(',');
                    b.Append('}');
                    if (i > end)
                    {
                        b.Append(',');
                    }
                }
                b.Append(']');
                return(b.ToString());
            }
        }