forked from visualHFT/VisualHFT
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHelperActiveOrders.cs
95 lines (85 loc) · 3.19 KB
/
HelperActiveOrders.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using VisualHFT.Model;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
namespace VisualHFT.Helpers
{
public class HelperActiveOrder: ConcurrentDictionary<string, VisualHFT.Model.Order>
{
public event EventHandler<VisualHFT.Model.Order> OnDataReceived;
public event EventHandler<VisualHFT.Model.Order> OnDataRemoved;
public HelperActiveOrder()
{}
~HelperActiveOrder()
{}
protected virtual void RaiseOnDataReceived(List<VisualHFT.Model.Order> orders)
{
EventHandler<VisualHFT.Model.Order> _handler = OnDataReceived;
if (_handler != null && Application.Current != null)
{
foreach (var o in orders)
_handler(this, o);
}
}
protected virtual void RaiseOnDataRemoved(List<VisualHFT.Model.Order> orders)
{
EventHandler<VisualHFT.Model.Order> _handler = OnDataRemoved;
if (_handler != null && Application.Current != null)
{
foreach (var o in orders)
_handler(this, o);
}
}
public bool TryFindOrder(int providerId, string symbol, double price, out VisualHFT.Model.Order order)
{
var o = this.Select(x => x.Value).Where(x => x.ProviderId == providerId && x.Symbol == symbol && x.PricePlaced == price).FirstOrDefault();
if (o != null)
{
return this.TryGetValue(o.ClOrdId, out order);
}
else
{
order = null;
return false;
}
}
public void UpdateData(IEnumerable<VisualHFT.Model.Order> orders)
{
var _listToRemove = new List<VisualHFT.Model.Order>();
var _listToAdd = new List<VisualHFT.Model.Order>();
_listToRemove = this.Where(x => !orders.Any(o => o.ClOrdId == x.Value.ClOrdId)).Select(x => x.Value).ToList();
_listToAdd = orders.Where(x => !this.Any(o => o.Value.ClOrdId == x.ClOrdId)).ToList();
foreach (var o in _listToRemove)
this.TryRemove(o.ClOrdId, out var fakeOrder);
if (_listToRemove.Any())
RaiseOnDataRemoved(_listToRemove);
var _listToAddOrUpdate = new List<VisualHFT.Model.Order>();
foreach (var o in _listToAdd)
{
if (UpdateData(o))
_listToAddOrUpdate.Add(o);
}
if (_listToAddOrUpdate.Any())
RaiseOnDataReceived(_listToAddOrUpdate);
}
private bool UpdateData(VisualHFT.Model.Order order)
{
if (order != null)
{
//Check provider
if (!this.ContainsKey(order.ClOrdId))
{
order.CreationTimeStamp = DateTime.Now;
return this.TryAdd(order.ClOrdId, order);
}
else
{
return TryUpdate(order.ClOrdId, order, this[order.ClOrdId]);
}
}
return false;
}
}
}