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

Не сохраняется 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();
        }
    }
}




Thanks:


Support

Avatar
Date: 3/15/2019
Reply


Добрый день

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

Thanks:

Константин

Avatar
Date: 3/15/2019
Reply


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

Thanks:

Support

Avatar
Date: 3/26/2019
Reply


Добрый день

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

Thanks: Константин

Константин

Avatar
Date: 4/1/2019
Reply


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

Thanks:

Support

Avatar
Date: 4/1/2019
Reply


Добрый день

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

Thanks:

Константин

Avatar
Date: 4/2/2019
Reply


Здравствуйте. Код написан исключительно для генерации исключения: 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, но не было обработано в коде пользователя Ссылка на объект не указывает на экземпляр объекта.

Thanks:

Support

Avatar
Date: 4/6/2019
Reply


Добрый день

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

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

Thanks: Константин

Константин

Avatar
Date: 4/18/2019
Reply


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

Thanks:

Support

Avatar
Date: 5/12/2019
Reply


Добрый день

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

Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy