private async Task PreloadCandlesDict(int hour) { //Aggregate in mCandles Dict: DateTime startTime = DateTime.UtcNow.Subtract(TimeSpan.FromHours(hour)); foreach (Market market in BtrexData.Markets.Values) { var importer = new TradyCandleImporter(); var preCandles = await importer.ImportAsync(market.MarketDelta, startTime); mCandles.Add(market.MarketDelta, new List <Candle>(preCandles)); } }
private void WatchMarkets() { using (var cmd = new SQLiteCommand(conn)) { while (true) //!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Backspace)) { //WRITE/SAVE SQL DATA CHANGES: SaveSQLOrderData(cmd); SaveSQLData(cmd); //BEGIN CANDLES ASSESSMENTS: foreach (Market m in BtrexData.Markets.Values) { //CHECK FOR NEW CANDLES: if (m.TradeHistory.LastStoredCandle > StratData.Candles5m[m.MarketDelta].Last().DateTime) { //Get new 5m candles: var Importer = new TradyCandleImporter(); var newCandles = Importer.ImportAsync(m.MarketDelta, StratData.Candles5m[m.MarketDelta].Last().DateTime.AddMinutes(5)).Result; StratData.Candles5m[m.MarketDelta].AddRange(newCandles); CheckStrategy(StratData.Candles5m[m.MarketDelta].Skip(Math.Max(0, StratData.Candles5m[m.MarketDelta].Count - 42)).ToList(), m.MarketDelta, "period5m"); //Build new 20m candles + Check strategy for buy/sell signals: var CandleCurrentTime = m.TradeHistory.LastStoredCandle.AddMinutes(5); if (CandleCurrentTime > StratData.Candles20m[m.MarketDelta].Last().DateTime.AddMinutes(40)) { if (StratData.BuildNew20mCndls(m.MarketDelta)) { CheckStrategy(StratData.Candles20m[m.MarketDelta].Skip(Math.Max(0, StratData.Candles20m[m.MarketDelta].Count - 42)).ToList(), m.MarketDelta, "period20m"); } //Build new 1h candles + Check strategy for buy/sell signals: if (CandleCurrentTime > StratData.Candles1h[m.MarketDelta].Last().DateTime.AddHours(2)) { if (StratData.BuildNew1hCndls(m.MarketDelta)) { CheckStrategy(StratData.Candles1h[m.MarketDelta].Skip(Math.Max(0, StratData.Candles1h[m.MarketDelta].Count - 42)).ToList(), m.MarketDelta, "period1h"); } //Build new 4h candles + Check strategy for buy/sell signals: if (CandleCurrentTime > StratData.Candles4h[m.MarketDelta].Last().DateTime.AddHours(8) && StratData.BuildNew4hCndls(m.MarketDelta)) { CheckStrategy(StratData.Candles4h[m.MarketDelta].Skip(Math.Max(0, StratData.Candles4h[m.MarketDelta].Count - 42)).ToList(), m.MarketDelta, "period4h"); } //Build new 12h candles + Check strategy for buy/sell signals: if (CandleCurrentTime > StratData.Candles12h[m.MarketDelta].Last().DateTime.AddHours(24) && StratData.BuildNew12hCndls(m.MarketDelta)) { CheckStrategy(StratData.Candles12h[m.MarketDelta].Skip(Math.Max(0, StratData.Candles12h[m.MarketDelta].Count - 42)).ToList(), m.MarketDelta, "period12h"); } } } } } //EXECUTE ALL List<NewOrders>: if (NewOrders.Count > 0) { //PendingOrders.AddRange(NewOrders); var ords = new List <NewOrder>(NewOrders); NewOrders = new List <NewOrder>(); //This is not awaited because NewOrder objects reference their own callback BtrexREST.TradeController.ExecuteNewOrderList(ords, OPTIONS.VITRUAL_MODE); } Thread.Sleep(TimeSpan.FromSeconds(3)); } //CONTROL-LOOP ENDED: StopLossController.Stop(); } conn.Close(); isStarted = false; Trace.WriteLine("\r\n\r\n @@@ EMAofRSI1 Strategy STOPPED @@@\r\n\r\n"); }
public async Task PreloadCandleDicts(int numPeriods) { //Aggregate in Candles Dicts: DateTime startTime = DateTime.UtcNow.Subtract(TimeSpan.FromDays((numPeriods / 2D) + 0.5)); foreach (string marketDelta in BtrexData.Markets.Keys) { Trace.Write(string.Format("\rPRELOADING MULTI-PERIOD CANDLES: {0} ", marketDelta)); Candles12h.Add(marketDelta, new List <Candle>()); Candles4h.Add(marketDelta, new List <Candle>()); Candles1h.Add(marketDelta, new List <Candle>()); Candles20m.Add(marketDelta, new List <Candle>()); var importer = new TradyCandleImporter(); var preCandles = await importer.ImportAsync(marketDelta, startTime); //GET FIRST CANDLE TIME FOR 12h: var offsetSpan12h = new TimeSpan(); if (DateTime.UtcNow.Hour < 2) { offsetSpan12h = (DateTime.UtcNow - DateTime.UtcNow.Date) + TimeSpan.FromHours(10); } else if (DateTime.UtcNow.Hour < 14) { offsetSpan12h = DateTime.UtcNow - DateTime.UtcNow.Date.AddHours(2); } else if (DateTime.UtcNow.Hour >= 14) { offsetSpan12h = DateTime.UtcNow - DateTime.UtcNow.Date.AddHours(14); } var candleTime12h = (DateTime.UtcNow.Subtract(offsetSpan12h)) - TimeSpan.FromDays(Convert.ToDouble(numPeriods) / 2D); //GET FIRST CANDLE TIME FOR 4h: var candleTime4h = DateTime.UtcNow.Date .AddHours((int)(4M * Math.Floor(DateTime.UtcNow.Hour / 4M))) .Subtract(TimeSpan.FromHours(4 * numPeriods)); //GET FIRST CANDLE TIME FOR 1h var candleTime1h = DateTime.UtcNow.Date .AddHours(DateTime.UtcNow.Hour) .Subtract(TimeSpan.FromHours(numPeriods)); //GET FIRST CANDLE TIME FOR 20m var candleTime20m = DateTime.UtcNow.Date .AddHours(DateTime.UtcNow.Hour) .AddMinutes((int)(20M * Math.Floor(DateTime.UtcNow.Minute / 20M))) .Subtract(TimeSpan.FromMinutes(20 * numPeriods)); //GET FIRST CANDLE TIME FOR 5m var candleTime5m = DateTime.UtcNow.Date .AddHours(DateTime.UtcNow.Hour) .AddMinutes((int)(5M * Math.Floor(DateTime.UtcNow.Minute / 5M))) .Subtract(TimeSpan.FromMinutes(5 * numPeriods)); //FORM ALL CANDLES: for (int i = 0; i < numPeriods; i++) { //ADD NEXT 12h CANDLE: var nextCandleTime12h = candleTime12h.AddHours(12); var CandleRange12h = from Candles in preCandles where (Candles.DateTime >= candleTime12h) && (Candles.DateTime < nextCandleTime12h) orderby Candles.DateTime select Candles; if (CandleRange12h.Count() > 0) { Candles12h[marketDelta].Add(new Candle(candleTime12h, CandleRange12h.First().Open, CandleRange12h.Max(x => x.High), CandleRange12h.Min(x => x.Low), CandleRange12h.Last().Close, CandleRange12h.Sum(x => x.Volume) ) ); } candleTime12h = nextCandleTime12h; //ADD NEXT 4h CANDLE: var nextCandleTime4h = candleTime4h.AddHours(4); var CandleRange4h = from Candles in preCandles where (Candles.DateTime >= candleTime4h) && (Candles.DateTime < nextCandleTime4h) orderby Candles.DateTime select Candles; if (CandleRange4h.Count() > 0) { Candles4h[marketDelta].Add(new Candle(candleTime4h, CandleRange4h.First().Open, CandleRange4h.Max(x => x.High), CandleRange4h.Min(x => x.Low), CandleRange4h.Last().Close, CandleRange4h.Sum(x => x.Volume) ) ); } candleTime4h = nextCandleTime4h; //ADD NEXT 1h CANDLE: var nextCandleTime1h = candleTime1h.AddHours(1); var CandleRange1h = from Candles in preCandles where (Candles.DateTime >= candleTime1h) && (Candles.DateTime < nextCandleTime1h) orderby Candles.DateTime select Candles; if (CandleRange1h.Count() > 0) { Candles1h[marketDelta].Add(new Candle(candleTime1h, CandleRange1h.First().Open, CandleRange1h.Max(x => x.High), CandleRange1h.Min(x => x.Low), CandleRange1h.Last().Close, CandleRange1h.Sum(x => x.Volume) ) ); } candleTime1h = nextCandleTime1h; //ADD NEXT 20m CANDLE: var nextCandleTime20m = candleTime20m.AddMinutes(20); var CandleRange20m = from Candles in preCandles where (Candles.DateTime >= candleTime20m) && (Candles.DateTime < nextCandleTime20m) orderby Candles.DateTime select Candles; if (CandleRange20m.Count() > 0) { Candles20m[marketDelta].Add(new Candle(candleTime20m, CandleRange20m.First().Open, CandleRange20m.Max(x => x.High), CandleRange20m.Min(x => x.Low), CandleRange20m.Last().Close, CandleRange20m.Sum(x => x.Volume) ) ); } candleTime20m = nextCandleTime20m; } //FINALLY, ADD ALL 5m CANDLES Candles5m[marketDelta] = new List <Candle>( from Candles in preCandles where Candles.DateTime >= candleTime5m orderby Candles.DateTime select Candles); } Trace.Write("\rPRELOADING MULTI-PERIOD CANDLES: [COMPLETE]"); }
public async Task StartMarketsDemo() { Console.WindowHeight = Console.LargestWindowHeight; //Display All Data, switch between markets with spacebar: while (true) { foreach (Market m in BtrexData.Markets.Values) { IEnumerable <Candle> RecentCandles = mCandles[m.MarketDelta].Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)); //PRECALC EMAS HERE var closes = mCandles[m.MarketDelta].Select(x => x.Close); var EMA26 = closes.Ema(26).Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)).ToArray(); var EMA12 = closes.Ema(12).Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)).ToArray(); var EMA9 = closes.Ema(9).Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)).ToArray(); while (!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Spacebar)) { //Every iteration, check BtrexData.Market.LastCandleTime to check if add new mCandles: if (m.TradeHistory.LastStoredCandle > mCandles[m.MarketDelta].Last().DateTime) { var Importer = new TradyCandleImporter(); foreach (var c in mCandles) { var newCandles = await Importer.ImportAsync(c.Key, mCandles[m.MarketDelta].Last().DateTime.AddMinutes(5)); c.Value.AddRange(newCandles); } RecentCandles = mCandles[m.MarketDelta].Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)); closes = mCandles[m.MarketDelta].Select(x => x.Close); EMA26 = closes.Ema(26).Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)).ToArray(); EMA12 = closes.Ema(12).Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)).ToArray(); EMA9 = closes.Ema(9).Skip(Math.Max(0, mCandles[m.MarketDelta].Count - showPastPeriods)).ToArray(); } //Assign Orderbook before Console.Clear() List <KeyValuePair <decimal, decimal> > bidsTop10 = m.OrderBook.Bids.ToArray().OrderByDescending(k => k.Key).Take(10).ToList(); List <KeyValuePair <decimal, decimal> > asksTop10 = m.OrderBook.Asks.ToArray().OrderBy(k => k.Key).Take(10).ToList(); Console.Clear(); //Print MarketTitle Console.Write("\r\n------------------------------------------------------"); Console.ForegroundColor = ConsoleColor.White; Console.Write("[{0}]", m.MarketDelta); Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine("--------------------------------------------------------\r\n" + "======================================================================================================================="); //Print Candles: Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("\r\n#CANDLES:"); Console.ForegroundColor = ConsoleColor.DarkCyan; int index = 0; foreach (Candle c in RecentCandles) { Console.WriteLine(" T:{0}...O:{1:0.00000000}...H:{2:0.00000000}...L:{3:0.00000000}...C:{4:0.00000000}...V:{5:0.00000000}", c.DateTime, c.Open, c.High, c.Low, c.Close, c.Volume); Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine(" EMA(26)={0:0.00000000}, EMA(12)={1:0.00000000}, EMA(9)={2:0.00000000}", EMA26[index], EMA12[index], EMA9[index]); Console.ForegroundColor = ConsoleColor.DarkCyan; index++; } //Print Bids/Asks: Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("\r\n #BIDS(Top10) #ASKS(Top10)"); Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine(" ---------------------------------------- ----------------------------------------"); for (int i = 0; i < 10; i++) { Console.WriteLine(" {0,25:0.00000000} | {1:0.00000000} {2:0.00000000} | {3:0.00000000} ", bidsTop10[i].Value, bidsTop10[i].Key, asksTop10[i].Key, asksTop10[i].Value); } //Print Recent Fills: Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("\r\n#RECENT FILLS(Last20):"); Console.ForegroundColor = ConsoleColor.DarkCyan; foreach (mdFill fill in m.TradeHistory.RecentFills.ToArray().OrderByDescending(x => x.TimeStamp).Take(20)) { Console.WriteLine("{0,8} :: {1}.....Rate={2:0.00000000}, Qty={3:0.########}", fill.OrderType, fill.TimeStamp, fill.Rate, fill.Quantity); } //Print [active market] ribbon: Console.Write("\r\nMarkets currently being tracked:\r\n "); int n = 1; foreach (string mk in mCandles.Keys) { if (mk == m.MarketDelta) { Console.ForegroundColor = ConsoleColor.Green; } else { Console.ForegroundColor = ConsoleColor.White; } Console.Write(" [{0}]", mk); if (mk != mCandles.Keys.Last()) { Console.Write(","); } else { break; } if (n % 10 == 0) { Console.Write("\r\n "); } n++; } Console.ForegroundColor = ConsoleColor.DarkCyan; Console.Write("\r\n\r\n -"); Console.ForegroundColor = ConsoleColor.White; Console.Write("Press SPACEBAR for Next Market"); Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine("-"); Thread.Sleep(1000); } } } }