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