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 }); }
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); }
public ArbitrageInfo(TickerCollection collection) { Owner = collection; Tickers = Owner.Tickers; }
public void Update(TickerCollection collection, ITickerCollectionUpdateListener listener) { UpdateArbitrageInfo(collection, listener); }
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()); } }