Moadip
|
Date: 5/2/2013
UsilaDobry Похоже библиотечный индикатор считает как то не так...Цена не может зашкаливать индикатор. Это похоже на некорректный вывод на график значений индикатора, потому что каждый раз на графике появляется изображение индикатора в новом исполнении.
Я проверил значения индикатора на графике Quik, индикатор считает корректно, это SciChart выводит значения индикатора некорректно. На работу стратегии это не влияет, но визуально вводит в заблуждение. Сигналы стратегии лучше смотреть на графике Quik.
Возможно ли как-то это исправить? О каком индикаторе вообще идет речь? На картинке какие то линии без опознавательных знаков. Quote:Я проверил значения индикатора на графике Quik, индикатор считает корректно, это SciChart выводит значения индикатора некорректно. Т.е. все таки индикатор рассчитывается верно, но проблема с выводом на график? Тогда могу предположить что вы что то не так делаете, т.к. SciChart отрисовывает то, что ему передается.
|
|
Thanks:
|
|
|
|
|
UsilaDobry
|
Date: 5/2/2013
|
|
|
|
Moadip О каком индикаторе вообще идет речь? На картинке какие то линии без опознавательных знаков.
Речь идет об индикаторе Parabolic SAR, на картинке он светло-голубого цвета. Каждый раз после запуска вывода на графике новая версия изображения, на картинке видно, как цена зашкаливает индикатор, а он не переключается, при этом значения индикатора подтверждают график в Квике, полное совпадение с графиком индикатора в Квике. И еще, на графике явное смещение значения индикатора. Текущее значение индикатора с индексом [0] соответствует на графике свечке с индексом [2]. Quote: Т.е. все таки индикатор рассчитывается верно, но проблема с выводом на график? Тогда могу предположить что вы что то не так делаете, т.к. SciChart отрисовывает то, что ему передается.
Вывод индикатора на график делаю четко по изложенному материалу в в видео-уроке. 1. инициализация Code
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);
}
2. получение значения индикатора Code
if (_parabolic != null)
{
var valueSar = _parabolic.Process(candle);
_chartParabolicValue = new ChartIndicatorValue(_parabolic, valueSar);
}
3. вывод на график Code
if (_chartParabolicElement != null && _chartParabolicValue != null)
{
this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{_chartParabolicElement, _chartParabolicValue} //для Parabolic SAR_
}));
Что касается SciChart. Не я первый здесь об этом пишу. У меня например заявки в виде стрелок выводятся на экран, а потом убегают в левый край экрана...Об этом уже здесь писалось... Индикатор Bolliger тоже может нарисовать абсолютно прямым
|
|
Thanks:
|
|
|
|
|
Moadip
|
Date: 5/2/2013
|
|
|
|
xaml:Code
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xaml="clr-namespace:StockSharp.Xaml;assembly=StockSharp.Xaml"
Title="MainWindow" Height="408" Width="683">
<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>
</Window>
cs:Code
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;
}
}
}
|
|
|
|
|
UsilaDobry
|
Date: 5/4/2013
|
|
|
|
Я сделал вывод на график по Вашему примеру, у меня не показывается легенда ни по индикатору, ни по свечам, и автопрокрутка не работает... Code
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
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
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());
}
}
}
}
А меняю таймфрейм, так он вообще всё одной полосой выводит...похоже масштабирование глючит...
|
|
Thanks:
|
|
|
|
|
Moadip
|
Date: 5/4/2013
Quote:у меня не показывается легенда ни по индикатору, ни по свечам Может потому что их надо вкючить? Code
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;
}
Quote:А меняю таймфрейм, так он вообще всё одной полосой выводит...похоже масштабирование глючит... Слева же видно что есть несколько точек по 0 цене, поэтому и перемасштабировано, чтобы все показать. Достаточно график прокрутить, чтобы не захватывались эти точки. P.S.: Скриншоты не стоит запихивать в doc.
|
|
|
|
|
UsilaDobry
|
Date: 5/4/2013
Moadip P.S.: Скриншоты не стоит запихивать в doc.
[biggrin] Согласен, но у меня под рукой нет программы, чтобы сохранить в графическом формате... Вот и впихиваю, благо, что впихуемое...[biggrin]
|
|
Thanks:
|
|
|
|
|
VassilSanych
|
Date: 5/4/2013
У всех есть эта программа. Paint называется. Замечательно сохраняет в PNG.
|
|
Thanks:
|
|
|
|
|
UsilaDobry
|
Date: 5/4/2013
VassilSanych У всех есть эта программа. Paint называется. Замечательно сохраняет в PNG. Благодарю, век живи - век учись...
|
|
Thanks:
|
|
|
|
|
alex123456
|
Date: 7/22/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
<SX:Chart x:Name="_chart" IsIndexed ="False"/>
- ряды не индексированы. Сейчас это не помогает. Мне думается проблема ещё со StockSharp.Xaml(см прилагаемые файлы). Прошу помощи?
|
|
Thanks:
|
|
|
|
|
alex123456
|
Date: 8/3/2013
проблема решена
|
|
Thanks:
|
|
|
|