Индикатор Fractal на графике (ошибка)~/topic/3624/indikator-fractal-na-grafike-(oshibka)/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-28T23:47:50Zhttps://stocksharp.com/images/logo.pnghttps://stocksharp.com/posts/m/25586/Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор F...2013-04-24T16:19:42Z2013-06-23T15:53:22ZUsilaDobryhttps://stocksharp.com/users/28825/info@stocksharp.comДнем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор Fractals, у меня было две ошибки исполнения. Я удалил весь код, связанный с Fractals и опять запустил вот этот код. Выпадает Exception в строке<br />var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security);<br />"Заданный аргумент находится вне диапазона допустимых значений."<br /><div class='spoilertitle'><input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_caae0c09adaf4946b6f9a6dc8aa19972');" title='Show spoiler' /></div><div class='spoilerbox' id='spolier_caae0c09adaf4946b6f9a6dc8aa19972' style='display:none'><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
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);
}
}
}</pre>
</div></div><br /></div>Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/25604/Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор F...2013-04-25T06:37:40Z2013-04-25T06:38:14ZIvanBhttps://stocksharp.com/users/26984/info@stocksharp.com<div class="quote"><span class="quotetitle">UsilaDobry <a href="https://stocksharp.com/posts/m/25586/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор Fractals, у меня было две ошибки исполнения. Я удалил весь код, связанный с Fractals и опять запустил вот этот код. Выпадает Exception в строке<br />var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security);<br />"Заданный аргумент находится вне диапазона допустимых значений."<br /><div class='spoilertitle'><input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_87f885d89be043c6ac66568c74afbb64');" title='Show spoiler' /></div><div class='spoilerbox' id='spolier_87f885d89be043c6ac66568c74afbb64' style='display:none'><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
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);
}
}
}</pre>
</div></div><br /></div></div></div><br />Свечи графики не отрисовываются по тому, что контрол SciChart не успевает загрузиться до того как мы начинаем его инициализацию, поэтому предлагаю перенести инициализацию графика в обработчик нажатия на кнопку:<br /><div class='spoilertitle'><input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_6c852a324f32431a96badcdfd1dbf65a');" title='Show spoiler' /></div><div class='spoilerbox' id='spolier_6c852a324f32431a96badcdfd1dbf65a' style='display:none'><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush: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);
...</pre>
</div></div></div>Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/25599/Значение timeframe указано. Пришлите проект на почту.2013-04-25T03:12:06Z2013-04-25T03:12:06ZIvanBhttps://stocksharp.com/users/26984/info@stocksharp.com<div class="quote"><span class="quotetitle">UsilaDobry <a href="https://stocksharp.com/posts/m/25590/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">Значение timeframe указано.</div></div><br /><br />Пришлите проект на почту.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/25590/Значение timeframe указано.2013-04-24T17:57:57Z2013-04-24T17:57:57ZUsilaDobryhttps://stocksharp.com/users/28825/info@stocksharp.comЗначение timeframe указано.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/25589/Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор F...2013-04-24T17:49:07Z2013-04-24T17:49:07ZIvanBhttps://stocksharp.com/users/26984/info@stocksharp.com<div class="quote"><span class="quotetitle">UsilaDobry <a href="https://stocksharp.com/posts/m/25586/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">Днем данный код работал, все было нормально. Потом я пробовал добавить на вывод в график индикатор Fractals, у меня было две ошибки исполнения. Я удалил весь код, связанный с Fractals и опять запустил вот этот код. Выпадает Exception в строке<br />var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(_candleSeries.Security);<br />"Заданный аргумент находится вне диапазона допустимых значений."<br /></div></div><br /><br />Значение timeframe указано?Copyright @ StockSharp Platform LLC 2010 - 2024