-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MDAPI-67] [.NET] Integrate IndexedEventTxModel
- Loading branch information
Konstantin Ivaschenko
committed
Jul 24, 2024
1 parent
a775236
commit ed99677
Showing
36 changed files
with
3,499 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<Application xmlns="https://github.com/avaloniaui" | ||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | ||
x:Class="CandleChartSample.App" | ||
RequestedThemeVariant="Default"> | ||
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. --> | ||
|
||
<Application.Styles> | ||
<FluentTheme /> | ||
</Application.Styles> | ||
</Application> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
using Avalonia; | ||
using Avalonia.Controls.ApplicationLifetimes; | ||
using Avalonia.Markup.Xaml; | ||
|
||
namespace CandleChartSample; | ||
|
||
public partial class App : Application | ||
{ | ||
public override void Initialize() | ||
{ | ||
AvaloniaXamlLoader.Load(this); | ||
} | ||
|
||
public override void OnFrameworkInitializationCompleted() | ||
{ | ||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) | ||
{ | ||
desktop.MainWindow = new MainWindow(); | ||
} | ||
|
||
base.OnFrameworkInitializationCompleted(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>WinExe</OutputType> | ||
<TargetFrameworks>net6.0</TargetFrameworks> | ||
<Nullable>enable</Nullable> | ||
<BuiltInComInteropSupport>true</BuiltInComInteropSupport> | ||
<ApplicationManifest>app.manifest</ApplicationManifest> | ||
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Avalonia" Version="11.0.10"/> | ||
<PackageReference Include="Avalonia.Desktop" Version="11.0.10"/> | ||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.10"/> | ||
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.0.10"/> | ||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.--> | ||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.10"/> | ||
<PackageReference Include="ScottPlot.Avalonia" Version="5.0.36"/> | ||
</ItemGroup> | ||
|
||
<ItemGroup> | ||
<ProjectReference Include="..\..\src\DxFeed.Graal.Net\DxFeed.Graal.Net.csproj"/> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// <copyright file="CandleExtension.cs" company="Devexperts LLC"> | ||
// Copyright © 2024 Devexperts LLC. All rights reserved. | ||
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. | ||
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
// </copyright> | ||
|
||
using System; | ||
using DxFeed.Graal.Net.Events.Candles; | ||
using ScottPlot; | ||
|
||
namespace CandleChartSample; | ||
|
||
public static class CandleExtension | ||
{ | ||
public static OHLC ToOHLC(this Candle candle) | ||
{ | ||
var open = GetValueWithPriority(candle.Open, candle.High, candle.Low, candle.Close); | ||
var high = GetValueWithPriority(candle.High, candle.Open, candle.Low, candle.Close); | ||
var low = GetValueWithPriority(candle.Low, candle.Close, candle.Open, candle.High); | ||
var close = GetValueWithPriority(candle.Close, candle.Low, candle.Open, candle.High); | ||
|
||
return new OHLC | ||
{ | ||
Open = open, | ||
High = high, | ||
Low = low, | ||
Close = close, | ||
DateTime = DateTimeOffset.FromUnixTimeMilliseconds(candle.Time).DateTime.ToLocalTime(), | ||
TimeSpan = TimeSpan.FromMilliseconds(candle.CandleSymbol!.Period!.PeriodIntervalMillis) | ||
}; | ||
} | ||
|
||
private static double GetValueWithPriority(params double[] values) | ||
{ | ||
foreach (var value in values) | ||
{ | ||
if (!double.IsNaN(value)) | ||
{ | ||
return value; | ||
} | ||
} | ||
return double.NaN; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
// <copyright file="CandleList.cs" company="Devexperts LLC"> | ||
// Copyright © 2024 Devexperts LLC. All rights reserved. | ||
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. | ||
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
// </copyright> | ||
|
||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using DxFeed.Graal.Net.Events; | ||
using DxFeed.Graal.Net.Events.Candles; | ||
using ScottPlot; | ||
|
||
namespace CandleChartSample; | ||
|
||
public class CandleList : List<OHLC> | ||
{ | ||
public void Update(IEnumerable<Candle> candles, bool isSnapshot) | ||
{ | ||
var sortedCandles = candles.OrderBy(c => c.Index); | ||
|
||
if (isSnapshot) | ||
{ | ||
UpdateSnapshot(sortedCandles); | ||
} | ||
else | ||
{ | ||
UpdateIncremental(sortedCandles); | ||
} | ||
} | ||
|
||
private void UpdateSnapshot(IEnumerable<Candle> candles) | ||
{ | ||
Clear(); | ||
foreach (var candle in candles) | ||
{ | ||
if (!ShouldRemove(candle)) | ||
{ | ||
Add(candle.ToOHLC()); | ||
} | ||
} | ||
} | ||
|
||
private void UpdateIncremental(IEnumerable<Candle> candles) | ||
{ | ||
foreach (var candle in candles) | ||
{ | ||
if (ShouldRemove(candle)) | ||
{ | ||
RemoveCandle(candle); | ||
continue; | ||
} | ||
|
||
var ohlc = candle.ToOHLC(); | ||
var lastOhlc = LastOrDefault(); | ||
switch (DateTime.Compare(ohlc.DateTime, lastOhlc.DateTime)) | ||
{ | ||
case < 0: | ||
InsertOrUpdate(ohlc); | ||
break; | ||
case 0: | ||
AddOrUpdateLast(ohlc); | ||
break; | ||
case > 0: | ||
Add(ohlc); | ||
break; | ||
} | ||
} | ||
} | ||
|
||
private void AddOrUpdateLast(OHLC ohlc) | ||
{ | ||
if (IsEmpty()) | ||
{ | ||
Add(ohlc); | ||
} | ||
else | ||
{ | ||
this[Count - 1] = ohlc; | ||
} | ||
} | ||
|
||
private void InsertOrUpdate(OHLC ohlc) | ||
{ | ||
var index = FindIndex(o => DateTime.Compare(ohlc.DateTime, o.DateTime) <= 0); | ||
if (index >= 0 && this[index].DateTime.Equals(ohlc.DateTime)) | ||
{ | ||
this[index] = ohlc; | ||
} | ||
else | ||
{ | ||
Insert(index >= 0 ? index : 0, ohlc); | ||
} | ||
} | ||
|
||
private void RemoveCandle(Candle candle) => | ||
RemoveAll(ohlc => candle.ToOHLC().DateTime.Equals(ohlc.DateTime)); | ||
|
||
private bool IsEmpty() => | ||
Count == 0; | ||
|
||
private OHLC LastOrDefault() => | ||
IsEmpty() ? new OHLC() : this[Count - 1]; | ||
|
||
private static bool ShouldRemove(Candle candle) => | ||
EventFlags.IsRemove(candle) || | ||
(double.IsNaN(candle.Open) && | ||
double.IsNaN(candle.High) && | ||
double.IsNaN(candle.Low) && | ||
double.IsNaN(candle.Close)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
<Window xmlns="https://github.com/avaloniaui" | ||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | ||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | ||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | ||
xmlns:scottPlot="clr-namespace:ScottPlot.Avalonia;assembly=ScottPlot.Avalonia" | ||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" | ||
x:Class="CandleChartSample.MainWindow" | ||
WindowStartupLocation="CenterScreen" | ||
Title="CandleChartSample"> | ||
|
||
<Grid> | ||
<Grid.RowDefinitions> | ||
<RowDefinition Height="Auto" /> | ||
<RowDefinition Height="*" /> | ||
</Grid.RowDefinitions> | ||
|
||
<Grid Grid.Row="0" HorizontalAlignment="Left" Margin="10" Grid.ColumnSpan="2"> | ||
|
||
<Grid.ColumnDefinitions> | ||
<ColumnDefinition Width="Auto" /> | ||
<ColumnDefinition Width="Auto" /> | ||
<ColumnDefinition Width="Auto" /> | ||
<ColumnDefinition Width="Auto" /> | ||
</Grid.ColumnDefinitions> | ||
|
||
<TextBlock Grid.Column="0" Text="Symbol" Margin="5" FontSize="12" VerticalAlignment="Center" /> | ||
<TextBox x:Name="SymbolTextBox" | ||
Grid.Column="1" | ||
Text="AAPL{=d}" | ||
FontSize="12" | ||
Width="180" | ||
Margin="5" | ||
KeyDown="OnKeyDown" | ||
LostFocus="OnLostFocus" /> | ||
|
||
<TextBlock Grid.Column="2" Text="From Time" Margin="5" FontSize="12" VerticalAlignment="Center" /> | ||
<TextBox x:Name="FromTimeTextBox" | ||
Grid.Column="3" | ||
FontSize="12" | ||
Width="180" | ||
Margin="5" | ||
KeyDown="OnKeyDown" | ||
LostFocus="OnLostFocus" /> | ||
</Grid> | ||
|
||
<Grid Grid.Row="1" Grid.Column="0"> | ||
<scottPlot:AvaPlot Name="AvaPlot" /> | ||
</Grid> | ||
|
||
</Grid> | ||
|
||
</Window> |
Oops, something went wrong.