/
CurrencyPairPosition.cs
78 lines (65 loc) · 2.39 KB
/
CurrencyPairPosition.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System;
using System.Linq;
using System.Reactive.Linq;
using DynamicData;
using DynamicData.Aggregation;
using DynamicData.Binding;
namespace Trader.Domain.Model
{
public class CurrencyPairPosition: AbstractNotifyPropertyChanged, IDisposable, IEquatable<CurrencyPairPosition>
{
private readonly IDisposable _cleanUp;
private TradesPosition _position;
public CurrencyPairPosition(IGroup<Trade, long, string> tradesByCurrencyPair)
{
CurrencyPair = tradesByCurrencyPair.Key;
_cleanUp = tradesByCurrencyPair.Cache.Connect()
.ToCollection()
.Select(query =>
{
var buy = query.Where(trade => trade.BuyOrSell == BuyOrSell.Buy).Sum(trade=>trade.Amount);
var sell = query.Where(trade => trade.BuyOrSell == BuyOrSell.Sell).Sum(trade => trade.Amount);
var count = query.Count;
return new TradesPosition(buy,sell,count);
})
.Subscribe(position => Position = position);
}
public TradesPosition Position
{
get => _position;
set => SetAndRaise(ref _position,value);
}
public string CurrencyPair { get; }
#region Equality Members
public bool Equals(CurrencyPairPosition other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return string.Equals(CurrencyPair, other.CurrencyPair);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((CurrencyPairPosition) obj);
}
public override int GetHashCode()
{
return (CurrencyPair != null ? CurrencyPair.GetHashCode() : 0);
}
public static bool operator ==(CurrencyPairPosition left, CurrencyPairPosition right)
{
return Equals(left, right);
}
public static bool operator !=(CurrencyPairPosition left, CurrencyPairPosition right)
{
return !Equals(left, right);
}
#endregion
public void Dispose()
{
_cleanUp.Dispose();
}
}
}