Пример #1
0
        private void LoadCandleSticksPerTicker(DateTime from, DateTime dt)
        {
            //kdb c = new kdb("localhost", 5000);
            var candlesticks = new Dictionary <string, List <Candlestick> >();

            foreach (var ticker in _request.TradingPairs)
            {
                candlesticks.Add(ticker, BinanceClient.GetCandleSticks(ticker, _request.Interval, from, dt).Result.ToList());
            }
            int count = candlesticks.First().Value.Count();

            for (int i = 0; i < count; i++)
            {
                var CandleSticksByTime = new Dictionary <string, Candlestick>();
                foreach (var kvp in candlesticks)
                {
                    if (kvp.Value.Count == 0)
                    {
                        continue;
                    }
                    CandleSticksByTime.Add(kvp.Key, kvp.Value[i]);

                    //Prices - Opentime,open,high,low,close,volume,closetime
                    //time format "Z"$ "2007-08-09T07:08:09.101"
                    //c.k($"insert[`Prices](`{kvp.Key};\"Z\"$ \"{kvp.Value[i].OpenDateTime.ToString("yyyy-MM-ddTHH:mm:ss:fffff")}\"; {kvp.Value[i].Open}; {kvp.Value[i].High}; {kvp.Value[i].Low}; {kvp.Value[i].Close}; {kvp.Value[i].Volume}; \"Z\"$ \"{kvp.Value[i].CloseDateTime.ToString("yyyy-MM-ddTHH:mm:ss:fffff")}\")");
                }
                CandleSticks.Enqueue(CandleSticksByTime);
            }
        }
Пример #2
0
        private DateTime LoadNextCandleSticks()
        {
            var candlesticks = new Dictionary <string, List <Candlestick> >();

            foreach (var ticker in _request.TradingPairs)
            {
                candlesticks.Add(ticker, BinanceClient.GetCandleSticks(ticker, _request.Interval, null, null, 1).Result.ToList());
            }
            int count      = candlesticks.First().Value.Count();
            var lastCandle = candlesticks.First().Value[0].CloseDateTime;

            for (int i = 0; i < count; i++)
            {
                var CandleSticksByTime = new Dictionary <string, Candlestick>();
                foreach (var kvp in candlesticks)
                {
                    CandleSticksByTime.Add(kvp.Key, kvp.Value[i]);
                }
                CandleSticks.Enqueue(CandleSticksByTime);
            }

            return(lastCandle);
        }
Пример #3
0
        private void AddKlines(KlineInterval interval, List <BinanceKline> klineValues)
        {
            System.Windows.Application.Current.Dispatcher.Invoke(() =>
            {
                var indexesToReplace = new Dictionary <int, int>(); // index in new klineValues, index in Klines
                var indexesToAppend  = new List <int>();            //index in new klineValues

                bool klinesChanged = false;
                for (int kvi = 0; kvi < klineValues.Count(); kvi++)
                {
                    var kline = klineValues[kvi];

                    //don't add duplicates
                    var dup = klinesDictionary[KlineInterval].Where(k => k.OpenTime == kline.OpenTime).SingleOrDefault();
                    if (dup == null)
                    {
                        indexesToAppend.Add(kvi);
                        klinesDictionary[interval].Add(kline);
                    }
                    else
                    {
                        var dupIndex = klinesDictionary[KlineInterval].IndexOf(dup);
                        indexesToReplace.Add(kvi, dupIndex);
                        klinesDictionary[interval][dupIndex] = kline;
                    }

                    if (!klinesChanged && interval == klineInterval)
                    {
                        klinesChanged = true;
                    }
                }

                if (klinesChanged)
                {
                    RaisePropertyChangedEvent("Klines");
                }

                if (CandleSticks == null)
                {
                    CandleSticks = new SeriesCollection {
                        new CandleSeries {
                            Title = "Candles", Values = new ChartValues <OhlcPoint>(klinesDictionary[interval].Select(kline => kline.ToOhlcPoint()))
                        }
                    };
                    ChartDateLabels = klineValues.Select(kline => kline.OpenTime.UTCToLocal().ToString("MMM d")).ToArray();
                    ChartHourLabels = klineValues.Select(kline => kline.OpenTime.UTCToLocal().ToString("h:00")).ToArray();
                }
                else
                {
                    var series = CandleSticks.Where(cs => cs.Title == "Candles").FirstOrDefault();
                    // Update the existing klines
                    foreach (var itr in indexesToReplace)
                    {
                        // Update the existing OHLC point with dup info for animations to work
                        //series.Values[itr.Value] = klineValues[itr.Key].ToOhlcPoint();
                        ((OhlcPoint)series.Values[itr.Value]).UpdateValues(klineValues[itr.Key]);
                    }

                    // Append the new ones
                    foreach (var ita in indexesToAppend)
                    {
                        series.Values.Add(klineValues[ita].ToOhlcPoint());
                    }
                }

                double[] outMACD       = null;
                double[] outMACDSignal = null;

                double[] outMACDHist       = null;
                double[] outMACDHistGrowth = null;
                double[] outMACDHistLoss   = null;

                double[] outRSI = null;

                var tasks = new Task[]
                {
                    new Task(() => { CalculateMACD(false, out outMACD, out outMACDSignal, out outMACDHist); outMACDHist.SplitAndPad(0d, out outMACDHistGrowth, out outMACDHistLoss); }),
                    new Task(() => { CalculateRSI(out outRSI); }),
                };
                foreach (var task in tasks)
                {
                    task.Start();
                }
                Task.WaitAll(tasks);

                //CalculateMACD(false, out double[] outMACD, out double[] outMACDSignal, out double[] outMACDHist);
                //CalculateRSI(out double[] outRSI);
                //outMACDHist.SplitAndPad(0d, out double[] outMACDHistGrowth, out double[] outMACDHistLoss);

                if (MACDPlot == null)
                {
                    MACDPlot = new SeriesCollection
                    {
                        new LineSeries {
                            PointGeometry = null, Fill = Brushes.Transparent, Title = "MACD", Values = new ChartValues <double>(outMACD)
                        },
                        new LineSeries {
                            PointGeometry = null, Fill = Brushes.Transparent, Title = "MACD Signal", Values = new ChartValues <double>(outMACDSignal)
                        },
                        new LineSeries {
                            PointGeometry = null, Stroke = Brushes.Green, AreaLimit = 0, Title = "MACD Growth Trend", Values = new ChartValues <double>(outMACDHistGrowth)
                        },
                        new LineSeries {
                            PointGeometry = null, Stroke = Brushes.Gray, AreaLimit = 0, Title = "MACD Loss Trend", Values = new ChartValues <double>(outMACDHistLoss)
                        },
                    };
                }
                else
                {
                    var macdSeries = MACDPlot.Where(cs => cs.Title == "MACD").FirstOrDefault();
                    foreach (var itr in indexesToReplace)
                    {
                        macdSeries.Values[itr.Key] = outMACD[itr.Key];
                    }
                    foreach (var ita in indexesToAppend)
                    {
                        macdSeries.Values.Add(outMACD[ita]);
                    }

                    var macdSignalSeries = MACDPlot.Where(cs => cs.Title == "MACD Signal").FirstOrDefault();
                    foreach (var itr in indexesToReplace)
                    {
                        macdSignalSeries.Values[itr.Key] = outMACDSignal[itr.Key];
                    }
                    foreach (var ita in indexesToAppend)
                    {
                        macdSignalSeries.Values.Add(outMACDSignal[ita]);
                    }

                    var macdGrowthTrendSeries = MACDPlot.Where(cs => cs.Title == "MACD Growth Trend").FirstOrDefault();
                    foreach (var itr in indexesToReplace)
                    {
                        macdGrowthTrendSeries.Values[itr.Key] = outMACDHistGrowth[itr.Key];
                    }
                    foreach (var ita in indexesToAppend)
                    {
                        macdGrowthTrendSeries.Values.Add(outMACDHistGrowth[ita]);
                    }

                    var macdLossTrendSeries = MACDPlot.Where(cs => cs.Title == "MACD Loss Trend").FirstOrDefault();
                    foreach (var itr in indexesToReplace)
                    {
                        macdLossTrendSeries.Values[itr.Key] = outMACDHistLoss[itr.Key];
                    }
                    foreach (var ita in indexesToAppend)
                    {
                        macdLossTrendSeries.Values.Add(outMACDHistLoss[ita]);
                    }
                }

                if (RSIPlot == null)
                {
                    RSIPlot = new SeriesCollection
                    {
                        new LineSeries {
                            PointGeometry = null, Fill = Brushes.Transparent, Title = "RSI", Values = new ChartValues <double>(outRSI)
                        },
                    };
                }
                else
                {
                    var rsiSeries = RSIPlot.Where(cs => cs.Title == "RSI").FirstOrDefault();
                    foreach (var itr in indexesToReplace)
                    {
                        rsiSeries.Values[itr.Key] = outRSI[itr.Key];
                    }
                    foreach (var ita in indexesToAppend)
                    {
                        rsiSeries.Values.Add(outRSI[ita]);
                    }
                }

                ChartTotalSteps   = Klines.Count;
                ChartVisibleSteps = Klines.Count;

                // Get recommondations
                #region MACD Status

                //for (int macdi = outMACDHist.Length - 1; macdi >= 0; macdi--)
                //{
                //    //TODO: Generate Trends for recommondations
                //}
                MACDStatus = outMACDHist?.Length > 0 ? (outMACDHist.LastOrDefault() >= 0) ? "Growing" : "Losing" : "";

                #endregion
                #region RSI Status
                var rsiPos = outRSI.LastOrDefault();
                RSIStatus  = rsiPos > 30 ? rsiPos >= 70 ? "Over-Bought" : "Typical" : "Over-Sold";
                #endregion
            });
        }