public static async Task UpdateHistData()
        {
            Console.WriteLine();

            //Start ProcessQueue thread:
            var SQLthread = new Thread(() => ProcessDataQueue());

            SQLthread.IsBackground = true;
            SQLthread.Name         = "Saving-Market-Histories";
            SQLthread.Start();


            //Call list of available markets from Btrex:
            GetMarketsResponse markets = await BtrexREST.GetMarkets();

            if (markets.success != true)
            {
                Console.WriteLine("    !!!!ERR GET-MARKETS>>> " + markets.message);
                return;
            }


            //Create string list of BTC market deltas only:
            List <string> BTCmarketDeltas = new List <string>();

            foreach (GetMarketsResult market in markets.result)
            {
                if (market.MarketName.Split('-')[0] == "BTC")
                {
                    BTCmarketDeltas.Add(market.MarketName);
                }
            }
            totalCount = BTCmarketDeltas.Count;

            //Download all histories, enqueue responses:
            var downloadHists = BTCmarketDeltas.Select(EnqueueData).ToArray();
            await Task.WhenAll(downloadHists);

            //Wait for Save-Data thread to complete:
            while (!savedComplete)
            {
                Thread.Sleep(100);
            }

            SQLthread.Abort();
            Console.WriteLine();

            //Update CSV files:
            Console.Write("Updating .CSVs - Just a moment...");
            UpdateOrCreateCSVs();

            //Garbage Collection to clean up SQLiteConnection
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Console.WriteLine("\rUpdating .CSVs - [COMPLETE]        ");
        }
示例#2
0
        private async Task SubTopMarketsByVol(int n)
        {
            List <string> topMarkets = await BtrexREST.GetTopMarketsByBVbtcOnly(n);

            foreach (string mk in topMarkets)
            {
                await BtrexWS.SubscribeMarket("BTC-" + mk);
            }

            await PreloadCandlesDict(6);
        }
        private static async Task EnqueueData(string delta)
        {
            HistDataResponse histData = await BtrexREST.GetMarketHistoryV2(delta, "fiveMin");

            if (histData.success != true)
            {
                Console.WriteLine("    !!!!ERR GET-HISTORY>>> " + histData.message);
                return;
            }
            //downloaded++;

            DataQueue.Enqueue(histData);
        }
        public static async Task StartDataUpdates()
        {
            //set USD value for conversions
            USDrate = await BtrexREST.getUSD();

            //Start crontriggered jobs:
            sched.Start();
            sched.ScheduleJob(BuildCandles, candleTrigger);
            //sched.ScheduleJob(DataCleanup, cleanUpTrigger);

            //Begin Dequeue Thread:
            var DequeueThread = new Thread(() => ProcessQueue());

            DequeueThread.IsBackground = true;
            DequeueThread.Name         = "Update-Dequeue-Thread";
            DequeueThread.Start();
        }
示例#5
0
        private async Task SubTopMarketsByVol(int n)
        {
            List <string> topMarkets = await BtrexREST.GetTopMarketsByBVbtcOnly(n);

            //ADD DELTAS FROM HOLDINGS TABLE
            foreach (DataTable dt in Holdings.Tables)
            {
                foreach (DataRow row in dt.Rows)
                {
                    if (!topMarkets.Exists(o => o == row["MarketDelta"].ToString().Split('-')[1]))
                    {
                        topMarkets.Add((string)row["MarketDelta"].ToString().Split('-')[1]);
                    }
                }
            }

            //SUBSCRIBE ALL MARKETS, RETRY FAILED AT END:
            List <MarketQueryResponse> timeGapMarkets = await BtrexWS.SubscribeMarketsList(topMarkets.Except(OPTIONS.ExcludeTheseDeltas).ToList());

            if (timeGapMarkets.Count > 0)
            {
                await RetryTimeGappedMarkets(timeGapMarkets);
            }
        }
示例#6
0
        public async Task <bool> Resolve5mCandles(bool retryOnFail = true)
        {
            DateTime NextCandleTime     = LastStoredCandle.AddMinutes(5);
            DateTime NextCandleCurrTime = LastStoredCandle.AddMinutes(10);

            if (CandlesResolved)
            {
                Trace.WriteLine(string.Format("\r[{1}] CANDLES RESOLVED - LastCandleStart: {0}", LastStoredCandle, MarketDelta));
                return(true);
            }

            while (!CandlesResolved)
            {
                HistDataResponse response = await BtrexREST.GetMarketHistoryV2(MarketDelta, "oneMin");

                if (!response.success)
                {
                    Trace.WriteLine("    !!!!ERR GET-1m-CANDLES: [{0}]", MarketDelta);
                    return(false);
                }

                DateTime last1mCandleCurrTime = response.result.Last().T.AddMinutes(1);
                DateTime firstFillTime        = RecentFills.First().TimeStamp;

                if (last1mCandleCurrTime >= firstFillTime)
                {
                    //Build latest 5m candle with 1m data and RecentFills:
                    List <HistDataLine> Candles1m = new List <HistDataLine>();
                    foreach (HistDataLine line in response.result)
                    {
                        if (line.T >= LastStoredCandle.AddMinutes(5))
                        {
                            Candles1m.Add(line);
                        }
                    }

                    //Grab O:H:L:V (noC) from 1mCandles
                    //simulate 2 mdFills (H&L:V) and add to beginning of RecentFills
                    Decimal O = Candles1m.First().O,
                            H = Candles1m.Max(x => x.H),
                            L = Candles1m.Min(x => x.L),
                            V = Candles1m.Sum(x => x.V),
                            C = Candles1m.Last().C;

                    List <mdFill> RevisedFills = new List <mdFill>();
                    RevisedFills.Add(new mdFill(LastStoredCandle.AddMinutes(5), O, (V / 4M), "BUY"));
                    RevisedFills.Add(new mdFill(LastStoredCandle.AddSeconds(300.5), H, (V / 4M), "SELL"));
                    RevisedFills.Add(new mdFill(LastStoredCandle.AddSeconds(300.5), L, (V / 4M), "BUY"));
                    RevisedFills.Add(new mdFill(LastStoredCandle.AddSeconds(301), C, (V / 4M), "SELL"));

                    if (last1mCandleCurrTime >= NextCandleCurrTime)
                    {
                        RecentFills = new List <mdFill>(RevisedFills);
                    }
                    else
                    {
                        foreach (mdFill fill in RecentFills)
                        {
                            if (fill.TimeStamp >= last1mCandleCurrTime && last1mCandleCurrTime < NextCandleCurrTime)
                            {
                                RevisedFills.Add(fill);
                            }
                        }

                        RecentFills = new List <mdFill>(RevisedFills);
                    }



                    BuildCandleFromRecentFills(NextCandleTime);

                    CandlesResolved = true;
                    Trace.WriteLine(string.Format("\r[{1}] CANDLES RESOLVED - LastCandleStart: {0}", LastStoredCandle, MarketDelta));
                }
                else
                {
                    //Trace.WriteLine("    !!!!ERR RESOLVE_CANDLES>>Current: {0} < LastFill: {1} :: [{2}]", last1mCandleCurrTime, firstFillTime, MarketDelta);
                    if (!retryOnFail)
                    {
                        return(false);
                    }

                    for (int s = 15; s > 0; s--)
                    {
                        Trace.Write(string.Format("\r    Resolving [{0}] TradeHist->Candles time gap. Retry in {1} seconds...", MarketDelta, s));
                        Thread.Sleep(1000);
                    }
                    Trace.Write("\r                                                                                  \r");
                }
            }

            return(true);
        }