public static async Task <List <MarketQueryResponse> > SubscribeMarketsList(List <string> deltas) { List <MarketQueryResponse> failedList = new List <MarketQueryResponse>(); var subList = deltas.Select(d => WSSharpTransport.HubProxy.Invoke("SubscribeToExchangeDeltas", d)).ToArray(); await Task.WhenAll(subList); foreach (string d in deltas) { var delta = "BTC-" + d; Trace.Write("\rSUBBING: " + delta + " \r"); await WSSharpTransport.HubProxy.Invoke("SubscribeToExchangeDeltas", delta); MarketQueryResponse marketQuery = await WSSharpTransport.HubProxy.Invoke <MarketQueryResponse>("QueryExchangeState", delta); marketQuery.MarketName = delta; bool opened = await BtrexData.TryOpenMarket(marketQuery); if (!opened) { failedList.Add(marketQuery); } } return(failedList); }
public Market(MarketQueryResponse snapshot) { MarketDelta = snapshot.MarketName; Nounce = snapshot.Nounce; OrderBook = new OrderBook(snapshot); TradeHistory = new TradeHistory(snapshot); }
public OrderBook(MarketQueryResponse snapshot) { MarketDelta = snapshot.MarketName; Bids = new ConcurrentDictionary <decimal, decimal>(); Asks = new ConcurrentDictionary <decimal, decimal>(); setAsksSnap(snapshot); setBidsSnap(snapshot); }
//public readonly static HubConnection hubConnection = new HubConnection("https://socket.bittrex.com/"); //public static IHubProxy btrexHubProxy; public async Task SubscribeMarket(string delta) { await WSSharpTransport.HubProxy.Invoke("SubscribeToExchangeDeltas", delta); MarketQueryResponse marketQuery = WSSharpTransport.HubProxy.Invoke <MarketQueryResponse>("QueryExchangeState", delta).Result; marketQuery.MarketName = delta; await BtrexData.OpenMarket(marketQuery); }
public static async Task OpenMarket(MarketQueryResponse snapshot) { //Market.Market market = new Market.Market(snapshot); //await market.TradeHistory.Resolve5mCandles(); //bool added; //do //{ // added = Markets.TryAdd(market.MarketDelta, market); //} while (!added); }
private void setAsksSnap(MarketQueryResponse snap) { Asks.Clear(); foreach (Sell ask in snap.Sells) { bool added = false; while (!added) { added = Asks.TryAdd(ask.Rate, ask.Quantity); } } }
private void setBidsSnap(MarketQueryResponse snap) { Bids.Clear(); foreach (Buy bid in snap.Buys) { bool added = false; while (!added) { added = Bids.TryAdd(bid.Rate, bid.Quantity); } } }
public static void ProcessQueue() { var pause = TimeSpan.FromMilliseconds(100); while (true) { if (UpdateQueue.IsEmpty) { // no pending updates available pause Thread.Sleep(pause); continue; } bool tryDQ = false; do { MarketDataUpdate mdUpdate = new MarketDataUpdate(); tryDQ = UpdateQueue.TryDequeue(out mdUpdate); if (tryDQ) { if (mdUpdate.Nounce <= Markets[mdUpdate.MarketName].Nounce || Markets[mdUpdate.MarketName] == null) { break; } else if (mdUpdate.Nounce > Markets[mdUpdate.MarketName].Nounce + 1) { //IF NOUNCE IS DE-SYNCED, WIPE BOOK AND RE-SNAP Trace.WriteLine(string.Format(" !!!!ERR>> NOUNCE OUT OF ORDER! " + mdUpdate.MarketName + " BOOK-DSYNC. {0}, {1}", Markets[mdUpdate.MarketName].Nounce, mdUpdate.Nounce)); bool removed; do { Market.Market m; removed = Markets.TryRemove(mdUpdate.MarketName, out m); } while (!removed); //Request MarketQuery from websocket, and OpenBook() with new snapshot MarketQueryResponse marketQuery = BtrexWS.WSSharpTransport.HubProxy.Invoke <MarketQueryResponse>("QueryExchangeState", mdUpdate.MarketName).Result; marketQuery.MarketName = mdUpdate.MarketName; OpenMarket(marketQuery).Wait(); Trace.WriteLine(" [BOOK RE-SYNCED]"); break; } else { Markets[mdUpdate.MarketName].SetUpdate(mdUpdate); } } } while (!tryDQ); } }
public TradeHistory(MarketQueryResponse snap) { //Pull candles from SQLite data and rectify with snap data, //if cant rectify imediately, enter rectefication process/state MarketDelta = snap.MarketName; RecentFills = new List <mdFill>(); Candles5m = new List <HistDataLine>(); if (snap.Fills.Count() > 0) { snap.Fills.Reverse(); foreach (Fill fill in snap.Fills) { RecentFills.Add(new mdFill(Convert.ToDateTime(fill.TimeStamp), fill.Price, fill.Quantity, fill.OrderType)); } } Trace.Write(string.Format("\rResolving Candle Data: [{0}] ", MarketDelta)); //Compare last-time from .data, and first-time from snap: using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + HistoricalData.dbName + ";Version=3;")) { conn.Open(); using (var cmd = new SQLiteCommand(conn)) { cmd.CommandText = string.Format("SELECT * FROM {0} ORDER BY datetime(DateTime) DESC Limit 1", MarketDelta.Replace('-', '_')); LastStoredCandle = Convert.ToDateTime(cmd.ExecuteScalar()); } conn.Close(); } //Candle Time is the START time of the 5m period. This means it is current to +5min from that time. DateTime NextCandleTime = LastStoredCandle.AddMinutes(5); if (NextCandleTime > RecentFills.Last().TimeStamp) { //NO TRADES MADE IN THIS CANDLE PERIOD. CandlesResolved = true; return; } else if (NextCandleTime >= RecentFills.First().TimeStamp) { BuildCandleFromRecentFills(NextCandleTime); //Trace.WriteLine("@@@@@ NEW CANDLE = T:{0} O:{1} H:{2} L:{3} C:{4} V:{5}", //nextCandle.DateTime, nextCandle.Open, nextCandle.High, nextCandle.Low, nextCandle.Close, nextCandle.Volume); CandlesResolved = true; } }
public static async Task <bool> TryOpenMarket(MarketQueryResponse snapshot) { //Market.Market market = new Market.Market(snapshot); //bool resolved = await market.TradeHistory.Resolve5mCandles(false); //if (!resolved) //{ // return false; //} //else //{ // bool added; // do // { // added = Markets.TryAdd(market.MarketDelta, market); // } while (!added); //} return(true); }
public static async Task <bool> TryOpenMarket(MarketQueryResponse snapshot) { Market.Market market = new Market.Market(snapshot); bool resolved = await market.TradeHistory.Resolve5mCandles(false); if (!resolved) { return(false); } else { bool added; do { added = Markets.TryAdd(market.MarketDelta, market); } while (!added); } return(true); }