public void EnsureUniqueName(IChartIndicator indi) { if (indicators.Count(i => i.UniqueName == indi.UniqueName) > 1) { MakeNewIndiName(indi); } }
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; }
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; }
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(); }
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; }
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); } } }
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]); } }
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); }
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); }
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); }
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); } } } } }
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); }
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); }
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); } }
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); } } }
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); }
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]); } }
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); } }
public void EnsureUniqueName(IChartIndicator indi) { if (indicators.Count(i => i.UniqueName == indi.UniqueName) > 1) MakeNewIndiName(indi); }
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; }
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); } } } }
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); }
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); }
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); } } }
public IndicatorPlot(IChartIndicator <IPlotType> indicator) { Indicator = indicator; Plot = plots.ToArray(); }
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); }