Do not display the changes within the time period in candlestick chart!
How to solve this problem?
"Line" series works well. Displays parameter changes "ClosePrice"
The data source is the same for both series of data (CandleStick and Line)!
Link to source: https://www.dropbox.com/s/ue1n4h2rsxo2mi6/CandleStickSeriesNotWork.VS2015.zip?dl=0
<Window x:Class=
"CandleStickSeriesNotWork.MainWindow"
xmlns:telerik=
"http://schemas.telerik.com/2008/xaml/presentation"
Title=
"MainWindow"
Height=
"350"
Width=
"525"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height=
"*"
/>
<RowDefinition Height=
"70"
/>
</Grid.RowDefinitions>
<telerik:RadCartesianChart x:Name=
"radCartesianChart"
Grid.Column=
"0"
>
<telerik:RadCartesianChart.Grid>
<telerik:CartesianChartGrid MajorLinesVisibility=
"Y"
/>
</telerik:RadCartesianChart.Grid>
<telerik:RadCartesianChart.Behaviors>
<telerik:ChartCrosshairBehavior/>
<telerik:ChartPanAndZoomBehavior DragToZoomThreshold=
"0"
MouseWheelMode=
"Zoom"
DragMode=
"Pan"
ZoomMode=
"Both"
PanMode=
"Both"
/>
</telerik:RadCartesianChart.Behaviors>
<telerik:RadCartesianChart.HorizontalAxis>
<telerik:DateTimeContinuousAxis x:Name=
"AxisX"
IsStepRecalculationOnZoomEnabled=
"True"
LabelOffset=
"0"
LastLabelVisibility=
"Visible"
LineThickness=
"1"
MaximumTicks=
"31"
MajorTickOffset=
"0"
MajorTickLength=
"5"
PlotMode=
"BetweenTicks"
SmartLabelsMode=
"None"
TickThickness=
"1"
ZIndex=
"0"
/>
</telerik:RadCartesianChart.HorizontalAxis>
<telerik:RadCartesianChart.VerticalAxis>
<telerik:LinearAxis x:Name=
"AxisY"
MajorStep=
"1"
LineThickness=
"1"
SmartLabelsMode=
"SmartStepAndRange"
/>
</telerik:RadCartesianChart.VerticalAxis>
<telerik:CandlestickSeries x:Name=
"CandleSeries"
CategoryBinding=
"OpenTime"
CloseBinding=
"ClosePrice"
HighBinding=
"HighPrice"
LowBinding=
"LowPrice"
OpenBinding=
"OpenPrice"
ItemsSource=
"{Binding CandlesSeries}"
/>
<telerik:LineSeries ItemsSource=
"{Binding CandlesSeries}"
CategoryBinding=
"OpenTime"
ValueBinding=
"ClosePrice"
/>
</telerik:RadCartesianChart>
<TextBlock Grid.Row=
"1"
>
<Span FontWeight=
"Bold"
Foreground=
"Red"
>
Do not display the changes within the time period
in
candlestick chart! <LineBreak/>
How to solve
this
problem? <LineBreak/>
"Line"
series works well. Displays parameter changes
"ClosePrice"
<LineBreak/>
The data source
is
the same
for
both series of data (CandleStick and Line)!
</Span>
</TextBlock>
</Grid>
</Window>
using
System;
using
System.Collections.Generic;
using
System.Collections.ObjectModel;
using
System.Linq;
using
System.Text;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Data;
using
System.Windows.Documents;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Imaging;
using
System.Windows.Navigation;
using
System.Windows.Shapes;
using
System.Windows.Threading;
using
CandleStickSeriesNotWork.Data;
using
Telerik.Windows.Controls.ChartView;
using
Telerik.Windows.Data;
namespace
CandleStickSeriesNotWork
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public
partial
class
MainWindow : Window
{
private
DispatcherTimer timer;
private
Random r;
private
ViewModel dc;
public
MainWindow()
{
InitializeComponent();
dc =
new
ViewModel();
this
.DataContext = dc;
timer =
new
DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Tick += (sender, args) =>
{
DateTime date = DateTime.Now.AddSeconds(-DateTime.Now.Second);
Random k =
new
Random();
decimal
price = dc.CandlesSeries.Last().ClosePrice;
price = k.Next() % 2 == 0 ? price += 5 : price -= 5;
if
(dc.CandlesSeries.Last().OpenTime.AddMinutes(1) < date)
{
dc.CandlesSeries.Add(
new
Candle(date, price, price, price, price));
}
else
{
var candle = dc.CandlesSeries.Last();
candle.ClosePrice = price;
if
(price > candle.HighPrice) candle.HighPrice = price;
if
(price < candle.LowPrice) candle.LowPrice = price;
}
};
DateTime date1 = DateTime.Now.AddSeconds(-DateTime.Now.Second).AddMinutes(-1);
r =
new
Random();
decimal
price1 = r.Next(200);
dc.CandlesSeries.Add(
new
Candle(date1, price1, price1+100, price1-100, price1+50));
timer.Start();
}
}
}
using
System.Collections.ObjectModel;
using
CandleStickSeriesNotWork.Data;
using
Telerik.Windows.Data;
namespace
CandleStickSeriesNotWork
{
public
class
ViewModel
{
public
ObservableCollection<Candle> CandlesSeries {
get
;
set
; }
public
ViewModel ()
{
CandlesSeries =
new
ObservableCollection<Candle>();
}
}
}
using
System;
using
System.ComponentModel;
namespace
CandleStickSeriesNotWork.Data
{
public
class
Candle : INotifyPropertyChanged
{
DateTime _openTime;
decimal
_highPrice;
decimal
_lowPrice;
decimal
_openPrice;
decimal
_closePrice;
private
int
? _numberCandle;
public
Candle(DateTime opentime,
decimal
open,
decimal
high,
decimal
low,
decimal
close)
{
_openTime = opentime;
_openPrice = open;
_highPrice = high;
_lowPrice = low;
_closePrice = close;
}
public
Candle() { }
public
DateTime OpenTime
{
get
{
return
_openTime; }
set
{
if
(!Equals(_openTime, value))
{
_openTime = value;
OnPropertyChanged(
"OpenTime"
);
}
}
}
public
decimal
HighPrice
{
get
{
return
_highPrice; }
set
{
if
(!Equals(_highPrice, value))
{
_highPrice = value;
OnPropertyChanged(
"HighPrice"
);
}
}
}
public
decimal
LowPrice
{
get
{
return
_lowPrice; }
set
{
if
(!Equals(_lowPrice, value))
{
_lowPrice = value;
OnPropertyChanged(
"LowPrice"
);
}
}
}
public
decimal
OpenPrice
{
get
{
return
_openPrice; }
set
{
if
(!Equals(_openPrice, value))
{
_openPrice = value;
OnPropertyChanged(
"OpenPrice"
);
}
}
}
public
decimal
ClosePrice
{
get
{
return
_closePrice; }
set
{
if
(!Equals(_closePrice, value))
{
_closePrice = value;
OnPropertyChanged(
"ClosePrice"
);
}
}
}
public
event
PropertyChangedEventHandler PropertyChanged;
protected
virtual
void
OnPropertyChanged(
string
propertyName)
{
PropertyChanged?.Invoke(
this
,
new
PropertyChangedEventArgs(propertyName));
}
}
}