Индикатор Fractal на графике (ошибка)

Индикатор Fractal на графике (ошибка)
Atom
4/24/2013
UsilaDobry


Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор Fractals, у меня было две ошибки исполнения. Я удалил весь код, связанный с Fractals и опять запустил вот этот код. Выпадает Exception в строке var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security); "Заданный аргумент находится вне диапазона допустимых значений."

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
using System.Windows.Media;
using Ecng.Xaml;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Quik;
using StockSharp.TraderConnection;
using StockSharp.Xaml;

namespace MARKET_SUCCESS
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
        private CandleManager _candleManager;                       //Менеджер свечей
        private CandleSeries _candleSeries;                         //Серия свечей

        private ChartArea _chartArea;                               //Область на графике

        private ChartCandleElement _chartCandleElement;             //Графический элемент свечи
        private ChartIndicatorElement _chartBollingerElement;       //Графический элемент Bollinger
        private ChartIndicatorElement _chartParabolicElement;       //Графический элемент Parabolic SAR
        private ChartIndicatorValue _chartBollingerValue;           //графическое значение Bollinger
        private ChartIndicatorValue _chartParabolicValue;           //Графическое значение Parabolic SAR
        private BollingerBands _bollinger;                          //Индикатор Bollinger Bands
        private ParabolicSar _parabolic;                            //Индикатор Parabolic SAR

        public MainWindow()
        {
            InitializeComponent();

            //Указываем конкретный вариант коннектора в обертку
            ConnectionInterface.SafeConnection = new SafeConnection(new QuikTrader(QuikTerminal.GetDefaultPath()));

        }
        private void ChartButton_Click(object sender, RoutedEventArgs e)
        {
            //Проверяем, чтобы значение тайм-фрейма было указано
            if (TpTimeFrame.Value == null)
            {
                Debug.Print("Value from tpTimeFrame is null");
                return;
            }

            InitChart();
            //Создаем экземпляр графического элемента свечи
            _chartCandleElement = new ChartCandleElement();
            //Добавляем графический элемент свечи в коллекцию
            _chartArea.Elements.Add(_chartCandleElement);

            //Инициализируем индикаторы
            InitIndicators();

            //Получаем тайм-фрейм
            var timeFrame = TpTimeFrame.Value.Value.TimeOfDay;

            //Инициируем процесс получения свечей и дальнейшей отрисовки
            RunProcessGetCandles(timeFrame);

            //Инициализируем стратегию
            //InitStrategy();
        }

        /// <summary>
        /// Метод инициирования среды для получения свечей и дальнейшей отрисовки
        /// </summary>
        /// <param name="timeFrame">Тайм-фрейм для свечей</param>
        private void RunProcessGetCandles(TimeSpan timeFrame)
        {
            //Создаем менеджер свечей
            _candleManager = new CandleManager(ConnectionInterface.SafeConnection.Trader);

            //Получаем торговый инструмент
            var security = ConnectionInterface.SelectedSecurity;

            //Создаем серию свечей
            _candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);

            //Подписываемся на событие обработки свечи
            _candleSeries.ProcessCandle += Draw;

            //Запускаем получение свечей
            _candleManager.Start(_candleSeries);
        }

        /// <summary>
        /// Метод запускает отрисовку по указанной свече
        /// </summary>
        /// <param name="candle">Экземпляр свечи</param>
        private void Draw(Candle candle)
        {
            //Временные рамки свечи
            var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security);

            //Получаем значение Bollinger по данной свече
            var valueBb = _bollinger.Process(candle);
            //Создаем экземпляр значения Bollinger для непосредственного вывода на график
            _chartBollingerValue = new ChartIndicatorValue(_bollinger, valueBb);
            //Получаем значение Parabolic SAR по данной свечке
            var valueSar = _parabolic.Process(candle);
            //Создаем экземпляр значение Paraboli SAR для вывода на график  
            _chartParabolicValue = new ChartIndicatorValue(_parabolic, valueSar);

            //Работаем только с завершенными свечами и одной последней свечей с произвольным состоянием
            if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounds.Min)
            {
                //Выводим значения на график
                this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                    {
                        {_chartCandleElement, candle},                         //для свечи
                        {_chartBollingerElement, _chartBollingerValue},        //для Bollinger Bands 
                        {_chartParabolicElement, _chartParabolicValue}        //для Parabolic SAR_
                    }));
            }
        }

        /// <summary>
        /// Метод инициализации графика
        /// </summary>
        private void InitChart()
        {
            //Включить авто-прокрутку
            Chart.IsAutoScroll = true;

            //Создаем экземпляр области
            _chartArea = new ChartArea();
            //Добавляем экземпляр области в коллекцию визуального контрола графика
            Chart.Areas.Add(_chartArea);

        }

        /// <summary>
        /// Метод инициализации индикаторов
        /// </summary>
        private void InitIndicators()
        {
             //Создаем экземпляр Bollinger Bands 
             _bollinger = new BollingerBands
                 {
                     Length = 20,
                     Width = 2
                 };

             //Создаем экземпляр графического элемента Bollinger
             _chartBollingerElement = new ChartIndicatorElement
                 {
                     Title = "Bollinger",
                     Color = Colors.Blue,
                     Indicator = _bollinger
                 };
             //Добавляем графический элемент индикатора в коллекцию области
             _chartArea.Elements.Add(_chartBollingerElement);

             //Создаем экземпляр Parabolic SAR
            _parabolic = new ParabolicSar
                {
                    AccelerationMax = (decimal) 0.02,
                    AccelerationStep = (decimal) 0.2
                };
            //Создаем экземпляр графического элемента Parabolic SAR
            _chartParabolicElement = new ChartIndicatorElement
                {
                    Title = "Parabolic",
                    Color = Colors.Aqua,
                    Indicator = _parabolic
                };
            //Добавляем графический элемент в коллекцию области
            _chartArea.Elements.Add(_chartParabolicElement);
        }
    }
}



Thanks:


IvanB

Avatar
Date: 4/24/2013
Reply


UsilaDobry: Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор Fractals, у меня было две ошибки исполнения. Я удалил весь код, связанный с Fractals и опять запустил вот этот код. Выпадает Exception в строке var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security); "Заданный аргумент находится вне диапазона допустимых значений."

Значение timeframe указано?

Thanks:

UsilaDobry

Avatar
Date: 4/24/2013
Reply


Значение timeframe указано.

Thanks:

IvanB

Avatar
Date: 4/25/2013
Reply


UsilaDobry: Значение timeframe указано.

Пришлите проект на почту.

Thanks:

IvanB

Avatar
Date: 4/25/2013
Reply


UsilaDobry: Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор Fractals, у меня было две ошибки исполнения. Я удалил весь код, связанный с Fractals и опять запустил вот этот код. Выпадает Exception в строке var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security); "Заданный аргумент находится вне диапазона допустимых значений."

using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows; using System.Windows.Media; using Ecng.Xaml; using StockSharp.Algo.Candles; using StockSharp.Algo.Indicators; using StockSharp.Algo.Indicators.Trend; using StockSharp.Quik; using StockSharp.TraderConnection; using StockSharp.Xaml;

namespace MARKET_SUCCESS { /// <summary> /// Логика взаимодействия для MainWindow.xaml /// </summary> public partial class MainWindow { private CandleManager _candleManager; //Менеджер свечей private CandleSeries _candleSeries; //Серия свечей

    private ChartArea _chartArea;                               //Область на графике

    private ChartCandleElement _chartCandleElement;             //Графический элемент свечи
    private ChartIndicatorElement _chartBollingerElement;       //Графический элемент Bollinger
    private ChartIndicatorElement _chartParabolicElement;       //Графический элемент Parabolic SAR
    private ChartIndicatorValue _chartBollingerValue;           //графическое значение Bollinger
    private ChartIndicatorValue _chartParabolicValue;           //Графическое значение Parabolic SAR
    private BollingerBands _bollinger;                          //Индикатор Bollinger Bands
    private ParabolicSar _parabolic;                            //Индикатор Parabolic SAR

    public MainWindow()
    {
        InitializeComponent();

        //Указываем конкретный вариант коннектора в обертку
        ConnectionInterface.SafeConnection = new SafeConnection(new QuikTrader(QuikTerminal.GetDefaultPath()));

    }
    private void ChartButton_Click(object sender, RoutedEventArgs e)
    {
        //Проверяем, чтобы значение тайм-фрейма было указано
        if (TpTimeFrame.Value == null)
        {
            Debug.Print("Value from tpTimeFrame is null");
            return;
        }

        InitChart();
        //Создаем экземпляр графического элемента свечи
        _chartCandleElement = new ChartCandleElement();
        //Добавляем графический элемент свечи в коллекцию
        _chartArea.Elements.Add(_chartCandleElement);

        //Инициализируем индикаторы
        InitIndicators();

        //Получаем тайм-фрейм
        var timeFrame = TpTimeFrame.Value.Value.TimeOfDay;

        //Инициируем процесс получения свечей и дальнейшей отрисовки
        RunProcessGetCandles(timeFrame);

        //Инициализируем стратегию
        //InitStrategy();
    }

    /// <summary>
    /// Метод инициирования среды для получения свечей и дальнейшей отрисовки
    /// </summary>
    /// <param name="timeFrame">Тайм-фрейм для свечей</param>
    private void RunProcessGetCandles(TimeSpan timeFrame)
    {
        //Создаем менеджер свечей
        _candleManager = new CandleManager(ConnectionInterface.SafeConnection.Trader);

        //Получаем торговый инструмент
        var security = ConnectionInterface.SelectedSecurity;

        //Создаем серию свечей
        _candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);

        //Подписываемся на событие обработки свечи
        _candleSeries.ProcessCandle += Draw;

        //Запускаем получение свечей
        _candleManager.Start(_candleSeries);
    }

    /// <summary>
    /// Метод запускает отрисовку по указанной свече
    /// </summary>
    /// <param name="candle">Экземпляр свечи</param>
    private void Draw(Candle candle)
    {
        //Временные рамки свечи
        var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security);

        //Получаем значение Bollinger по данной свече
        var valueBb = _bollinger.Process(candle);
        //Создаем экземпляр значения Bollinger для непосредственного вывода на график
        _chartBollingerValue = new ChartIndicatorValue(_bollinger, valueBb);
        //Получаем значение Parabolic SAR по данной свечке
        var valueSar = _parabolic.Process(candle);
        //Создаем экземпляр значение Paraboli SAR для вывода на график  
        _chartParabolicValue = new ChartIndicatorValue(_parabolic, valueSar);

        //Работаем только с завершенными свечами и одной последней свечей с произвольным состоянием
        if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounds.Min)
        {
            //Выводим значения на график
            this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                {
                    {_chartCandleElement, candle},                         //для свечи
                    {_chartBollingerElement, _chartBollingerValue},        //для Bollinger Bands 
                    {_chartParabolicElement, _chartParabolicValue}        //для Parabolic SAR_
                }));
        }
    }

    /// <summary>
    /// Метод инициализации графика
    /// </summary>
    private void InitChart()
    {
        //Включить авто-прокрутку
        Chart.IsAutoScroll = true;

        //Создаем экземпляр области
        _chartArea = new ChartArea();
        //Добавляем экземпляр области в коллекцию визуального контрола графика
        Chart.Areas.Add(_chartArea);

    }

    /// <summary>
    /// Метод инициализации индикаторов
    /// </summary>
    private void InitIndicators()
    {
         //Создаем экземпляр Bollinger Bands 
         _bollinger = new BollingerBands
             {
                 Length = 20,
                 Width = 2
             };

         //Создаем экземпляр графического элемента Bollinger
         _chartBollingerElement = new ChartIndicatorElement
             {
                 Title = "Bollinger",
                 Color = Colors.Blue,
                 Indicator = _bollinger
             };
         //Добавляем графический элемент индикатора в коллекцию области
         _chartArea.Elements.Add(_chartBollingerElement);

         //Создаем экземпляр Parabolic SAR
        _parabolic = new ParabolicSar
            {
                AccelerationMax = (decimal) 0.02,
                AccelerationStep = (decimal) 0.2
            };
        //Создаем экземпляр графического элемента Parabolic SAR
        _chartParabolicElement = new ChartIndicatorElement
            {
                Title = "Parabolic",
                Color = Colors.Aqua,
                Indicator = _parabolic
            };
        //Добавляем графический элемент в коллекцию области
        _chartArea.Elements.Add(_chartParabolicElement);
    }
}

}

> 
:::
Свечи графики не отрисовываются по тому, что контрол SciChart не успевает загрузиться до того как мы начинаем его инициализацию, поэтому предлагаю перенести инициализацию графика в обработчик нажатия на кнопку:
:::spoiler

```csharp
        private void MarketSuccessWindow_Loaded(object sender, RoutedEventArgs e)
        {
            
        }

        private void ChartButton_Click(object sender, RoutedEventArgs e)
        {
            //Проверяем, чтобы значение тайм-фрейма было указано
            if (TpTimeFrame.Value == null)
            {
                Debug.Print("Value from tpTimeFrame is null");
                return;
            }

            InitChart();

            //Создаем экземпляр графического элемента свечи
            _chartCandleElement = new ChartCandleElement();
            //Добавляем графический элемент свечи в коллекцию
            _chartArea.Elements.Add(_chartCandleElement);
            ...
Thanks:


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

loading
clippy