Exemple #1
0
        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);
 }
Exemple #4
0
        //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);
            }
        }
Exemple #9
0
        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);
        }