private void ButtonApplyClick(object sender, EventArgs e)
        {
            var columns = new List <FastColumn>();

            foreach (var columnItem in listBoxAvailable.Items)
            {
                var column = grid.Columns.Find(c => c.Title == columnItem as string);
                column.Visible = false;
                columns.Add(column);
            }
            foreach (var columnItem in listBoxVisible.Items)
            {
                var column = grid.Columns.Find(c => c.Title == columnItem as string);
                column.Visible = true;
                columns.Add(column);
            }
            grid.Columns = columns;
            grid.CheckSize(true);
            buttonApply.Enabled = false;
        }
Esempio n. 2
0
        private void Rebuild()
        {
            // ищем отображаемые свойства как пересечение множеств свойств выбранных объектов
            var selectedProperties = new List<PropertyInfo>();
            if (selectedObjects != null)
            {
                var chartObjectPropertiesDict = new Dictionary<object, List<PropertyInfo>>();
                var allProperties = new List<PropertyInfo>();
                foreach (var chartObject in selectedObjects)
                {
                    var chartObjectProperties = chartObject.GetType().GetProperties().Where(IsBrowsable).ToList();
                    chartObjectPropertiesDict.Add(chartObject, chartObjectProperties);
                    allProperties.AddRange(chartObjectProperties);
                }
                // ищем пересечение
                foreach (var property in allProperties)
                {
                    var add = true;
                    foreach (var chartObject in selectedObjects)
                    {
                        // одинаковые по сути свойства представлены разными объектами PropertyInfo,
                        // а IEquatable.Equals сравнивает ссылки, поэтому проверку на равенство выполняем самостоятельно
                        if (!chartObjectPropertiesDict[chartObject].Any(p => p.Name == property.Name && p.PropertyType == property.PropertyType))
                        {
                            add = false;
                            break;
                        }
                    }
                    if (add && !selectedProperties.Any(p => p.Name == property.Name && p.PropertyType == property.PropertyType))
                        selectedProperties.Add(property);
                }
            }
            else if (selectedObject != null)
                selectedProperties = selectedObject.GetType().GetProperties().Where(IsBrowsable).ToList();

            // определяем категории
            var categories = new List<Cortege2<string, int>>();
            foreach (var property in selectedProperties)
            {
                var category = GetCategory(property);
                if (!string.IsNullOrEmpty(category) && !categories.Exists(c => c.a == category))
                    categories.Add(new Cortege2<string, int>(category, GetOrder(property).b));
            }

            // сортируем категории
            categories.Sort((arg1, arg2) => arg1.b - arg2.b);

            // для каждой категории создаем по вкладке
            tabControl.TabPages.Clear();
            var blankRow = new FastPropertyGridRow();
            foreach (var category in categories)
            {
                tabControl.TabPages.Add(category.a, category.a);
                var fastGrid = new FastGrid.FastGrid {Dock = DockStyle.Fill, FitWidth = true, CaptionHeight = 0};
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Title)));
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.StringValue)) {ColumnFont = new Font(Font, FontStyle.Bold)});
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Property)) {Visible = false});
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Value)) {Visible = false});
                fastGrid.UserHitCell += UserHitCell;
                tabControl.TabPages[category.a].Controls.Add(fastGrid);
                // определяем свойства внутри категории
                var propertiesInCategory = new List<Cortege2<PropertyInfo, int>>();
                foreach (var property in selectedProperties)
                {
                    if (GetCategory(property) != category.a)
                        continue;
                    propertiesInCategory.Add(new Cortege2<PropertyInfo, int>(property, GetOrder(property).a));
                }

                // сортируем свойства
                propertiesInCategory.Sort((arg1, arg2) => arg1.b - arg2.b);

                // создаем данные типа "имя-значение"
                var data = new List<FastPropertyGridRow>();
                foreach (var property in propertiesInCategory)
                {
                    // в случае множества объектов, null - фиктивное значение (значение, используемое для отображения в случае различных значений)
                    object value = null;
                    if (selectedObjects != null)
                    {
                        var allValues = GetDistinctPropertyValues(selectedObjects, property.a);
                        if (allValues.Count == 1)
                            value = allValues.First();
                    }
                    else if (selectedObject != null)
                        value = property.a.GetValue(selectedObject, null);

                    data.Add(new FastPropertyGridRow
                        {
                            Title = GetDisplayName(property.a),
                            Value = value,
                            Property = property.a,
                            StringValue = GetStringValue(value, property.a)
                        });
                }
                fastGrid.DataBind(data);

                // фиксируем ширину колонки с наименованием
                fastGrid.CheckSize(true);
            }
            RebuildSample();
        }
        /// <summary>
        /// Предустановка столбцов таблицы по сделкам
        /// </summary>
        public static void SetupDealsGrid(FastGrid.FastGrid grid, bool isClosedDealsTable)
        {
            var blankMarketOrder = new MarketOrder();
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.ID), "#") {ColumnWidth = 50});
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.Symbol), Localizer.GetString("TitleInstrument")) {ColumnWidth = 70});
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.Side), Localizer.GetString("TitleType"))
                {
                    ColumnWidth = 60,
                    formatter = s => (int) s < 0 ? "SELL" : "BUY"
                });
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.Volume), Localizer.GetString("TitleVolume"))
                {
                    ColumnWidth = 82,
                    formatter = value => ((int) value).ToStringUniformMoneyFormat()
                });
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.PriceEnter), Localizer.GetString("TitleEnter"))
                {
                    ColumnWidth = 64,
                    formatter = p => ((float) p).ToStringUniformPriceFormat()
                });
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.TimeEnter), Localizer.GetString("TitleEnterTime"))
                {
                    ColumnWidth = 82
                });
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.PriceExit), Localizer.GetString("TitleExit"))
                {
                    ColumnWidth = 64,
                    formatter = p => p == null ? "" : ((float) p).ToStringUniformPriceFormat()
                });
            grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.ResultBase), Localizer.GetString("TitleResultInUSDShort"))
                {
                    ColumnWidth = 82,
                    formatter = p => p == null ? "" : ((float) p).ToStringUniformPriceFormat()
                });
            if (isClosedDealsTable)
            {
                grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.TimeExit), Localizer.GetString("TitleExitTime"))
                    {
                        ColumnMinWidth = 160
                    });
                grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.ResultDepo), Localizer.GetString("TitleResult"))
                    {
                        ColumnMinWidth = 65,
                        formatter = value => ((float) value).ToStringUniformMoneyFormat(),
                        colorColumnFormatter = (object value, out Color? color, out Color? fontColor) =>
                            {
                                color = null;
                                fontColor = null;
                                if (value == null) return;
                                var rst = (float) value;
                                fontColor = rst < -0.9f ? Color.Red : rst < 1 ? Color.Black : Color.Blue;
                            }
                    });
            }
            else
            {
                grid.Columns.Add(new FastColumn(blankMarketOrder.Property(p => p.ResultPoints), Localizer.GetString("TitlePoints"))
                    {
                        ColumnMinWidth = 65,
                        formatter = value => ((float) value).ToStringUniformMoneyFormat(true),
                        colorColumnFormatter = (object value, out Color? color, out Color? fontColor) =>
                            {
                                color = null;
                                fontColor = null;
                                if (value == null) return;
                                var rst = (float) value;
                                fontColor = rst < -0.9f ? Color.Red : rst < 1 ? Color.Black : Color.Blue;
                            }
                    });
            }

            grid.FontAnchoredRow = new Font(grid.Font, FontStyle.Bold);
            grid.CheckSize(true);
            grid.CalcSetTableMinWidth();
            grid.ContextMenuRequested += OrdersFastGridContextMenuRequested;
        }
Esempio n. 4
0
        private void Rebuild()
        {
            // ищем отображаемые свойства как пересечение множеств свойств выбранных объектов
            var selectedProperties = new List <PropertyInfo>();

            if (selectedObjects != null)
            {
                var chartObjectPropertiesDict = new Dictionary <object, List <PropertyInfo> >();
                var allProperties             = new List <PropertyInfo>();
                foreach (var chartObject in selectedObjects)
                {
                    var chartObjectProperties = chartObject.GetType().GetProperties().Where(IsBrowsable).ToList();
                    chartObjectPropertiesDict.Add(chartObject, chartObjectProperties);
                    allProperties.AddRange(chartObjectProperties);
                }
                // ищем пересечение
                foreach (var property in allProperties)
                {
                    var add = true;
                    foreach (var chartObject in selectedObjects)
                    {
                        // одинаковые по сути свойства представлены разными объектами PropertyInfo,
                        // а IEquatable.Equals сравнивает ссылки, поэтому проверку на равенство выполняем самостоятельно
                        if (chartObjectPropertiesDict[chartObject].Any(
                                p => p.Name == property.Name && p.PropertyType == property.PropertyType))
                        {
                            continue;
                        }
                        add = false;
                        break;
                    }
                    if (add && !selectedProperties.Any(p => p.Name == property.Name && p.PropertyType == property.PropertyType))
                    {
                        selectedProperties.Add(property);
                    }
                }
            }
            else if (selectedObject != null)
            {
                selectedProperties = selectedObject.GetType().GetProperties().Where(IsBrowsable).ToList();
            }

            // определяем категории
            var categories = new List <Cortege2 <string, int> >();

            foreach (var property in selectedProperties)
            {
                var category = GetCategory(property);
                if (!string.IsNullOrEmpty(category) && !categories.Exists(c => c.a == category))
                {
                    categories.Add(new Cortege2 <string, int>(category, GetOrder(property).b));
                }
            }

            // сортируем категории
            categories.Sort((arg1, arg2) => arg1.b - arg2.b);

            // для каждой категории создаем по вкладке
            tabControl.TabPages.Clear();
            var blankRow = new FastPropertyGridRow();

            foreach (var category in categories)
            {
                tabControl.TabPages.Add(category.a, category.a);
                var fastGrid = new FastGrid.FastGrid {
                    Dock = DockStyle.Fill, FitWidth = true, CaptionHeight = 0
                };
                Grid = fastGrid;
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Title)));
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.StringValue))
                {
                    ColumnFont = new Font(Font, FontStyle.Bold)
                });
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Property))
                {
                    Visible = false
                });
                fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Value))
                {
                    Visible = false
                });
                fastGrid.UserHitCell += UserHitCell;
                tabControl.TabPages[category.a].Controls.Add(fastGrid);
                // определяем свойства внутри категории
                var propertiesInCategory = new List <Cortege2 <PropertyInfo, int> >();
                foreach (var property in selectedProperties)
                {
                    if (GetCategory(property) != category.a)
                    {
                        continue;
                    }
                    propertiesInCategory.Add(new Cortege2 <PropertyInfo, int>(property, GetOrder(property).a));
                }

                // сортируем свойства
                propertiesInCategory.Sort((arg1, arg2) => arg1.b - arg2.b);

                // создаем данные типа "имя-значение"
                var data = new List <FastPropertyGridRow>();
                foreach (var property in propertiesInCategory)
                {
                    // в случае множества объектов, null - фиктивное значение (значение, используемое для отображения в случае различных значений)
                    object value = null;
                    if (selectedObjects != null)
                    {
                        var allValues = GetDistinctPropertyValues(selectedObjects, property.a);
                        if (allValues.Count == 1)
                        {
                            value = allValues.First();
                        }
                    }
                    else if (selectedObject != null)
                    {
                        value = property.a.GetValue(selectedObject, null);
                    }

                    data.Add(new FastPropertyGridRow
                    {
                        Title       = GetDisplayName(property.a),
                        Value       = value,
                        Property    = property.a,
                        StringValue = GetStringValue(value, property.a)
                    });
                }
                fastGrid.DataBind(data);

                // фиксируем ширину колонки с наименованием
                fastGrid.CheckSize(true);
                fastGrid.Visible = true;
            }
            RebuildSample();
        }
        public static void RebindStatisticsFastGrid(FastGrid.FastGrid grid, PerformerStat performer, AccountEfficiency efficiency)
        {
            if (performer == null)
                return;
            var singleValueData = new List<TradeSharp.Util.Cortege2<string, string>>();
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleProfitInPercents"),
                    b = performer.Profit.ToString("f2")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleDealsTotal"),
                    b = performer.DealsCount.ToStringUniformMoneyFormat()
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleMaximumRelativeDrawdownInPercents"),
                    b = performer.MaxRelDrawDown.ToString("N2")
                });

            if (efficiency != null) // при получении всех сделок
            {
                singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleProfitableDealCount"),
                    b = (efficiency.closedDeals.Count(d => d.ResultDepo > 0) +
                         efficiency.openedDeals.Count(d => d.ResultDepo > 0)).ToStringUniformMoneyFormat()
                });
                singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleLosingDealCount"),
                    b = (efficiency.closedDeals.Count(d => d.ResultDepo < 0) +
                         efficiency.openedDeals.Count(d => d.ResultDepo < 0)).ToStringUniformMoneyFormat()
                });
                singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                    {
                        a = Localizer.GetString("TitleDealsOpened"),
                        b = efficiency.DealsStillOpened.ToStringUniformMoneyFormat()
                    });
            }

            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleRatioOfAverageProfitToAverageLossShort"),
                    b = performer.GreedyRatio.ToString("N2")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleMaximumLeverage"),
                    b = performer.MaxLeverage.ToString("N2")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleProfitForNMonthsInPercents"),
                    b = performer.ProfitLastMonths.ToString("f2")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleGAAnnualProfitInPercentsShort"),
                    b = performer.AvgYearProfit.ToString("N3")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleSharpeRatioShort"),
                    b = performer.Sharp.ToString("N2")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleSubscriberCount"),
                    b = performer.SubscriberCount.ToString("d")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleFundsUnderManagementShort") + ", " + performer.DepoCurrency,
                    b = performer.Equity.ToStringUniformMoneyFormat()
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleRatingFS"),
                    b = performer.Score.ToString("f2")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleTradeTimeInDays"),
                    b = performer.DaysTraded.ToString("d")
                });
            singleValueData.Add(new TradeSharp.Util.Cortege2<string, string>
                {
                    a = Localizer.GetString("TitleProfitInPoints"),
                    b = performer.SumProfitPoints.ToStringUniformMoneyFormat(false)
                });
            grid.DataBind(singleValueData);

            // для удобочитаемости первая колонка сохраняет первоначальную минимальную ширину
            var skippedColumns = grid.Columns.Where(c => c.PropertyName == "a").ToList();
            var minWidths = skippedColumns.ToDictionary(c => c, c => c.ColumnMinWidth);
            grid.CheckSize(true);
            skippedColumns.ForEach(c => c.ColumnMinWidth = minWidths[c]);
            grid.Invalidate();
        }