Exemplo n.º 1
0
        /// <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);
        }