Метод Chart.Draw(StockSharp.Xaml.Charting.ChartDrawData data)
Atom
01.03.2017


При запуске этого метода выдается исключение: InvalidOperationException.
Если же использовать старый метод (закомментированные строки), то все работает правильно.
StockSharp rev. 4.3.19.5; 4.3.21
Draw_invalidOperationException.png

Как это лечится?



Спасибо:




44 Ответов
1 2  >
Support

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


Свечи из коннектора идут или исторические свечи?
Спасибо:

swnike

Фотография
Курсы
Дата: 02.03.2017
Ответить


Свечи идут из коннектора.
Автор топика
Спасибо:

Support

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


Ошибка эта постоянно повторяется или иногда бывает?
Спасибо:

swnike

Фотография
Курсы
Дата: 03.03.2017
Ответить


Ошибка присутствует постоянно.
Автор топика
Спасибо:

Support

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


У меня эта ошибка не воспроизводится... От Вас нужно 1) полный код программы, 2) для каких инструментов строить график... 3) от какого брокера данные?
Спасибо:

swnike

Фотография
Курсы
Дата: 06.03.2017
Ответить


Проект взят из набора "StockSharp.Edu_4.3.19.5\04_lesson (Candles, Charts, Historical data)\CandlesChartProject". При запуске из урока ошибка та же самая, что описана выше.
Модифицированный вариант:
1)Проект копируется в отдельную папку. ("CandlesChartProject"). Корректируется пространство имен.
2) Visual Studio 2015 -> Сборка -> Очистить Решение.
3) Ссылки заменены на новые из папки Reference библиотеки StockSharp rev 4.3.21
4) Visual Studio 2015 -> Сборка -> Пересобрать Решение.
5) в основном файле добавлено логирование и выполнена корректировка кода.
6) файл стратегии и индикатора не менялся
7) Брокер - Финам; Инструмент - SiH7@FORTS, SBER@TQBR
8) Программа запускалась на машине с win7 и win10. Исключения разные:


Exception_win7_20170306.png

exception_win10_20170306.png

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

Код

using System;
using MoreLinq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
using System.Windows.Media;
using Ecng.Xaml;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Quik;
using StockSharp.TraderConnection;
using StockSharp.Messages;
using StockSharp.Algo;
using StockSharp.Xaml.Charting;
using StockSharp.Logging;
using StockSharp.Xaml;
using Ecng.Serialization;


namespace CandlesChartProject
{

// Изменения в коде относительно видеоурока
// ------------------------------------------------------------------------------------------
// Теперь отрисовка элементов графика выполняется
// при помощи метода Chart.Draw. Методы Chart.ProcessValues и Chart.ProcessCandles - устарели.
// Метод TimeFrame.GetCandleBounds(Security) больше не используется, нужно использовать одну из новых перегрузок
// TimeFrame.GetCandleBounds(DateTime), TimeFrame.GetCandleBounds(DateTime, ExchangeBoard), TimeFrame.GetCandleBounds(DateTime, WorkingTime)

public partial class MainWindow : Window
{
private CandleManager _candleManager;
private CandleSeries _candleSeries;

private ChartArea _chartArea1;
private ChartArea _chartArea2;

private ChartCandleElement _chartCandleElement;
private ChartIndicatorElement _chartIndicatorSmaElement;
private ChartIndicatorElement _chartIndicatorMyElement;
private ChartTradeElement _chartTradeElement;
private ChartOrderElement _chartOrderElement;

private SimpleMovingAverage _indicatorSma;
private MyIndicator _indicatorMy;

private SmaStrategy _smaStrategy;

private ChartDrawData _data;

public MainWindow()
{
InitializeComponent();

ConnectionInterFace.SafeConnection = new SafeConnection(new QuikTrader(QuikTerminal.GetDefaultPath()));

_logmanager.Listeners.Add(new GuiLogListener(_monitor));
_logmanager.Listeners.Add(new FileLogListener("log.txt"));
_logmanager.Sources.Add(ConnectionInterFace.SafeConnection.Trader);
_monitor.Show();
}

MonitorWindow _monitor = new MonitorWindow();
LogManager _logmanager = new LogManager();


private void GetCandlesClick(object sender, RoutedEventArgs e)
{
_chartCandleElement = new ChartCandleElement();
_chartArea1.Elements.Add(_chartCandleElement);

_chartTradeElement = new ChartTradeElement();
_chartArea1.Elements.Add(_chartTradeElement);

_chartOrderElement = new ChartOrderElement();
_chartArea1.Elements.Add(_chartOrderElement);

InitIndicators();

RunProcessGetCandles();

InitStrategy();
}

private void RunProcessGetCandles()
{
_candleManager = new CandleManager(ConnectionInterFace.SafeConnection.Trader);

var security = ConnectionInterFace.SelectedSecurity;

var timeFrame = TimeSpan.FromMinutes(1);

_candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);

_candleManager.Processing += Draw;

_logmanager.Sources.Add(_candleManager);

_candleManager.Start(_candleSeries);
}

private void Draw(CandleSeries series, Candle candle)
{

//--------------
var timeFrame = (TimeSpan) candle.Arg;
            var candleBounds = timeFrame.GetCandleBounds(DateTimeOffset.Now);
//--------------

var valueSma = _indicatorSma.Process(candle);
//var chartValueSma = new ChartIndicatorValue(_indicatorSma, valueSma);

var valueMy = _indicatorMy.Process(candle);
//var chartValueMy = new ChartIndicatorValue(_indicatorMy, valueMy);

//lastCandleTime = candle.CloseTime;



if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounds.Min)
{
Debug.Print("Candle: {0}", candle);
//var data = new
var dataItem = _data.Group(candle.OpenTime);
dataItem.Add(_chartCandleElement, candle);
dataItem.Add(_chartIndicatorSmaElement, valueSma);
dataItem.Add(_chartIndicatorMyElement, valueMy);

this.GuiAsync(() => Chart.Draw(_data));

//this.GuiAsync(() => Chart.Draw(candle.OpenTime, new Dictionary<IChartElement, object>
// {
// {_chartCandleElement, candle},
// {_chartIndicatorSmaElement, valueSma},
// {_chartIndicatorMyElement, valueMy}
// }));



}
}

private void InitChart()
{
_data = new ChartDrawData();

Chart.IsAutoScroll = true;

_chartArea1 = new ChartArea();
Chart.Areas.Add(_chartArea1);

_chartArea2 = new ChartArea();
Chart.Areas.Add(_chartArea2);
}

private void WindowLoaded(object sender, RoutedEventArgs e)
{
InitChart();
}

private void InitIndicators()
{
_indicatorSma = new SimpleMovingAverage
{
Length = 10
};

_chartIndicatorSmaElement = new ChartIndicatorElement
{
Title = "SMA",
Color = Colors.BlueViolet,
//Indicator = _indicatorSma
};

_chartArea1.Elements.Add(_chartIndicatorSmaElement);


_indicatorMy = new MyIndicator();

_chartIndicatorMyElement = new ChartIndicatorElement
{
Title = "My Indicator",
Color = Colors.Blue,
//Indicator = _indicatorMy
};

_chartArea2.Elements.Add(_chartIndicatorMyElement);
}

private void InitStrategy()
{
_smaStrategy = new SmaStrategy(_indicatorSma, _candleSeries)
{
Connector = ConnectionInterFace.SafeConnection.Trader,
Security = ConnectionInterFace.SelectedSecurity,
Portfolio = ConnectionInterFace.SelectedPortfolio,
Volume = 1
};

_smaStrategy.SetCandleManager(_candleManager);

var timeFrame = TimeSpan.FromMinutes(1);

_smaStrategy.WhenNewMyTrade() //WhenNewMyTrades()
.Do(mytrade => this.GuiAsync(() =>
{
var dataItem = _data.Group(timeFrame.GetCandleBounds(mytrade.Trade.Time.DateTime).Min);
dataItem.Add(_chartTradeElement, mytrade);
//mytrades.ForEach(t =>
//{
// var dataItem = _data.Group(timeFrame.GetCandleBounds(t.Trade.Time.DateTime).Min);
// dataItem.Add(_chartTradeElement, t);
//});
Chart.Draw(_data);
}
)).Apply();

_smaStrategy.WhenOrderRegistered()
.Do(order => this.GuiAsync(() =>
{
var dataItem = _data.Group(order.Time);
dataItem.Add(_chartOrderElement, order);
Chart.Draw(_data);
}))
.Apply();

_logmanager.Sources.Add(_smaStrategy);

_smaStrategy.Start();
}
}
}

Автор топика
Спасибо:

Support

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


Прежде чем дальше будем разбираться, вот эту часть candle.OpenTime >= candleBounds.Min из кода уберите и проверьте
Спасибо:

swnike

Фотография
Курсы
Дата: 07.03.2017
Ответить


Проверил сегодня на SiH7@FORTS. Результат тот же - возникает исключение.
MainWindow.xaml.cs
Exception_20170307.png
Автор топика
Спасибо:

Support

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


У Вам местное время московское?
Спасибо:

swnike

Фотография
Курсы
Дата: 07.03.2017
Ответить


Нет. Опережает на 2 часа Москву.
Автор топика
Спасибо:

Support

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


У Вас эта ошибка из-за разницы во времени.. Ищите места где локальное время с биржевым может быть перепутано...
Спасибо:

Матильда

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


У меня тот же вопрос. Время от московского не отличается, но появляются те же исключения, причем как на 4.3.19.5, так и на 4.3.21. Что-то решилось?
Спасибо:

Support

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


Т.е. вы на компе поставили московское время?
Спасибо:

Матильда

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


Ну да, как на компьютере операционку установил, так и стоит московское время.
Спасибо:

Support

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


Посмотрите, ваш комп автоматически на летнее время не перешел..
Спасибо:

Матильда

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


Нет, сейчас, скажем, 14:30.
Спасибо:

Support

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


Тогда нужен лог, в котором показаны данные каждой свечи, и момент ошибки..
Спасибо:

Матильда

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


Высылаю данные по минутным свечам и появляющиеся исключения: Log.rtf.
Интересно, но исключение, как выяснилось, появляется не на всех таймфреймах.
Спасибо:

Support

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


На минутках только?
Спасибо:

Матильда

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


Я не исследовал подробно, но исключение возникало далеко не только на минутках. Я пробовал таймфреймы от 10 секунд до часа, ошибок не было вроде бы только в диапазоне 10-40 секунд.
Спасибо:

Support

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


Я в логе ошибку не нашел.. Чем Вы этот лог пишете?
Спасибо:

Матильда

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


А вы до конца файл промотайте, там и ошибки. И их много.
Спасибо:

Support

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


16:35:00 TimeFrameCandle_GM@SPFEQ_00:01:00 (O:34.17, H:34.2, L:34.17, C:34.2, V:4)
16:36:00 TimeFrameCandle_GM@SPFEQ_00:01:00 (O:34.19, H:34.19, L:34.18, C:34.18, V:2)
Невозможно изменить значение для свечи для даты 06.04.2017 2:56:00 +03:00 последнее добавленное значение для даты 06.04.2017 19:24:00.

Выведите в лог время свечи... (OpenTime)
Спасибо:

Матильда

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


Вывод устроен таким образом, что вызывающая исключение свеча находится в предшествующей строке. В указанном вами случае такой свечой является свеча 16:36:00.
Спасибо:

Support

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


Я хочу полностью увидеть данные свечи со временем, чтобы понять откуда она берется..
Спасибо:
1 2  >

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

loading
clippy