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] "); }
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(); }
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); } }
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); }