Не сохраняется ChartActiveOrdersElement
Atom Ответить
14.03.2019


Если добавить 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();
}
}
}



Спасибо:




8 Ответов
Support

Фотография
Дата: 15.03.2019
Ответить


Добрый день

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

Константин

Фотография
Благотворитель
Дата: 15.03.2019
Ответить


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

Support

Фотография
Дата: 26.03.2019
Ответить


Добрый день

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

Константин

Фотография
Благотворитель
Дата: 01.04.2019
Ответить


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

Support

Фотография
Дата: 01.04.2019
Ответить


Добрый день

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

Константин

Фотография
Благотворитель
Дата: 02.04.2019
Ответить


Здравствуйте. Код написан исключительно для генерации исключения:
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[T](IEnumerable`1 source, Action`1 action)
в #=zUgOT$dqffNhqgBHbzKATis5ksn7fW5nxQ$P5ZxXxNFm31zN0sTRJfAEdqVq2LW4mUA==.#=zeVHr530Ei5NMe62OHw==(CachedSynchronizedSet`1 #=zLz_yTHcg$XcDmNJbDw==)
в StockSharp.Xaml.Charting.ChartActiveOrdersElement.#=zS0UYcC7JoJPtvI$e0SDPobN5JG4ZzJCK38SK7EM0P5yklHFikw==(#=zkLBFWGhA77gAAGpX8VUR2sW25fmTWXpK0udw$AODebIRGiUjYRAh6WuWrgZ1 #=zfuq5kUA=)
в System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
в System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
в System.Linq.Buffer`1..ctor(IEnumerable`1 source)
в System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
в #=z0DepTck0bocQHHfVCZtBFruF12dNuDHzbd166UmWHErMOeJXI8lXznmkkvZt..ctor(#=zkLBFWGhA77gAAGpX8VUR2sW25fmTWXpK0udw$AODebIRGiUjYRAh6WuWrgZ1 #=zNV6cels=, #=zMPk6Lh2B_jmrP7UuRDOkZP3pfStR0ZpumA== #=zzMEJFaI=, IEnumerable`1 #=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.BaseCollection`2.OnAdded(TItem item)
в Ecng.Collections.BaseCollection`2.Add(TItem item)
в StockSharp.Xaml.Charting.Chart.#=z9F6bNRC2OWze.#=zqgw4h9Y=(SettingsStorage #=zdW4k2mI=, IDictionary`2 #=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

Фотография
Дата: 06.04.2019
Ответить


Добрый день

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

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

Константин

Фотография
Благотворитель
Дата: 18.04.2019
Ответить


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy