/// <summary> /// Рисует блок состоящий из нескольких свечей /// </summary> /// <param name="prepHorV"></param> /// <param name="max"></param> /// <param name="countInBlock"></param> private void PaintOneBlock(PrepareHorVol prepHorV, Chart max, int countInBlock) { var canvas = Panel.GetGraphics; var canvasOnlyVol = PanelVolume.GetGraphics; if (prepHorV.RectBlock.Width >= MIN_WIDTH_FOR_LAYBORDER) { //рисует прямоугольник выделяющий период var rectVol = new RectDraw(); rectVol.ColorFill = ColorLayVol; rectVol.ColorBorder = ColorLayBorder; rectVol.Paint(canvas, prepHorV.RectBlock.X, prepHorV.RectBlock.Y, prepHorV.RectBlock.Width, prepHorV.RectBlock.Height); var textMax = new TextDraw(); textMax.Color = Color.Black; var text = "max:" + prepHorV.MaxVol.ToString(); var size = textMax.GetSizeText(canvas, text); textMax.Paint(canvas, text, prepHorV.RectBlock.X, prepHorV.RectBlock.Y - size.Height); } prepHorV.HorVolumes.ToArray().ForEach <ChartFull>((hv) => { this.PaintLineHVol(canvas, prepHorV.RectBlock, max, new Chart(), hv); if (PaintOnlyFirstBlock) { this.PaintLineHVol(canvasOnlyVol, PanelVolume.Rect.Rectangle, max, new Chart(), hv, Color.Blue); } }); }
/// <summary> /// Получает информацию по объемам текущей свечки /// </summary> /// <param name="crossLine"></param> /// <param name="activeCandle"></param> /*public void GetValueVolume(Point crossLine, GCandles.CandleInfo activeCandle) * { * decimal priceY = GMath.GetValueFromCoordinate(Panel.Rect.Height, Panel.Params.MaxPrice, Panel.Params.MinPrice, crossLine.Y, Panel.Params.CountFloat); * Curr * var hv = activeCandle.Candle.GetHorVolumes().HVolCollection.ToArray().FirstOrDefault(v => v.Price == priceY); * if (hv.NotIsNull()) * { * if (priceY == hv.Price) * { * if (hv.Price == priceY) activeCandle.Description = (hv.VolBuy + hv.VolSell).ToString(); * activeCandle.CurHorVolume = new ChartFull() { Price = priceY, VolBuy = hv.VolBuy, VolSell = hv.VolSell }; * } * } * }*/ /// <summary> /// Обработчик каждой свечки /// </summary> /// <param name="dataCandle"></param> public void EachCandle(CandleInfo dataCandle) { if (dataCandle.Index == 0) { PrepDataHorVol = new PrepareHorVol(); PrepDataHorVol.HorVolumes = new HVolume(); if (activeCandle2.IsNull()) { activeCandle2 = new SelectCandle(); activeCandle2.dataCandle = dataCandle; } } if (activeCandle1.NotIsNull() && activeCandle2.NotIsNull() && CurrTimeFrame.NotIsNull()) { if (dataCandle.Index <= activeCandle1.dataCandle.Index && dataCandle.Index >= activeCandle2.dataCandle.Index) { var hVol = CurrTimeFrame.HVolumes.GetCandle(dataCandle.Candle.Time); if (hVol.NotIsNull()) { foreach (var curVol in hVol.ToArray()) { if (curVol.Price < Panel.Params.MaxPrice && curVol.Price > Panel.Params.MinPrice) { PrepDataHorVol.HorVolumes.Add(curVol.Price, curVol.VolBuy, curVol.VolSell); } } } } } }
/// <summary> /// Рисование обьема по каждой свечке /// </summary> /// <param name="countInBlock"></param> public void PaintHorVolEachBlock(int countInBlock = 1, bool isCollection = false) { lock (_lockPaint) { Panel.Clear(); PanelVolume.Clear(); if (countInBlock <= 0) { return; } List <PrepareHorVol> preDataHVol = new List <PrepareHorVol>(); var CurrentHVol = new PrepareHorVol(); CurrentHVol.HorVolumes = new HVolume(); preDataHVol.Add(CurrentHVol); var list = this.CollectionCandles.ToArray(); var maxAll = new Chart(); if (list.NotIsNull() && list.Count() > 0) { int indexer = 0; int steper = countInBlock; if (isCollection) { if (CollectionCandleInBlocks.Count > 0) { steper = CollectionCandleInBlocks.ElementAt(indexer) + 1; } else { return; } } /* foreach (var can in list) * { * if (can.NotIsNull()) * { * foreach (var curVol in can.Candle.GetHorVolumes().HVolCollection.ToArray()) * { * CurrentHVol.HorVolumes.AddVolume(curVol.Price, curVol.VolBuy, true); * CurrentHVol.HorVolumes.AddVolume(curVol.Price, curVol.VolSell, false); * CurrentHVol.SumBuyVol += curVol.VolBuy; * CurrentHVol.SumSellVol += curVol.VolSell; * } * * CurrentHVol.RectBlock.X = CurrentHVol.RectBlock.X > can.Body.X || CurrentHVol.RectBlock.X == 0 * ? can.Body.X : CurrentHVol.RectBlock.X; * CurrentHVol.RectBlock.Y = CurrentHVol.RectBlock.Y > can.TailCoord.High.Y || CurrentHVol.RectBlock.Y == 0 * ? can.TailCoord.High.Y : CurrentHVol.RectBlock.Y; * CurrentHVol.RectBlock.Width = CurrentHVol.RectBlock.Width < (can.Body.X + can.Body.Width) || CurrentHVol.RectBlock.Width == 0 * ? (can.Body.X + can.Body.Width) : CurrentHVol.RectBlock.Width; * CurrentHVol.RectBlock.Height = CurrentHVol.RectBlock.Height < can.TailCoord.Low.Y || CurrentHVol.RectBlock.Height == 0 * ? can.TailCoord.Low.Y : CurrentHVol.RectBlock.Height; * } * steper--; * if (steper <= 0) * { * CurrentHVol.MaxElem = CurrentHVol.HorVolumes.MaxVolume; * CurrentHVol.MinElem = CurrentHVol.HorVolumes.MinVolume; * * if (maxAll.Volume < CurrentHVol.MaxVol) * { * maxAll = CurrentHVol.MaxElem; * } * CurrentHVol.LastCandle = can; * * indexer++; * steper = countInBlock; * if (isCollection) * { * if (indexer >= CollectionCandleInBlocks.Count) * { * break; * } * steper = CollectionCandleInBlocks.ElementAt(indexer) - CollectionCandleInBlocks.ElementAt(indexer - 1); * } * CurrentHVol = new PrepareHorVol(); * CurrentHVol.HorVolumes = new HVolume(); * preDataHVol.Add(CurrentHVol); * } * }*/ } PaintOnlyFirstBlock = true; foreach (var elVol in preDataHVol) { RectangleF rectPaint = new RectangleF(); rectPaint.X = elVol.RectBlock.X; rectPaint.Y = elVol.RectBlock.Y; rectPaint.Width = elVol.RectBlock.Width - elVol.RectBlock.X; rectPaint.Height = elVol.RectBlock.Height - elVol.RectBlock.Y; elVol.RectBlock = rectPaint; this.PaintOneBlock(elVol, maxAll, countInBlock); PaintOnlyFirstBlock = false; } } }