Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор 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);
}
}
}
Kommentare (4)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Значение timeframe указано?
Значение timeframe указано.
Пришлите проект на почту.
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; //Серия свечей
}