예제 #1
0
        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));
            }
        }
예제 #2
0
        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");
        }
예제 #3
0
        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]");
        }
예제 #4
0
        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);
                    }
                }
            }
        }