コード例 #1
0
 public void EnsureUniqueName(IChartIndicator indi)
 {
     if (indicators.Count(i => i.UniqueName == indi.UniqueName) > 1)
     {
         MakeNewIndiName(indi);
     }
 }
コード例 #2
0
        private void MakeNewIndiName(IChartIndicator indi)
        {
            // если суфикс уже добавлен - выделить его
            decimal?indiSuffix  = null;
            var     matches     = regxIndiNameSuffix.Matches(indi.UniqueName);
            var     suffixStart = -1;

            if (matches.Count > 0)
            {
                indiSuffix  = matches[matches.Count - 1].Value.ToInt();
                suffixStart = matches[matches.Count - 1].Index;
            }

            var newSuffix = (indiSuffix ?? 1) + 1;
            var nameRoot  = suffixStart < 0 ? indi.UniqueName
                : indi.UniqueName.Substring(suffixStart - 1);
            string newName;

            while (true)
            {
                newName = string.Format("{0}({1})", nameRoot, newSuffix++);
                var testedName = newName;
                if (!indicators.Any(ind => ind.UniqueName == testedName))
                {
                    break;
                }
            }
            indi.UniqueName = newName;
        }
コード例 #3
0
 private bool CopmareIndicators(IChartIndicator indi1, IChartIndicator indi2)
 {
     if (indi1 == null || indi2 == null)
         return false;
     if (indi1.GetType() != indi2.GetType())
         return false;
     var equal = true;
     foreach (var property in indi1.GetType().GetProperties())
     {
         if (!property.GetCustomAttributes(true).Any(a => a is DisplayNameAttribute))
             continue;
         if (!property.PropertyType.IsValueType)
             continue;
         if (property.PropertyType == typeof (Color))
         {
             var c1 = (Color) property.GetValue(indi1);
             var c2 = (Color) property.GetValue(indi2);
             if (c1.ToArgb() != c2.ToArgb())
             {
                 equal = false;
                 break;
             }
         }
         else if (!property.GetValue(indi1).Equals(property.GetValue(indi2)))
         {
             equal = false;
             break;
         }
     }
        return equal;
 }
コード例 #4
0
        public void AddIndicator(string name, IChartIndicator <IPlotType> indicator)
        {
            var indicatorPlot = new IndicatorPlot(indicator);

            foreach (var candle in store.ToArray())
            {
                indicatorPlot.AddCandle(candle);
            }
            indicators.Add(name, indicatorPlot);
            updateSnapshot();
        }
コード例 #5
0
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            es = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (es == null) return null;

            indi = (IChartIndicator)context.Instance;

            LoadListBoxItems();
            es.DropDownControl(cbx);
            return value;
        }
コード例 #6
0
        private void EnsureIndicatorPanel(IChartIndicator indi)
        {
            if (indi.DrawPane != null)
            {
                return;
            }
            if (indi.CreateOwnPanel)
            {
                return;
            }

            var indiPaneCode = string.IsNullOrEmpty(indi.DrawPaneDisplay)
                                   ? Localizer.GetString("TitleCourse") : indi.DrawPaneDisplay;

            if (indi.CreateOwnPanel)
            {
                indi.DrawPaneDisplay = string.Empty;
            }
            if (string.IsNullOrEmpty(indi.DrawPaneDisplay) && indi.CreateOwnPanel == false)
            {
                indi.DrawPaneDisplay = Localizer.GetString("TitleCourse");
            }

            // если привязка к окну котировки...
            if (indiPaneCode == Localizer.GetString("TitleCourse"))
            {
                indi.DrawPane = chart.StockPane;
            }
            else
            {
                foreach (var ind in indicators)
                {
                    if (indiPaneCode != ind.GetFullyQualifiedPaneName())
                    {
                        continue;
                    }
                    if (ind.DrawPane == null)
                    {// индикатор строится в окне индикатора, который сам строится в чужом
                        // окне, и оно для него (ind) еще не установлено - требуется рекурсия
                        EnsureIndicatorPanel(ind);
                    }
                    // теперь ind.DrawPane точно не null
                    indi.DrawPane = ind.DrawPane;
                }
            }
            // положить серии на панель
            if (indi.DrawPane != null)
            {
                foreach (var series in indi.SeriesResult)
                {
                    indi.DrawPane.Series.Add(series);
                }
            }
        }
コード例 #7
0
        private static void LoadIndicatorProperties(IChartIndicator indi, XmlElement node)
        {
            foreach (var prop in indi.GetType().GetProperties())
            {
                var attrs = prop.GetCustomAttributes(typeof(DisplayNameAttribute), true);
                var attr  = (DisplayNameAttribute)attrs.FirstOrDefault(a => a is DisplayNameAttribute);
                if (attr == null)
                {
                    continue;
                }

                object val;

                // свойство само умеет себя десериализовать?
                attrs = prop.GetCustomAttributes(typeof(CustomXmlSerializationAttribute), true);
                if (attrs.Length > 0)
                {
                    var atrSerializer = (CustomXmlSerializationAttribute)attrs[0];
                    val = atrSerializer.DeserializeProperty(node);
                    prop.SetValue(indi, val, new object[0]);
                    continue;
                }

                // получить атрибут узла
                var xmlAttr = node.Attributes[prop.Name];
                if (xmlAttr == null)
                {
                    continue;
                }

                // получить значение из строки
                if (prop.PropertyType.IsSubclassOf(typeof(Enum)))
                {
                    val = Enum.Parse(prop.PropertyType, xmlAttr.Value);
                }
                else
                {
                    //if (prop.Name == "ClLine") continue;
                    if (prop.PropertyType == typeof(Color))
                    {
                        val = Color.FromArgb(int.Parse(xmlAttr.Value));
                    }
                    else
                    {
                        val = Converter.GetObjectFromString(xmlAttr.Value, prop.PropertyType);
                    }
                }
                prop.SetValue(indi, val, new object[0]);
            }
        }
コード例 #8
0
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            es = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (es == null)
            {
                return(null);
            }

            indi = (IChartIndicator)context.Instance;

            LoadListBoxItems();
            es.DropDownControl(cbx);
            return(value);
        }
コード例 #9
0
        public void RemoveIndicator(IChartIndicator indi)
        {
            if (indi.CreateOwnPanel)
            {
                foreach (var ind in indicators)
                {
                    if (ind == indi)
                    {
                        continue;
                    }
                    if (ind.DrawPane == indi.DrawPane)
                    {// перенести все серии на панель по-умолчанию - курс
                        foreach (var series in ind.SeriesResult)
                        {
                            ind.DrawPane.Series.Remove(series);
                            chart.StockPane.Series.Add(series);
                        }
                        ind.DrawPane        = chart.StockPane;
                        ind.DrawPaneDisplay = Localizer.GetString("TitleCourse");
                    }
                }
                // убрать саму панель
                if (chart.Panes.ContainsPane(indi.DrawPane))
                {
                    chart.Panes.Remove(indi.DrawPane);
                }
            }
            // убрать серии индикатора с панели
            if (indi.DrawPane != null)
            {
                foreach (var sr in indi.SeriesResult)
                {
                    if (indi.DrawPane.Series.ContainsSeries(sr))
                    {
                        indi.DrawPane.Series.Remove(sr);
                    }
                }
            }

            indi.Remove();

            // убрать сам индикатор
            indicators.Remove(indi);
        }
コード例 #10
0
        private void CreateIndicatorPane(IChartIndicator indi)
        {
            // назначить индикатору панель
            if (!indi.CreateOwnPanel || ((BaseChartIndicator)indi).ownPane != null)
            {
                return;
            }

            var newPane = new Pane(indi.Name, chart);

            ((BaseChartIndicator)indi).ownPane = newPane;

            indi.DrawPane = newPane;
            foreach (var series in indi.SeriesResult)
            {
                newPane.Series.Add(series);
            }
            chart.Panes.Add(newPane);
        }
コード例 #11
0
        private void UpdateSourceSeries(IChartIndicator indi)
        {
            indi.SeriesSources = new List <Series.Series>();
            var seriesSrcString = string.IsNullOrEmpty(indi.SeriesSourcesDisplay)
                                          ? Localizer.GetString("TitleCourse") : indi.SeriesSourcesDisplay;
            // текстовое представление серий заполнено, значит считали из файла настроек и надо найти
            // серию источник из списка индикаторов
            // проводим разбор серий
            var strSeries = seriesSrcString.Split(Separators.SourcesDelimiter, StringSplitOptions.None);

            // strSeries содержит набор <имя индикатора>.<имя серии источника>
            foreach (var series in strSeries)
            {
                if (series == Localizer.GetString("TitleCourse"))
                {
                    indi.SeriesSources.Add(chart.StockSeries);
                }
                else
                {
                    // есть имя индикатора и серия, надо найти в списке
                    var indiSeries = series.Split(Separators.IndiNameDelimiter, StringSplitOptions.None);
                    if (indiSeries.Count() != 2)
                    {
                        continue;
                    }

                    foreach (var indicator in indicators)
                    {
                        if (indicator.UniqueName != indiSeries[0])
                        {
                            continue;
                        }
                        // нашли индикатор, ищем серию
                        foreach (var s in indicator.SeriesResult.Where(s => s.Name == indiSeries[1]))
                        {
                            indi.SeriesSources.Add(s);
                        }
                    }
                }
            }
        }
コード例 #12
0
        private void AddNewIndicator(IChartIndicator indi)
        {
            indicators.Add(indi);
            indi.Add(chart, null);
            UpdateIndicatorPanesAndSeries();
            EnsureUniqueName(indi);
            indi.AcceptSettings();

            // индикатор требует обновления валютного кэша?
            if (indi is IHistoryQueryIndicator)
            {
                UpdateCacheForIndicator((IHistoryQueryIndicator)indi);
            }
            // индиактор может затребовать другие графики?
            if (indi is IChartQueryIndicator)
            {
                ((IChartQueryIndicator)indi).GetOuterCharts += getOuterCharts;
            }
            indi.BuildSeries(chart);
            ActivateIndiAddEvent((BaseChartIndicator)indi);
        }
コード例 #13
0
        private bool CopmareIndicators(IChartIndicator indi1, IChartIndicator indi2)
        {
            if (indi1 == null || indi2 == null)
            {
                return(false);
            }
            if (indi1.GetType() != indi2.GetType())
            {
                return(false);
            }
            var equal = true;

            foreach (var property in indi1.GetType().GetProperties())
            {
                if (!property.GetCustomAttributes(true).Any(a => a is DisplayNameAttribute))
                {
                    continue;
                }
                if (!property.PropertyType.IsValueType)
                {
                    continue;
                }
                if (property.PropertyType == typeof(Color))
                {
                    var c1 = (Color)property.GetValue(indi1);
                    var c2 = (Color)property.GetValue(indi2);
                    if (c1.ToArgb() != c2.ToArgb())
                    {
                        equal = false;
                        break;
                    }
                }
                else if (!property.GetValue(indi1).Equals(property.GetValue(indi2)))
                {
                    equal = false;
                    break;
                }
            }
            return(equal);
        }
コード例 #14
0
        public static void MakeIndicatorXMLNode(IChartIndicator indi, XmlNode node)
        {
            var xmlAttr = node.OwnerDocument.CreateAttribute("ClassName");

            xmlAttr.Value = indi.GetType().ToString();
            node.Attributes.Append(xmlAttr);

            foreach (var prop in indi.GetType().GetProperties())
            {
                var attrs = prop.GetCustomAttributes(typeof(DisplayNameAttribute), true);
                var attr  = (DisplayNameAttribute)attrs.FirstOrDefault(a => a is DisplayNameAttribute);
                if (attr == null)
                {
                    continue;
                }
                var propVal = prop.GetValue(indi, null);

                // есть свой сериализатор для свойства?
                attrs = prop.GetCustomAttributes(typeof(CustomXmlSerializationAttribute), true);
                if (attrs.Length > 0)
                {
                    var atrSerializer = (CustomXmlSerializationAttribute)attrs[0];
                    atrSerializer.SerializeProperty(propVal, node);
                    continue;
                }

                var attrName = prop.Name;

                var attrVal = propVal == null ? string.Empty
                    : prop.PropertyType == typeof(string) ?
                              string.IsNullOrEmpty((string)propVal) ? "" : (string)propVal
                    : prop.PropertyType == typeof(Color)
                    ? ((Color)propVal).ToArgb().ToString()
                    : string.Format(CultureProvider.Common, "{0}", propVal ?? "null");

                xmlAttr       = node.OwnerDocument.CreateAttribute(attrName);
                xmlAttr.Value = attrVal;
                node.Attributes.Append(xmlAttr);
            }
        }
コード例 #15
0
        private void ClearIndicatorPane(IChartIndicator indi)
        {
            var indiPaneCode = indi.CreateOwnPanel ? indi.Name :
                               string.IsNullOrEmpty(indi.DrawPaneDisplay)
                                   ? Localizer.GetString("TitleCourse") : indi.DrawPaneDisplay;

            // проверить соответствие панели ее строковому представлению
            if (indi.DrawPane != null)
            {
                // панель актуальна, не нужно устанавливать
                if (indiPaneCode == indi.GetFullyQualifiedPaneName())
                {
                    return;
                }
                if (indi.DrawPane.Name == indiPaneCode)
                {
                    return;
                }
                // индикатор более не строится на данной панельке

                // снять индикатор с панели
                foreach (var series in indi.SeriesResult)
                {
                    if (indi.DrawPane.Series.ContainsSeries(series))
                    {
                        indi.DrawPane.Series.Remove(series);
                    }
                }

                // если панель была создана самим индикатором
                // удалить панель из списка
                if (indi.DrawPane == ((BaseChartIndicator)indi).ownPane)
                {
                    chart.Panes.Remove(indi.DrawPane);
                }
            }
        }
コード例 #16
0
        public void RemoveIndicator(IChartIndicator indi)
        {
            if (indi.CreateOwnPanel)
            {
                foreach (var ind in indicators)
                {
                    if (ind == indi) continue;
                    if (ind.DrawPane == indi.DrawPane)
                    {// перенести все серии на панель по-умолчанию - курс
                        foreach (var series in ind.SeriesResult)
                        {
                            ind.DrawPane.Series.Remove(series);
                            chart.StockPane.Series.Add(series);
                        }
                        ind.DrawPane = chart.StockPane;
                        ind.DrawPaneDisplay = Localizer.GetString("TitleCourse");
                    }
                }
                // убрать саму панель
                if (chart.Panes.ContainsPane(indi.DrawPane)) chart.Panes.Remove(indi.DrawPane);
            }
            // убрать серии индикатора с панели
            if (indi.DrawPane != null)
            {
                foreach (var sr in indi.SeriesResult)
                {
                    if (indi.DrawPane.Series.ContainsSeries(sr))
                        indi.DrawPane.Series.Remove(sr);
                }
            }

            indi.Remove();

            // убрать сам индикатор
            indicators.Remove(indi);
        }
コード例 #17
0
        private static void LoadIndicatorProperties(IChartIndicator indi, XmlElement node)
        {
            foreach (var prop in indi.GetType().GetProperties())
            {
                var attrs = prop.GetCustomAttributes(typeof(DisplayNameAttribute), true);
                var attr = (DisplayNameAttribute)attrs.FirstOrDefault(a => a is DisplayNameAttribute);
                if (attr == null) continue;

                object val;

                // свойство само умеет себя десериализовать?
                attrs = prop.GetCustomAttributes(typeof(CustomXmlSerializationAttribute), true);
                if (attrs.Length > 0)
                {
                    var atrSerializer = (CustomXmlSerializationAttribute)attrs[0];
                    val = atrSerializer.DeserializeProperty(node);
                    prop.SetValue(indi, val, new object[0]);
                    continue;
                }

                // получить атрибут узла
                var xmlAttr = node.Attributes[prop.Name];
                if (xmlAttr == null) continue;

                // получить значение из строки
                if (prop.PropertyType.IsSubclassOf(typeof(Enum)))
                    val = Enum.Parse(prop.PropertyType, xmlAttr.Value);
                else
                {
                    //if (prop.Name == "ClLine") continue;
                    if (prop.PropertyType == typeof(Color))
                        val = Color.FromArgb(int.Parse(xmlAttr.Value));
                    else
                        val = Converter.GetObjectFromString(xmlAttr.Value, prop.PropertyType);
                }
                prop.SetValue(indi, val, new object[0]);
            }
        }
コード例 #18
0
        public static void MakeIndicatorXMLNode(IChartIndicator indi, XmlNode node)
        {
            var xmlAttr = node.OwnerDocument.CreateAttribute("ClassName");
            xmlAttr.Value = indi.GetType().ToString();
            node.Attributes.Append(xmlAttr);

            foreach (var prop in indi.GetType().GetProperties())
            {
                var attrs = prop.GetCustomAttributes(typeof(DisplayNameAttribute), true);
                var attr = (DisplayNameAttribute)attrs.FirstOrDefault(a => a is DisplayNameAttribute);
                if (attr == null) continue;
                var propVal = prop.GetValue(indi, null);

                // есть свой сериализатор для свойства?
                attrs = prop.GetCustomAttributes(typeof(CustomXmlSerializationAttribute), true);
                if (attrs.Length > 0)
                {
                    var atrSerializer = (CustomXmlSerializationAttribute)attrs[0];
                    atrSerializer.SerializeProperty(propVal, node);
                    continue;
                }

                var attrName = prop.Name;

                var attrVal = propVal == null ? string.Empty
                    : prop.PropertyType == typeof(string) ?
                    string.IsNullOrEmpty((string)propVal) ? "" : (string)propVal
                    : prop.PropertyType == typeof(Color)
                    ? ((Color)propVal).ToArgb().ToString()
                    : string.Format(CultureProvider.Common, "{0}", propVal ?? "null");

                xmlAttr = node.OwnerDocument.CreateAttribute(attrName);
                xmlAttr.Value = attrVal;
                node.Attributes.Append(xmlAttr);
            }
        }
コード例 #19
0
 public void EnsureUniqueName(IChartIndicator indi)
 {
     if (indicators.Count(i => i.UniqueName == indi.UniqueName) > 1)
         MakeNewIndiName(indi);
 }
コード例 #20
0
        private void MakeNewIndiName(IChartIndicator indi)
        {
            // если суфикс уже добавлен - выделить его
            decimal? indiSuffix = null;
            var matches = regxIndiNameSuffix.Matches(indi.UniqueName);
            var suffixStart = -1;
            if (matches.Count > 0)
            {
                indiSuffix = matches[matches.Count - 1].Value.ToInt();
                suffixStart = matches[matches.Count - 1].Index;
            }

            var newSuffix = (indiSuffix ?? 1) + 1;
            var nameRoot = suffixStart < 0 ? indi.UniqueName
                : indi.UniqueName.Substring(suffixStart - 1);
            string newName;
            while (true)
            {
                newName = string.Format("{0}({1})", nameRoot, newSuffix++);
                var testedName = newName;
                if (!indicators.Any(ind => ind.UniqueName == testedName)) break;
            }
            indi.UniqueName = newName;
        }
コード例 #21
0
        private void UpdateSourceSeries(IChartIndicator indi)
        {
            indi.SeriesSources = new List<Series.Series>();
            var seriesSrcString = string.IsNullOrEmpty(indi.SeriesSourcesDisplay)
                                          ? Localizer.GetString("TitleCourse") : indi.SeriesSourcesDisplay;
            // текстовое представление серий заполнено, значит считали из файла настроек и надо найти
            // серию источник из списка индикаторов
            // проводим разбор серий
            var strSeries = seriesSrcString.Split(Separators.SourcesDelimiter, StringSplitOptions.None);
            // strSeries содержит набор <имя индикатора>.<имя серии источника>
            foreach (var series in strSeries)
            {
                if (series == Localizer.GetString("TitleCourse"))
                {
                    indi.SeriesSources.Add(chart.StockSeries);
                }
                else
                {
                    // есть имя индикатора и серия, надо найти в списке
                    var indiSeries = series.Split(Separators.IndiNameDelimiter, StringSplitOptions.None);
                    if (indiSeries.Count() != 2) continue;

                    foreach (var indicator in indicators)
                    {
                        if (indicator.UniqueName != indiSeries[0]) continue;
                        // нашли индикатор, ищем серию
                        foreach (var s in indicator.SeriesResult.Where(s => s.Name == indiSeries[1]))
                            indi.SeriesSources.Add(s);
                    }
                }
            }
        }
コード例 #22
0
        private void EnsureIndicatorPanel(IChartIndicator indi)
        {
            if (indi.DrawPane != null) return;
            if (indi.CreateOwnPanel) return;

            var indiPaneCode = string.IsNullOrEmpty(indi.DrawPaneDisplay)
                                   ? Localizer.GetString("TitleCourse") : indi.DrawPaneDisplay;
            if (indi.CreateOwnPanel) indi.DrawPaneDisplay = string.Empty;
            if (string.IsNullOrEmpty(indi.DrawPaneDisplay) && indi.CreateOwnPanel == false)
                indi.DrawPaneDisplay = Localizer.GetString("TitleCourse");

            // если привязка к окну котировки...
            if (indiPaneCode == Localizer.GetString("TitleCourse"))
                indi.DrawPane = chart.StockPane;
            else
                foreach (var ind in indicators)
                {
                    if (indiPaneCode != ind.GetFullyQualifiedPaneName()) continue;
                    if (ind.DrawPane == null)
                    {// индикатор строится в окне индикатора, который сам строится в чужом
                        // окне, и оно для него (ind) еще не установлено - требуется рекурсия
                        EnsureIndicatorPanel(ind);
                    }
                    // теперь ind.DrawPane точно не null
                    indi.DrawPane = ind.DrawPane;
                }
            // положить серии на панель
            if (indi.DrawPane != null)
            foreach (var series in indi.SeriesResult)
                indi.DrawPane.Series.Add(series);
        }
コード例 #23
0
        private void CreateIndicatorPane(IChartIndicator indi)
        {
            // назначить индикатору панель
            if (!indi.CreateOwnPanel || ((BaseChartIndicator)indi).ownPane != null) return;

            var newPane = new Pane(indi.Name, chart);
            ((BaseChartIndicator)indi).ownPane = newPane;

            indi.DrawPane = newPane;
            foreach (var series in indi.SeriesResult)
                newPane.Series.Add(series);
            chart.Panes.Add(newPane);
        }
コード例 #24
0
        private void ClearIndicatorPane(IChartIndicator indi)
        {
            var indiPaneCode = indi.CreateOwnPanel ? indi.Name :
                string.IsNullOrEmpty(indi.DrawPaneDisplay)
                                   ? Localizer.GetString("TitleCourse") : indi.DrawPaneDisplay;
            // проверить соответствие панели ее строковому представлению
            if (indi.DrawPane != null)
            {
                // панель актуальна, не нужно устанавливать
                if (indiPaneCode == indi.GetFullyQualifiedPaneName()) return;
                if (indi.DrawPane.Name == indiPaneCode) return;
                // индикатор более не строится на данной панельке

                // снять индикатор с панели
                foreach (var series in indi.SeriesResult)
                    if (indi.DrawPane.Series.ContainsSeries(series))
                        indi.DrawPane.Series.Remove(series);

                // если панель была создана самим индикатором
                // удалить панель из списка
                if (indi.DrawPane == ((BaseChartIndicator)indi).ownPane)
                {
                    chart.Panes.Remove(indi.DrawPane);
                }
            }
        }
コード例 #25
0
 public IndicatorPlot(IChartIndicator <IPlotType> indicator)
 {
     Indicator = indicator;
     Plot      = plots.ToArray();
 }
コード例 #26
0
        private void AddNewIndicator(IChartIndicator indi)
        {
            indicators.Add(indi);
            indi.Add(chart, null);
            UpdateIndicatorPanesAndSeries();
            EnsureUniqueName(indi);
            indi.AcceptSettings();

            // индикатор требует обновления валютного кэша?
            if (indi is IHistoryQueryIndicator)
                UpdateCacheForIndicator((IHistoryQueryIndicator) indi);
            // индиактор может затребовать другие графики?
            if (indi is IChartQueryIndicator)
                ((IChartQueryIndicator)indi).GetOuterCharts += getOuterCharts;
            indi.BuildSeries(chart);
            ActivateIndiAddEvent((BaseChartIndicator)indi);
        }