Moadip
|
Дата: 02.05.2013
[quote=UsilaDobry;25682]Похоже библиотечный индикатор считает как то не так...Цена не может зашкаливать индикатор.
Это похоже на некорректный вывод на график значений индикатора, потому что каждый раз на графике появляется изображение индикатора в новом исполнении.
Я проверил значения индикатора на графике Quik, индикатор считает корректно, это SciChart выводит значения индикатора некорректно. На работу стратегии это не влияет, но визуально вводит в заблуждение. Сигналы стратегии лучше смотреть на графике Quik.
Возможно ли как-то это исправить?[/quote]
О каком индикаторе вообще идет речь? На картинке какие то линии без опознавательных знаков.
[quote]Я проверил значения индикатора на графике Quik, индикатор считает корректно, это SciChart выводит значения индикатора некорректно.[/quote]
Т.е. все таки индикатор рассчитывается верно, но проблема с выводом на график?
Тогда могу предположить что вы что то не так делаете, т.к. SciChart отрисовывает то, что ему передается.
|
|
|
|
Спасибо:
|
|
|
|
|
|
UsilaDobry
|
Дата: 02.05.2013
|
|
|
|
|
[quote=Moadip;25733]
О каком индикаторе вообще идет речь? На картинке какие то линии без опознавательных знаков.[/quote]
Речь идет об индикаторе Parabolic SAR, на картинке он светло-голубого цвета. Каждый раз после запуска вывода на графике новая версия изображения, на картинке видно, как цена зашкаливает индикатор, а он не переключается, при этом значения индикатора подтверждают график в Квике, полное совпадение с графиком индикатора в Квике.
И еще, на графике явное смещение значения индикатора. Текущее значение индикатора с индексом [0] соответствует на графике свечке с индексом [2].
[quote]
Т.е. все таки индикатор рассчитывается верно, но проблема с выводом на график?
Тогда могу предположить что вы что то не так делаете, т.к. SciChart отрисовывает то, что ему передается.[/quote]
Вывод индикатора на график делаю четко по изложенному материалу в в видео-уроке.
- инициализация
[code=csharp]if (SarCheckBox.IsChecked == true)
{
_parabolic = new ParabolicSar
{
AccelerationStep = decimal.Parse(FactorSarTextBox.Text),
AccelerationMax = decimal.Parse(MaximumSarTextBox.Text)
};
_chartParabolicElement = new ChartIndicatorElement
{
Title = "Parabolic",
Color = Colors.Aqua,
Indicator = _parabolic
};
_chartArea.Elements.Add(_chartParabolicElement);
}[/code]
- получение значения индикатора
[code=csharp]if (_parabolic != null)
{
var valueSar = _parabolic.Process(candle);
_chartParabolicValue = new ChartIndicatorValue(_parabolic, valueSar);
}[/code]
- вывод на график
[code=csharp]if (_chartParabolicElement != null && _chartParabolicValue != null)
{
this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{_chartParabolicElement, chartParabolicValue} //для Parabolic SAR
}));[/code]
Что касается SciChart. Не я первый здесь об этом пишу. У меня например заявки в виде стрелок выводятся на экран, а потом убегают в левый край экрана...Об этом уже здесь писалось... Индикатор Bolliger тоже может нарисовать абсолютно прямым
|
|
|
|
Спасибо:
|
|
|
|
|
|
Moadip
|
Дата: 02.05.2013
|
|
|
|
|
[URL=http://fastpic.ru/view/48/2013/0502/c360bd341ef679cb70a984794acc14e7.png.html][IMG]http://i48.fastpic.ru/thumb/2013/0502/e7/c360bd341ef679cb70a984794acc14e7.jpeg[/IMG][/URL]
[URL=http://fastpic.ru/view/46/2013/0502/5a5e308a4871e79bc60448416baf95cf.png.html][IMG]http://i46.fastpic.ru/thumb/2013/0502/cf/5a5e308a4871e79bc60448416baf95cf.jpeg[/IMG][/URL]
[b]xaml:[/b]
[SPOILER]
[code=csharp]
<DockPanel LastChildFill="True">
<StackPanel Orientation="Horizontal" Height="23" DockPanel.Dock="Top">
<Button Content="Connect" Name="btnConnect" Width="100" Click="btnConnect_Click" />
<Button Content="Draw Candle" Name="btnDraw" Width="100" Click="btnDraw_Click" />
<ToggleButton Content="CrossHair" Name="btnCrossHair" Width="100" Click="btnCrossHair_Click" />
<ToggleButton Content="ToolTip" Name="btnToolTip" Width="100" Click="btnToolTip_Click" />
</StackPanel>
<xaml:SciChart x:Name="Chart"/>
</DockPanel>
[/code]
[/SPOILER]
[b]cs:[/b]
[SPOILER]
[code=csharp]
namespace Test
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
using Ecng.Common;
using Ecng.Xaml;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Xaml;
public partial class MainWindow
{
private QuikTrader _trader;
private CandleManager _candleManager;
private Security _security;
private const string _securityCode = "RIM3";
private const string _path = @"E:\Program Files\QUIK\";
private readonly ChartCandleElement _chartCandleElement;
private readonly ChartIndicatorElement _chartIndicatorElement;
public MainWindow()
{
InitializeComponent();
var area = new ChartArea();
Chart.ChartTheme = "ExpressionDark";
_chartCandleElement = new ChartCandleElement()
{
Antialiasinig = false,
UpBodyColor = Colors.White,
UpWickColor = Colors.Black,
DownBodyColor = Colors.Black,
DownWickColor = Colors.Black,
};
_chartIndicatorElement = new ChartIndicatorElement
{
Antialiasinig = false,
Color = Colors.DarkBlue,
IsLegend = true,
Indicator = new ParabolicSar(),
Title = "Parabolic Sar",
DrawStyle = ChartIndicatorDrawStyles.Dot,
};
_chartIndicatorElement.DrawTemplate.VisualTree.SetValue(Shape.FillProperty, new SolidColorBrush(Colors.DarkBlue));
area.Elements.Add(_chartCandleElement);
area.Elements.Add(_chartIndicatorElement);
Chart.Areas.Add(area);
Chart.IsAutoScroll = true;
}
protected override void OnClosing(CancelEventArgs e)
{
if (_trader != null)
{
_trader.StopExport();
_trader.Disconnect();
}
base.OnClosing(e);
}
private void btnConnect_Click(object sender, RoutedEventArgs e)
{
_trader = new QuikTrader(_path);
_candleManager = new CandleManager(_trader);
_trader.NewSecurities += securities =>
{
if (_security.IsNull())
_security = securities.FirstOrDefault(sec => sec.Code == _securityCode);
};
_trader.Connected += () => _trader.StartExport();
_trader.Connect();
}
private void btnDraw_Click(object sender, RoutedEventArgs e)
{
_candleManager.Processing += ProcessCandle;
var series = new CandleSeries(typeof(TimeFrameCandle), _security, TimeSpan.FromMinutes(1));
_candleManager.Start(series);
}
private void ProcessCandle(CandleSeries series, Candle candle)
{
if (candle.State == CandleStates.Finished)
{
var value = _chartIndicatorElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{_chartCandleElement, candle},
{_chartIndicatorElement, new ChartIndicatorValue(_chartIndicatorElement.Indicator, value)}
}));
}
else
{
this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
}
}
private void btnCrossHair_Click(object sender, RoutedEventArgs e)
{
if (btnCrossHair.IsChecked.HasValue && btnCrossHair.IsChecked.Value)
Chart.CrossHair = true;
else
Chart.CrossHair = false;
}
private void btnToolTip_Click(object sender, RoutedEventArgs e)
{
if (btnToolTip.IsChecked.HasValue && btnToolTip.IsChecked.Value)
Chart.CrossHairTooltip = true;
else
Chart.CrossHairTooltip = false;
}
}
}
[/code]
[/SPOILER]
|
|
|
|
|
|
|
UsilaDobry
|
Дата: 04.05.2013
|
|
|
|
|
Я сделал вывод на график по Вашему примеру, у меня не показывается легенда ни по индикатору, ни по свечам, и автопрокрутка не работает...
[SPOILER][code=csharp]using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
using Ecng.Collections;
using Ecng.Xaml;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Logging;
using StockSharp.Quik;
using StockSharp.TraderConnection;
using StockSharp.Xaml;
namespace MARKET_SUCCESS
{
///
/// Логика взаимодействия для MainWindow.xaml
///
public partial class MainWindow
{
private CandleManager _candleManager; //Менеджер свечей
private readonly ChartCandleElement _chartCandleElement; //Графический элемент свечи
private readonly ChartIndicatorElement _chartParabolicElement; //Графический элемент Parabolic SAR
public MainWindow()
{
try
{
InitializeComponent();
ConnectionInterface.SafeConnection = new SafeConnection(new QuikTrader(QuikTerminal.GetDefaultPath()));
ConnectionInterface.SafeConnection.NewException += exc => this.GuiAsync(() => MessageBox.Show(exc.ToString()));
_logManager.Listeners.Add(new GuiLogListener(MonitorControl));
_logManager.Listeners.Add(new FileLogListener("log.txt"));
_logManager.Sources.Add(ConnectionInterface.SafeConnection.Trader);
var area = new ChartArea();
Chart.ChartTheme = "ExpressionDark";
_chartCandleElement = new ChartCandleElement
{
Antialiasinig = false,
UpBodyColor = Colors.Chartreuse,
UpWickColor = Colors.Chartreuse,
DownBodyColor = Colors.Red,
DownWickColor = Colors.Red,
IsLegend = true,
};
_chartParabolicElement = new ChartIndicatorElement
{
Antialiasinig = false,
Color = Colors.Turquoise,
IsLegend = true,
Indicator = new ParabolicSar(),
Title = "Parabolic Sar",
DrawStyle = ChartIndicatorDrawStyles.Dot,
};
_chartParabolicElement.DrawTemplate.VisualTree.SetValue(Shape.FillProperty, new SolidColorBrush(Colors.Turquoise));
area.Elements.Add(_chartCandleElement);
area.Elements.Add(_chartParabolicElement);
Chart.Areas.Add(area);
Chart.IsAutoScroll = true;
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private readonly LogManager _logManager = new LogManager();
private void ChartButton_Click(object sender, RoutedEventArgs e)
{
//Проверяем, чтобы значение тайм-фрейма было указано
if (TpTimeFrame.Value == null)
{
MessageBox.Show("Введите значение таймфрейм");
return;
}
//Получаем тайм-фрейм
var timeFrame = TpTimeFrame.Value.Value.TimeOfDay;
//Инициируем процесс получения свечей и дальнейшей отрисовки
RunProcessGetCandles(timeFrame);
}
/// <summary>
/// Метод инициирования среды для получения свечей и дальнейшей отрисовки
/// </summary>
/// <param name="timeFrame">Тайм-фрейм для свечей</param>
private void RunProcessGetCandles(TimeSpan timeFrame)
{
//Создаем менеджер свечей
_candleManager = new CandleManager(ConnectionInterface.SafeConnection.Trader);
//Получаем торговый инструмент
var security = ConnectionInterface.SelectedSecurity;
//Создаем серию свечей
var series = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);
//_candleSeries.WorkingTime.Times[0].Min = TimeSpan.FromHours(0);
//_candleSeries.WorkingTime.Times[0].Max = TimeSpan.FromHours(24);
//Подписываемся на событие обработки свечи
_candleManager.Processing += ProcessCandle;
//Запускаем получение свечей
_candleManager.Start(series);
}
private void ProcessCandle(CandleSeries series, Candle candle)
{
try
{
if (candle.State == CandleStates.Finished)
{
var value = _chartParabolicElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{_chartCandleElement, candle},
{_chartParabolicElement, new ChartIndicatorValue(_chartParabolicElement.Indicator, value)}
}));
}
else
{
this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
}
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
}
}[/code][/SPOILER]
А меняю таймфрейм, так он вообще всё одной полосой выводит...похоже масштабирование глючит...
|
|
|
|
Спасибо:
|
|
|
|
|
|
Moadip
|
Дата: 04.05.2013
[quote]у меня не показывается легенда ни по индикатору, ни по свечам[/quote]
Может потому что их надо вкючить?
[code=csharp]
private void btnCrossHair_Click(object sender, RoutedEventArgs e)
{
if (btnCrossHair.IsChecked.HasValue && btnCrossHair.IsChecked.Value)
Chart.CrossHair = true;
else
Chart.CrossHair = false;
}
private void btnToolTip_Click(object sender, RoutedEventArgs e)
{
if (btnToolTip.IsChecked.HasValue && btnToolTip.IsChecked.Value)
Chart.CrossHairTooltip = true;
else
Chart.CrossHairTooltip = false;
}
[/code]
[quote]А меняю таймфрейм, так он вообще всё одной полосой выводит...похоже масштабирование глючит... [/quote]
Слева же видно что есть несколько точек по 0 цене, поэтому и перемасштабировано, чтобы все показать. Достаточно график прокрутить, чтобы не захватывались эти точки.
P.S.: Скриншоты не стоит запихивать в doc.
|
|
|
|
|
|
|
UsilaDobry
|
Дата: 04.05.2013
[quote=Moadip;25804]
P.S.: Скриншоты не стоит запихивать в doc.[/quote]
[biggrin] Согласен, но у меня под рукой нет программы, чтобы сохранить в графическом формате... Вот и впихиваю, благо, что впихуемое...[biggrin]
|
|
|
|
Спасибо:
|
|
|
|
|
|
VassilSanych
|
Дата: 04.05.2013
У всех есть эта программа. Paint называется.
Замечательно сохраняет в PNG.
|
|
|
|
Спасибо:
|
|
|
|
|
|
UsilaDobry
|
Дата: 04.05.2013
[quote=VassilSanych;25807]У всех есть эта программа. Paint называется.
Замечательно сохраняет в PNG.[/quote]
Благодарю, век живи - век учись...
|
|
|
|
Спасибо:
|
|
|
|
|
|
alex123456
|
Дата: 22.07.2013
Не рисуется ни один индикатор в версии сборки 4.1.15(пробовал также 4.1.14, 4.1.13, 4.1.11). Свечной график рисуется нормально, как с промежутками(пустые места), так и без них. А вот индикаторы не рисуются как в самой области свечного графика(Are1), так и в отдельной области(Area2), как с пустыми местами (NoGapMode="False") так и без них (NoGapMode="true"), как со связаной областью(IsAligned = true), так и раздельной областью (IsAligned = false). Хотя в версии сборки 4.1.4 все строилось отлично, но MsChart был недостаток не было подсказок по свече(легенды), сейчас есть и легенда и подсказки по осям, но теперь не добавляется индикатор (Объём, Простая скользящая средняя и т.д.)
В версии сборки 4.1.4 ошибка ArgumentNullException решалась через добавление кода [code=xml]<SX:Chart x:Name="_chart" IsIndexed ="False"/>[/code] - ряды не индексированы. Сейчас это не помогает. Мне думается проблема ещё со StockSharp.Xaml(см прилагаемые файлы). Прошу помощи?
|
|
|
|
Спасибо:
|
|
|
|
|
|
alex123456
|
Дата: 03.08.2013
|
|
|
|
Спасибо:
|
|
|
|
|