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

Метод Chart.Draw(StockSharp.Xaml.Charting.ChartDrawData data)
Atom
3/1/2017
swnike


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

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




Thanks:


1 2 3  > >>
Support

Avatar
Date: 3/1/2017
Reply


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

Thanks:

swnike

Avatar
Date: 3/2/2017
Reply


Свечи идут из коннектора.

Thanks:

Support

Avatar
Date: 3/3/2017
Reply


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

Thanks:

swnike

Avatar
Date: 3/3/2017
Reply


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

Thanks:

Support

Avatar
Date: 3/6/2017
Reply


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

Thanks:

swnike

Avatar
Date: 3/6/2017
Reply


Проект взят из набора "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();
        }
    }
}


Thanks:

Support

Avatar
Date: 3/7/2017
Reply


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

Thanks:

swnike

Avatar
Date: 3/7/2017
Reply


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

MainWindow.xaml.cs 8 KB (892) Exception_20170307.png 141 KB (1029)
Thanks:

Support

Avatar
Date: 3/7/2017
Reply


У Вам местное время московское?

Thanks:

swnike

Avatar
Date: 3/7/2017
Reply


Нет. Опережает на 2 часа Москву.

Thanks:
1 2 3  > >>

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

loading
clippy