/// <summary> /// Прорисовка кнопки на элементе "Graphics" контрола "QuoteTradeControl" /// </summary> /// <param name="graphics">Объект, на котором будт осущесвлятся прорисовка</param> public void Draw(Graphics graphics) { scaleMatrix = new Matrix(); scaleMatrix.Scale(ScaleX, ScaleY); Shape = QuotePartButtonFigure.instanceFigure.Clone() as GraphicsPath; Shape.Transform(translateMatrix); Shape.Transform(scaleMatrix); graphics.FillPath(currentBrush, Shape); graphics.DrawPath(pensStor.GetPen(Color.FromArgb(255, 64, 66, 64)), Shape); if (buySellIndicator != null) { if (Value != null) { // Запоминаем значение для вычсления направления стрелки тренда if (buySellIndicator.Volume == Value) { trandDeltaValues.Add(0); } else { trandDeltaValues.Add(buySellIndicator.Volume > Value ? -1 : 1); } buySellIndicator.Volume = Value; } buySellIndicator.ScaleX = ScaleX; buySellIndicator.ScaleY = ScaleY; buySellIndicator.Draw(graphics, brushesStor); } if (arrowTrend != null) { arrowTrend.Sx = ScaleX; arrowTrend.Sy = ScaleY; arrowTrend.DirectionAngle = trandDeltaValues.GetItemByIndex(0, true) * 1 + trandDeltaValues.GetItemByIndex(1, true) * 2 + trandDeltaValues.GetItemByIndex(2, true) * 4; arrowTrend.Draw(graphics); } }
/// <summary> /// подготовить словарь Имя-Значение для /// </summary> private Dictionary <string, double> GetVariableValues() { var varValues = new Dictionary <string, double>(); if (formulaVariableNames == null) { return(new Dictionary <string, double>()); } // специальные имена переменных: // open, low, high, close - текущие OHLC-уровни для свечной серии // для серий типа LineSeries доступен только close // close#2 - цена два бара назад // i - индекс текущей свечи // count - количество данных в основном ряду // year, month, day, weekday, hour, minute, second // eurusd, audjpy#100 - close соотв. валютной пары // random - равномерно распред. СЧ на интервале 0..1 // переменные с неизвестными именами инициализируются нулями foreach (var name in formulaVariableNames) { var variableName = name; if (name == "i") { varValues.Add(name, countCandles); continue; } if (name == "count") { varValues.Add(name, countCandles); continue; } var tickerName = tickerNames.FirstOrDefault(tn => variableName.StartsWith(tn, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(tickerName)) {// котировка var price = 0.0; if (lastBidLists.ContainsKey(tickerName)) { var tickerQueue = lastBidLists[tickerName]; var datIndex = GetDeltaIndexFromSharpSeparatedString(variableName); price = datIndex >= tickerQueue.Length ? 0 : tickerQueue.GetItemByIndex(datIndex, false); } varValues.Add(name, price); continue; } if (name == "random") { varValues.Add(name, randomGener.NextDouble()); continue; } if (name == "year" || name == "month" || name == "day" || name == "weekday" || name == "hour" || name == "minute" || name == "second") { // получить дату текущей точки графика if (name == "year") { varValues.Add(name, curTime.Year); } else if (name == "month") { varValues.Add(name, curTime.Month); } else if (name == "day") { varValues.Add(name, curTime.Day); } else if (name == "weekday") { varValues.Add(name, (int)curTime.DayOfWeek); } else if (name == "hour") { varValues.Add(name, curTime.Hour); } else if (name == "minute") { varValues.Add(name, curTime.Minute); } else if (name == "second") { varValues.Add(name, curTime.Second); } continue; } if (name.StartsWith("close") || name.StartsWith("open") || name.StartsWith("low") || name.StartsWith("high")) {// "close", "close#17" ... var datIndex = GetDeltaIndexFromSharpSeparatedString(name); if (datIndex >= candles.Length) { varValues.Add(name, 0); continue; } var candle = candles.GetItemByIndex(datIndex, false); if (name.StartsWith("open")) { varValues.Add(name, (double)candle.open); } else if (name.StartsWith("high")) { varValues.Add(name, (double)candle.high); } else if (name.StartsWith("low")) { varValues.Add(name, (double)candle.low); } else if (name.StartsWith("close")) { varValues.Add(name, (double)candle.close); } continue; } // переменная не определена вообще - инициализируем 0-м varValues.Add(name, 0); } return(varValues); }