public FinancialChartViewModel(Series masterSeries) { StockPrices stockPrices = StockData.GetStockPrices(); calculatedSeriesData = new CalculatedSeriesData(masterSeries); stockSeriesData = new StockSeriesData(stockPrices, DevExpress.XamarinForms.Charts.SeriesDataType.Financial); volumeSeriesData = new StockSeriesData(stockPrices, DevExpress.XamarinForms.Charts.SeriesDataType.DateTime); visualRange = new DateTimeRange() { VisualMin = new System.DateTime(2016, 7, 29), VisualMax = new System.DateTime(2016, 10, 15) }; }
/// <summary> /// цветовая схема, если null - берется из VisualSettings /// </summary> /*public Color? CustomColorFillUp { get; set; } * public Color? CustomColorFillDn { get; set; } * public Color? CustomColorFillEmpty { get; set; } * public Color? CustomColorOutlineUp { get; set; } * public Color? CustomColorOutlineDn { get; set; }*/ internal void CopyFrom(StockSeries stockSeries) { if (stockSeries == null) { return; } Owner = stockSeries.Owner; Name = stockSeries.Name; BackColor = stockSeries.BackColor; ForeColor = stockSeries.ForeColor; LineWidth = stockSeries.LineWidth; NumberDecimalDigits = stockSeries.NumberDecimalDigits; upFillColor = stockSeries.upFillColor; upLineColor = stockSeries.upLineColor; downFillColor = stockSeries.downFillColor; downLineColor = stockSeries.downLineColor; BarNeutralColor = stockSeries.BarNeutralColor; data = stockSeries.Data; }
/// <summary> /// Получить описывающий /// </summary> /// <param name="candles"></param> /// <param name="start"></param> /// <param name="end"></param> /// <returns></returns> private ChartEllipse BuildInclusiveEllipse(StockSeriesData candles, int start, int end) { if (start == end) { return(null); } float startvalue, endvalue; if (candles[start].high > candles[end].high) { startvalue = candles[start].high; endvalue = candles[end].low; } else { startvalue = candles[start].low; endvalue = candles[end].high; } var A = new PointD(start, Convert.ToDouble(startvalue)); var B = new PointD(end, Convert.ToDouble(endvalue)); var C = new PointD(); double angle; float cx, cy, a, b; var S = float.NaN; bool correctEllipse = false; // поиск охватывающего эллипса for (var i = start; i <= end; i++) { var d = new PointD(i, Convert.ToDouble(candles[i].high)); correctEllipse = Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), d.ToPointF(), out angle, out a, out b, out cx, out cy); if (float.IsNaN(S) || (correctEllipse && S < b)) { S = b; C = d; } d = new PointD(i, Convert.ToDouble(candles[i].low)); correctEllipse = Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), d.ToPointF(), out angle, out a, out b, out cx, out cy); if (float.IsNaN(S) || (correctEllipse && S < b)) { S = b; C = d; } } correctEllipse = // пересчитываем параметры эллипса Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), C.ToPointF(), out angle, out a, out b, out cx, out cy); if (correctEllipse) { // можно построить эллипс - рисуем его var newEllipse = new ChartEllipse { BuildTangent = true, angle = angle, a = a, b = b, cx = cx, cy = cy }; newEllipse.AddPoint((float)A.X, (float)A.Y); newEllipse.AddPoint((float)B.X, (float)B.Y); newEllipse.AddPoint((float)C.X, (float)C.Y); var minIndex = newEllipse.points.Min(p => p.X); newEllipse.DateStart = owner.StockSeries.GetCandleOpenTimeByIndex((int)minIndex); return(newEllipse); } return(null); }
// Methods protected StockSeries(string name) : base(name) { data = new StockSeriesData(); }