Skip to content

Commit 7a21455

Browse files
authored
Merge pull request #13 from dv-lebedev/change-calculation-logic
Change calculation logic
2 parents c250f96 + a268dec commit 7a21455

12 files changed

Lines changed: 135 additions & 51 deletions

File tree

.github/workflows/build.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ name: Build WPF App
33
on:
44
push:
55
branches: [ master, develop ]
6-
pull_request:
76

87
jobs:
98
build:

PairTradingView.WpfApp/Entities/ExtFinancialPair.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ limitations under the License.
1616

1717
using PairTradingView.Shared;
1818
using PairTradingView.Shared.Statistics;
19+
using System.ComponentModel;
1920

2021
namespace PairTradingView.WpfApp.Entities;
2122

22-
public class ExtFinancialPair : FinancialPair
23+
public class ExtFinancialPair : FinancialPair, INotifyPropertyChanged
2324
{
2425
public ExtFinancialPair(Stock x, Stock y)
2526
: base(x, y)
@@ -34,7 +35,21 @@ public ExtFinancialPair(Stock x, Stock y)
3435
DeltaSDPlus3Q = DeltaAverage + (3 * DeltaSD);
3536
}
3637

37-
public bool Selected { get; set; }
38+
private bool _selected;
39+
public bool Selected
40+
{
41+
get { return _selected; }
42+
set
43+
{
44+
if (_selected != value)
45+
{
46+
_selected = value;
47+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Selected)));
48+
SelectedChanged?.Invoke(this, EventArgs.Empty);
49+
}
50+
}
51+
}
52+
3853
public double DeltaAverage { get; set; }
3954
public double DeltaMax { get; set; }
4055
public double DeltaMin { get; set; }
@@ -43,4 +58,7 @@ public ExtFinancialPair(Stock x, Stock y)
4358
public double SD_Y { get; set; }
4459
public double DeltaSDMinus3Q { get; set; }
4560
public double DeltaSDPlus3Q { get; set; }
61+
62+
public event PropertyChangedEventHandler? PropertyChanged;
63+
public event EventHandler? SelectedChanged;
4664
}

PairTradingView.WpfApp/Infra/SetupServices.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ public static class SetupServices
1010
{
1111
public static void AddAsOneServices(this ServiceCollection container)
1212
{
13+
// fin
14+
container.AddSingleton<Balance>(b => new Balance { Value = 100_000.00 });
15+
container.AddSingleton<Risk>();
16+
1317
// logging
1418
container.AddSingleton<ILogger>((sp) => Log.Logger);
1519

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
using CommunityToolkit.Mvvm.ComponentModel;
2+
3+
namespace PairTradingView.WpfApp.Models;
4+
5+
public class Balance : Param<double> { }

PairTradingView.WpfApp/Models/FinancialPairsModel.cs

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ public partial class FinancialPairsModel : ObservableObject
3434
[ObservableProperty]
3535
private int _smaValueMax;
3636

37+
[ObservableProperty]
38+
private Balance _balance;
39+
3740
public ExtFinancialPair? SelectedPair
3841
{
3942
get => _selectedPair;
@@ -59,16 +62,22 @@ public int SmaValue
5962
public event EventHandler SelectedPairChanged;
6063
public event EventHandler SmaValueChanged;
6164
public event EventHandler LoadNewDataRequested;
65+
public event EventHandler Calculated;
6266

6367
public ObservableCollection<ExtFinancialPair> Pairs { get; }
6468

6569
public event EventHandler PairsChanged;
6670

67-
public FinancialPairsModel(IStockDataProvider dataProvider, ILogger logger)
71+
public FinancialPairsModel(IStockDataProvider dataProvider, Balance balance, Risk risk, ILogger logger)
6872
{
6973
_dataProvider = dataProvider ?? throw new ArgumentNullException(nameof(dataProvider));
74+
_balance = balance ?? throw new ArgumentNullException(nameof(balance));
7075
_log = logger ?? throw new ArgumentNullException(nameof(logger));
7176
Pairs = new ObservableCollection<ExtFinancialPair>();
77+
78+
balance.ValueChanged += (s, e) => Calculate();
79+
risk.ValueChanged += (s, e) => Calculate();
80+
SelectedPairChanged += (s, e) => Calculate();
7281
}
7382

7483
public void ReselectSelectedPair()
@@ -92,13 +101,19 @@ public void UpdatePairs()
92101

93102
_log.Debug("Updating stocks with {Count} pairs", pairs?.Count() ?? 0);
94103

104+
foreach (var p in Pairs)
105+
{
106+
p.SelectedChanged -= Pair_SelectedChanged;
107+
}
108+
95109
Pairs.Clear();
96110

97111
if (pairs != null)
98112
{
99113
foreach (var pair in pairs)
100114
{
101115
Pairs.Add(pair);
116+
pair.SelectedChanged += Pair_SelectedChanged;
102117
}
103118
}
104119

@@ -112,33 +127,42 @@ public void UpdatePairs()
112127
}
113128
}
114129

115-
public void Calculate(double balance)
130+
private void Pair_SelectedChanged(object? sender, EventArgs e) => Calculate();
131+
132+
public void Calculate()
116133
{
117134
try
118135
{
136+
//preparation
137+
foreach (var pair in Pairs)
138+
{
139+
pair.TradeVolume = 0;
140+
pair.X.TradeVolume = 0;
141+
pair.Y.TradeVolume = 0;
142+
}
143+
119144
var checkedPairs = Pairs.Where(i => i.Selected).ToList();
120145

121146
if (checkedPairs.Count > 0)
122147
{
123-
//preparation
124-
foreach (var pair in Pairs)
125-
{
126-
pair.TradeVolume = 0;
127-
pair.X.TradeVolume = 0;
128-
pair.Y.TradeVolume = 0;
129-
}
130-
131-
new RiskManager(checkedPairs, balance).Calculate();
132-
}
133-
else
134-
{
135-
UserNotification.Display("Pairs are not selected.");
148+
var balanceValue = Balance.Value;
149+
new RiskManager(checkedPairs, balanceValue).Calculate();
136150
}
151+
152+
Calculated?.Invoke(this, EventArgs.Empty);
137153
}
138154
catch (Exception ex)
139155
{
140156
UserNotification.Display("CalculateRisk => " + ex.Message);
141157
_log.Error(ex, "Error calculating risk");
142158
}
143159
}
160+
161+
public void ChangeSelection()
162+
{
163+
if (SelectedPair is not null)
164+
{
165+
SelectedPair.Selected = !SelectedPair.Selected;
166+
}
167+
}
144168
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.ComponentModel;
2+
3+
namespace PairTradingView.WpfApp.Models;
4+
5+
public partial class Param<T> : INotifyPropertyChanged
6+
{
7+
private T? _value;
8+
9+
public T? Value
10+
{
11+
get { return _value; }
12+
set
13+
{
14+
if (!EqualityComparer<T>.Default.Equals(_value, value))
15+
{
16+
_value = value;
17+
ValueChanged?.Invoke(this, EventArgs.Empty);
18+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
19+
}
20+
}
21+
}
22+
23+
public event EventHandler ValueChanged;
24+
public event PropertyChangedEventHandler? PropertyChanged;
25+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
namespace PairTradingView.WpfApp.Models;
2+
3+
public class Risk : Param<double> { }

PairTradingView.WpfApp/ViewModels/GeneralTableViewModel.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,9 @@ public GeneralTableViewModel(FinancialPairsModel financialPairsModel)
2727
{
2828
Model = financialPairsModel ?? throw new ArgumentNullException(nameof(financialPairsModel));
2929
}
30+
31+
public void ChangeSelection()
32+
{
33+
Model.ChangeSelection();
34+
}
3035
}

PairTradingView.WpfApp/ViewModels/SelectedPairInfoViewModel.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,26 +45,28 @@ public partial class SelectedPairInfoViewModel : ObservableObject
4545
private double _xTradeVolume;
4646

4747
[ObservableProperty]
48-
private double _risk;
48+
private double _riskLimit;
4949

5050
[ObservableProperty]
51-
private double _riskLimit;
51+
private Balance _balance;
5252

5353
[ObservableProperty]
54-
private double _balance;
54+
private Risk _risk;
5555

5656
private readonly ILogger _log;
5757

5858
public FinancialPairsModel Model { get; }
5959

60-
public SelectedPairInfoViewModel(FinancialPairsModel financialPairsModel, ILogger logger)
60+
public SelectedPairInfoViewModel(FinancialPairsModel financialPairsModel, Balance balance, Risk risk, ILogger logger)
6161
{
6262
Model = financialPairsModel ?? throw new ArgumentNullException(nameof(financialPairsModel));
6363
_log = logger ?? throw new ArgumentNullException(nameof(logger));
6464

65-
Balance = 100_000.00;
65+
Balance = balance;
66+
Risk = risk;
6667

67-
Model.SelectedPairChanged += Instance_SelectedPairChanged;
68+
Model.SelectedPairChanged += (s,e) => UpdateUI();
69+
Model.Calculated += (s,e) => UpdateUI();
6870
}
6971

7072
[RelayCommand]
@@ -95,7 +97,7 @@ private void Calculate()
9597
{
9698
try
9799
{
98-
Model.Calculate(Balance);
100+
Model.Calculate();
99101
Model.ReselectSelectedPair();
100102
}
101103
catch (Exception ex)
@@ -105,7 +107,7 @@ private void Calculate()
105107
}
106108
}
107109

108-
private void Instance_SelectedPairChanged(object sender, EventArgs e)
110+
private void UpdateUI()
109111
{
110112
if (Model.SelectedPair is ExtFinancialPair pair)
111113
{
@@ -116,7 +118,7 @@ private void Instance_SelectedPairChanged(object sender, EventArgs e)
116118
PairsTradeVolume = pair.TradeVolume;
117119
XTradeVolume = pair.X.TradeVolume;
118120
YTradeVolume = pair.Y.TradeVolume;
119-
RiskLimit = pair.TradeVolume * Risk / 100.0;
121+
RiskLimit = pair.TradeVolume * Risk.Value / 100.0;
120122
}
121123
}
122124
}

PairTradingView.WpfApp/Views/GeneralTableView.xaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,15 @@
3232
Grid.ColumnSpan="2"
3333
ItemsSource="{Binding Model.Pairs}"
3434
SelectedItem="{Binding Model.SelectedPair}"
35+
MouseDoubleClick="DataGrid_MouseDoubleClick"
3536
x:Name="dataGrid">
3637
<DataGrid.Resources>
3738
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Orange"/>
3839
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Orange"/>
3940
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>
4041
</DataGrid.Resources>
4142
<DataGrid.Columns>
42-
<DataGridCheckBoxColumn Binding="{Binding Selected}"/>
43+
<DataGridCheckBoxColumn Binding="{Binding Selected, UpdateSourceTrigger=PropertyChanged}"/>
4344
<DataGridTextColumn Header="X" Binding="{Binding X.Name}" IsReadOnly="True"/>
4445
<DataGridTextColumn Header="Y" Binding="{Binding Y.Name}" IsReadOnly="True"/>
4546
<DataGridTextColumn Header="SD_X" Binding="{Binding SD_X, StringFormat=F4}" IsReadOnly="True"/>

0 commit comments

Comments
 (0)