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); } }
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); }
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 }); }