← Zurück

Не сохраняется ChartActiveOrdersElement

Если добавить ChartActiveOrdersElement а область графика, а затем сохранить и загрузить то восстановления не происходит.


<dx:DXWindow x:Class="Chart.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:charting="http://schemas.stocksharp.com/xaml"
        xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
             mc:Ignorable="d"
        Title="MainWindow" Height="500" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <charting:ChartPanel Name="ChartPanel" IsInteracted="True"/>
        <Button Content="Init" Click="Init_OnClick" Grid.Row="1"></Button>
        <Button Content="Clear" Click="Clear_OnClick" Grid.Row="2"></Button>
        <Button Content="Load" Click="Load_OnClick" Grid.Row="3"></Button>
        <Button Content="Save" Click="Save_OnClick" Grid.Row="4"></Button>
    </Grid>
</dx:DXWindow>


using System.IO;
using Ecng.Serialization;
using System;
using System.Windows;
using Ecng.Collections;
using StockSharp.Xaml.Charting;

namespace Chart
{
    public partial class MainWindow
    {
        private MyStrategy Strategy;
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Load_OnClick(object sender, RoutedEventArgs e)
        {
            if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + "/SettingsStorage.xml"))
            {
                var settingsStorage =
                    new XmlSerializer<SettingsStorage>().Deserialize(
                        AppDomain.CurrentDomain.BaseDirectory + "/SettingsStorage.xml");
                ChartPanel.Load(settingsStorage);
            }
        }

        private void Save_OnClick(object sender, RoutedEventArgs e)
        {
            var settingsStorage = new SettingsStorage();
            ChartPanel.Save(settingsStorage);
            new XmlSerializer<SettingsStorage>().Serialize(settingsStorage, AppDomain.CurrentDomain.BaseDirectory + "/SettingsStorage.xml");
        }

        private void Init_OnClick(object sender, RoutedEventArgs e)
        {
            var area = new ChartArea();
            area.Elements.AddRange(new IChartElement[]{new ChartActiveOrdersElement() { FullTitle = "ChartActiveOrdersElement" }, new ChartCandleElement(){Title = "ChartCandleElement" }, });
            ChartPanel.AddArea(area);
        }

        private void Clear_OnClick(object sender, RoutedEventArgs e)
        {
            ChartPanel.ClearAreas();
        }
    }
}

Kommentare (9)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Support
Support

Добрый день

Графические компоненты сохраняют только визуальные настройки. Они не сохраняют сами данные, которые передаёт в них пользовательский код.

Константин
Константин Autor

А чем отличается ChartCandleElement от ChartActiveOrdersElement например? ChartCandleElement, так же как и ChartIndicatorElement нормально восстанавливаются.

Support
Support

Добрый день

Пожалуйста, возьмите ночную сборку. Сделана поддержка сохранения и восстановления ChartActiveOrdersElement

Константин
Константин
Константин Autor

В ночной сборке элемент сохраняется и восстанавливается, но если сохранить график с активным ордером(то есть будет отрисована линия ордера), а потом загрузить то получим исключение NullReferenceException.

Support
Support

Добрый день

Пожалуйста, приведите код, а так же текст ошибки.

Константин
Константин Autor

Здравствуйте. Код написан исключительно для генерации исключения: xaml:

<dx:DXWindow x:Class="Chart.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:charting="http://schemas.stocksharp.com/xaml"
        xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
             mc:Ignorable="d"
        Title="MainWindow" Height="500" Width="800">
        <charting:ChartPanel Name="ChartPanel" IsInteracted="True"/>
</dx:DXWindow>

C#

using System.IO;
using Ecng.Serialization;
using System;
using Ecng.Collections;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
using StockSharp.Xaml.Charting;

namespace Chart
{
    public partial class MainWindow
    {
        private SettingsStorage _settingsStorage;

        public MainWindow()
        {
            InitializeComponent();
            Load();
        }

        private void Load()
        {
            if (File.Exists("SettingsStorage.xml"))
            {
                _settingsStorage = new XmlSerializer<SettingsStorage>().Deserialize("SettingsStorage.xml");
                try
                {
                    ChartPanel.Load(_settingsStorage);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }
            }
            else
            {
                Init();
                var opder = new Order()
                {
                    Direction = Sides.Sell,
                    Price = 10,
                    Volume = 1,
                    Portfolio = new Portfolio(),
                    Security = new Security(),
                    Type = OrderTypes.Limit
                };

                var info = new ChartActiveOrderInfo { AutoRemoveFromChart = true, IsFrozen = true };
                ((ChartActiveOrdersElement)ChartPanel.Areas[0].Elements[0]).Orders.Add(info);
                info.UpdateOrderState(opder);
                Save();
                Load();
            }
        }

        private void Save()
        {
            if (_settingsStorage == null) _settingsStorage = new SettingsStorage();
            ChartPanel.Save(_settingsStorage);
            new XmlSerializer<SettingsStorage>().Serialize(_settingsStorage, "SettingsStorage.xml");
        }

        private void Init()
        {
            var area = new ChartArea();
            area.Elements.AddRange(new IChartElement[]
            {
                new ChartActiveOrdersElement() {FullTitle = "1 - ChartActiveOrdersElement"},
            });
            ChartPanel.AddArea(area);
        }
    }
}

Stack Trace:

Вызвано исключение: "System.NullReferenceException" в StockSharp.Xaml.Charting.dll System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в #=zUgOT$dqffNhqgBHbzKATis5ksn7fW5nxQ$P5ZxXxNFm31zN0sTRJfAEdqVq2LW4mUA==.#=zWcAwHBE6G5Gr(ChartActiveOrderInfo #=z0$7hqFk=) в MoreLinq.MoreEnumerable.ForEach(IEnumerable1 source, Action1 action) в #=zUgOT$dqffNhqgBHbzKATis5ksn7fW5nxQ$P5ZxXxNFm31zN0sTRJfAEdqVq2LW4mUA==.#=zeVHr530Ei5NMe62OHw==(CachedSynchronizedSet1 #=zLz_yTHcg$XcDmNJbDw==) в StockSharp.Xaml.Charting.ChartActiveOrdersElement.#=zS0UYcC7JoJPtvI$e0SDPobN5JG4ZzJCK38SK7EM0P5yklHFikw==(#=zkLBFWGhA77gAAGpX8VUR2sW25fmTWXpK0udw$AODebIRGiUjYRAh6WuWrgZ1 #=zfuq5kUA=) в System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() в System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() в System.Linq.Buffer1..ctor(IEnumerable1 source) в System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) в #=z0DepTck0bocQHHfVCZtBFruF12dNuDHzbd166UmWHErMOeJXI8lXznmkkvZt..ctor(#=zkLBFWGhA77gAAGpX8VUR2sW25fmTWXpK0udw$AODebIRGiUjYRAh6WuWrgZ1 #=zNV6cels=, #=zMPk6Lh2B_jmrP7UuRDOkZP3pfStR0ZpumA== #=zzMEJFaI=, IEnumerable1 #=zH0bA33RLOI$6) в #=zkLBFWGhA77gAAGpX8VUR2sW25fmTWXpK0udw$AODebIRGiUjYRAh6WuWrgZ1.#=ztUepVVpNm7yU() в #=zkLBFWGhA77gAAGpX8VUR2sW25fmTWXpK0udw$AODebIRGiUjYRAh6WuWrgZ1.#=zE$38$HJmEkif() в StockSharp.Xaml.Charting.ChartArea.set_Chart(IChart #=zWCeGY7U=) в StockSharp.Xaml.Charting.Chart.#=zfwQK$GZ1LJXT(ChartArea #=zc9NML58=) в Ecng.Collections.BaseCollection2.OnAdded(TItem item) в Ecng.Collections.BaseCollection2.Add(TItem item) в StockSharp.Xaml.Charting.Chart.#=z9F6bNRC2OWze.#=zqgw4h9Y=(SettingsStorage #=zdW4k2mI=, IDictionary2 #=zBabf5Rk=, IDictionary`2 #=zk3TOXFod9M$6oqY9UA==) в StockSharp.Xaml.Charting.ChartPanel.Load(SettingsStorage storage) в Chart.MainWindow.Load() в C:\Users\user\Projects\Chart\MainWindow.xaml.cs:строка 28 Вызвано исключение: "System.NullReferenceException" в Chart.exe Исключение типа "System.NullReferenceException" возникло в Chart.exe, но не было обработано в коде пользователя Ссылка на объект не указывает на экземпляр объекта.

Support
Support

Добрый день

Ошибка исправлена. Пожалуйста, возьмите ночную сборку.

График был изменен в работе с активными заявками. Класс ChartActiveOrderInfo убран, и отрисовка заявок теперь идентична отрисовке других данных. Изменения в работе с графиком можно посмотреть в примере SampleChartActiveOrders

Константин
Константин
Константин Autor

Ошибки нет, но изначальная проблема не решена. При вызове метода Chart.Load(SettingsStorage); ChartActiveOrdersElement не восстанавливается.

Support
Support

Добрый день

Пожалуйста, возьмите ночную сборку.