I don't suppose I've created any stock market charts before, have I? Well why not do that today? Here is a sneak peek of what we are planning to design today.
The Demo
Gif 1: StockMarket charts app
The Agenda
Before we go further down the road, let me lay down the learnings for you.
- How to use models in different charts?
- How to use Telerik components to create Candlestick, OHLC (Open-High-Low-Close) charts, & Telerik Switch control?
- How to use an inline ternary operator in blazor?
- Use of basic bootstrap classes.
- How to deserialize a json object into a list of objects then bind it to controls?
Alright once we got an agenda. Let's understand the different types of files that we need.
What do we need?
- The Json file, This file contains the trading data for Apple
- Model class, to store stock details
- Razor component, which will host Telerik controls
What are we doing?
First deserialize the Json data into a list of objects then bind the list to the razor component. That's all folks, it is that simple.
The API source, Yahooooooo finance!!!
Visit AAPL data, to find historic data that we need, you can work with CSV or JSON, depends on your taste. You can also use their APIs and get real time data, but it ain't cheap, it comes with price, I mean talk about inflation, right?
But let me help you to get API link to fetch real time stock market data: yahoo finance, Refer following image 1 to get an idea of their price model.
Image 1: Yahoo finance API price model
Now that we have got that out of the way. Let's start coding..
The Json file
The following listing is the json data of Apple's historic values. Listing 1 is a sneak peek of the actual data, I haven't added overall data here in listing 1, otherwise it will make this article longer than necessary. Just download the attached application you will find a json file there, which has 2 months worth of data.
[
{
"Date": "9-Jun-22",
"Open": 147.08,
"High": 147.95,
"Low": 142.53,
"Close": 142.64,
"Volume": "69367400"
},
{
"Date": "8-Jun-22",
"Open": 148.58,
"High": 149.87,
"Low": 147.46,
"Close": 147.96,
"Volume": "53950200"
},
{
"Date": "7-Jun-22",
"Open": 144.35,
"High": 149,
"Low": 144.1,
"Close": 148.71,
"Volume": "67808200"
},
{
"Date": "6-Jun-22",
"Open": 147.03,
"High": 148.57,
"Low": 144.9,
"Close": 146.14,
"Volume": "71598400"
},
]
Listing 1: AppleStockPrices.json
Now crack open the visual studio, and create "Blazor server" or "Blazor web assembly" app, again choose your own adventure as per your taste.
The Model class
As we mentioned above, the second thing we need is a model class to store this structure of the data. Let's see what we got in listing 1, we have fields like Open, High, Low, Close and Volume. Okay now all we have to do is to create a class with these fields, listing 2 is the model class Stock.
public class Stock {
public DateTime Date {
get;
set;
}
public double Open {
get;
set;
}
public double High {
get;
set;
}
public double Low {
get;
set;
}
public double Close {
get;
set;
}
public long Volume {
get;
set;
}
}
Listing 2: class Stock
The Razor component
Now, before we start using Telerik controls in our component, first we need to install Telerik package,
Open NuGet Package Manager and search for "Telerik.UI.for.Blazor" and install the following package.
Image 2: Telerik UI for Blazor
Next step, if you're using Blazor Server, open _Layout.cshtml and add follwoing lines. For Blazor Web Assembly, edit index.cshtml file
<script src="https://blazor.cdn.telerik.com/blazor/3.3.0/telerik-blazor.min.js" defer></script>
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
Listing 3: edit _Layout.cshtml
Now that we have set the configuration, we can finally start using Telerik controls.
At last add the razor file, Right click on your project and add razor component name it "StockCharts.razor"
Toggle Button
We need toggle-button to switch from Candlestick to OHLC chart. This control is managed by a boolean variable to toggle on and off. We have added a boolean property named "IsCandlestickSelected"
at line number 7, when it is true we will show the candlestick chart otherwise OHLC chart.
Open the "StockCharts.razor"
file and add the following toggle button, We are using "TelerikSwitch"
as shown in listing 4.
<TelerikSwitch @bind-Value="@IsCandlestickSelected"
Width="120px"
OnLabel="Candle Stick"
OffLabel="OHLC Chart">
</TelerikSwitch>
@code {
private bool IsCandlestickSelected { get; set; } = true;
}
Listing 3: Added TelerikSwitch to StockCharts.razor
Next, we are going to add TelerikChart. What do we need to take care of?
- Type: The Type property, on the selection of toggle-button, we will change that chart-type from Candlestick to OHLC and vice-versa. (Listing 4- line number 23)
- Data: The Data property, The list of model class from listing 2, This list is deserialized version of json data from listing 1. (Listing 4- line number 24)
- Axis: X axis is going to represent a date and Y axis is going to represent stock prices. Note: Xaxis is referred as
"ChartCategoryAxis"
(Listing 4- line number 33) & Y-Axis is referred as "ChartValueAxis"
(Listing 4- line number 38).
- Colors: I am using "yellow green" color for positive candle, and "salmon" color for negative candle. There are 2 attributes being used to define colors. (Listing 4- line number 29)
That's all there is in the UI front of the house. Now back to C#.
- We are going to create
List<Stock>
as mentioned. (Listing 4- line number 50)
- Inside the
OnInitializedAsync()
method, we are using Newtonsoft to deserialize the json to List<Stock>
. (Listing 4- line number 59)
Alright now that we have laid down the plan. Let's add these artifacts to our "StockCharts.razor''
. Following listing is taking care of everything that we discussed above.
Note
I am using bootstrap classes for rounded borders, button colors, and margins etc.
@page "/"
@using Newtonsoft.Json
@using System.Reflection
@inherits LayoutComponentBase
<TelerikSwitch @bind-Value="@IsCandlestickSelected"
Width="120px"
OnLabel="Candle Stick"
OffLabel="OHLC Chart">
</TelerikSwitch>
<button Class="m-2 btn btn-primary">Apple CMP:137.13</button>
<button Class="m-2 btn btn-danger">-5.51 (-3.86%)</button>
<TelerikRootComponent>
@if (ApplePrices != null)
{
<TelerikChart Width="100%"
Height="400px"
Class="mt-3 border border-primary rounded">
<ChartTitle Text="NASDAQ: 10 July 2022"></ChartTitle>
<ChartTooltip Visible="true"></ChartTooltip>
<ChartSeriesItems>
<ChartSeries Type="@( IsCandlestickSelected ? Telerik.Blazor.ChartSeriesType.Candlestick : Telerik.Blazor.ChartSeriesType.OHLC )"
Data="@ApplePrices"
CategoryField="@nameof(Stock.Date)"
OpenField="@nameof(Stock.Open)"
CloseField="@nameof(Stock.Close)"
HighField="@nameof(Stock.High)"
LowField="@nameof(Stock.Low)" DownColor="salmon" Color="yellowgreen">
</ChartSeries>
</ChartSeriesItems>
<ChartCategoryAxes>
<ChartCategoryAxis Type="Telerik.Blazor.ChartCategoryAxisType.Date">
</ChartCategoryAxis>
</ChartCategoryAxes>
<ChartValueAxes>
<ChartValueAxis Min="136" Max="170">
</ChartValueAxis>
</ChartValueAxes>
</TelerikChart>
}
</TelerikRootComponent>
<footer class="mt-3 border border-primary rounded w-25">
<p class="m-2">Copyright © 2022, Rikam Palkar.</p>
<p class="m-2">This app contains material by Telerik © 2022</p>
</footer>
@code {
List<Stock> ApplePrices { get; set; }
private bool IsCandlestickSelected { get; set; } = true;
protected override async Task OnInitializedAsync()
{
string jsonPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"Data\AppleStockPrices.json");
using (StreamReader stream = new StreamReader(jsonPath))
{
ApplePrices = JsonConvert.DeserializeObject<List<Stock>>(stream.ReadToEnd());
}
}
}
Listing 4: StockCharts.razor
Beautiful, let's crack open that bad boy and see it's working. Following images are a series of snaps of what we have achieved.
Image 3: Snap of Candle stick
Image 3: Snap of OHLC chart
Phew!! thank god it worked. This is ceremonial.
Conclusion
Now we know how to create candlestick and OHLC charts in Blazor, how to style them based on their type and how to deserialize json into objects. We saw how to add telerik components in your application.
This has been fun. I will see you in the next chapter of Blazing Blazor.