Skip to content

Commit cfcb313

Browse files
committed
Gateways
1 parent 6606544 commit cfcb313

File tree

2 files changed

+109
-8
lines changed

2 files changed

+109
-8
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using Core.Enums;
2+
using Core.Grains;
3+
using Core.Models;
4+
using Schwab.Messages;
5+
using Schwab.Models;
6+
using Schwab.Queries;
7+
using System;
8+
using System.Diagnostics.Metrics;
9+
using System.Linq;
10+
using System.Threading;
11+
using System.Threading.Tasks;
12+
13+
namespace Schwab.Grains
14+
{
15+
public interface ISchwabInstrumentGrain : IInstrumentGrain
16+
{
17+
/// <summary>
18+
/// Connect
19+
/// </summary>
20+
/// <param name="connection"></param>
21+
Task<StatusResponse> Setup(Connection connection);
22+
}
23+
24+
public class SchwabInstrumentGrain : InstrumentGrain, ISchwabInstrumentGrain
25+
{
26+
/// <summary>
27+
/// State
28+
/// </summary>
29+
protected Connection state;
30+
31+
/// <summary>
32+
/// Connector
33+
/// </summary>
34+
protected SchwabBroker connector = new();
35+
36+
/// <summary>
37+
/// Connect
38+
/// </summary>
39+
/// <param name="connection"></param>
40+
public virtual async Task<StatusResponse> Setup(Connection connection)
41+
{
42+
state = connection;
43+
connector.AccessToken = connection.AccessToken;
44+
45+
return new()
46+
{
47+
Data = StatusEnum.Active
48+
};
49+
}
50+
51+
/// <summary>
52+
/// List of prices by criteria
53+
/// </summary>
54+
/// <param name="criteria"></param>
55+
public override async Task<PricesResponse> PriceGroups(Criteria criteria)
56+
{
57+
var query = new HistoryQuery()
58+
{
59+
EndDate = criteria.MaxDate.Value,
60+
StartDate = criteria.MinDate.Value,
61+
Symbol = criteria.Instrument.Name
62+
};
63+
64+
var cleaner = new CancellationTokenSource(state.Timeout);
65+
var sourceResponse = await connector.GetBars(query, cleaner.Token);
66+
var items = sourceResponse.Bars.Select(MapPrice).ToArray();
67+
68+
return new()
69+
{
70+
Data = items
71+
};
72+
}
73+
74+
/// <summary>
75+
/// Map price
76+
/// </summary>
77+
/// <param name="o"></param>
78+
protected virtual Price MapPrice(BarMessage o) => new()
79+
{
80+
AskSize = 0,
81+
BidSize = 0,
82+
Ask = o.Close,
83+
Bid = o.Close,
84+
Last = o.Close,
85+
Volume = o.Volume,
86+
Time = o.Datetime
87+
};
88+
}
89+
}

Gateways/Schwab/Libs/SchwabGateway.cs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
using Core.Conventions;
22
using Core.Enums;
3-
using Core.Extensions;
43
using Core.Grains;
54
using Core.Models;
65
using Schwab.Grains;
76
using Schwab.Models;
8-
using System;
97
using System.Linq;
10-
using System.Threading;
118
using System.Threading.Tasks;
12-
using System.Timers;
139

1410
namespace Schwab
1511
{
@@ -99,18 +95,34 @@ public override Task<DomResponse> GetDom(Criteria criteria)
9995
/// Ticks
10096
/// </summary>
10197
/// <param name="criteria"></param>
102-
public override Task<PricesResponse> GetPrices(Criteria criteria)
98+
public override async Task<PricesResponse> GetPrices(Criteria criteria)
10399
{
104-
return Component<IInstrumentGrain>(criteria.Instrument.Name).Prices(criteria);
100+
var grain = Component<IInstrumentGrain>(criteria.Instrument.Name);
101+
var instrumentGrain = Component<ISchwabInstrumentGrain>(criteria.Instrument.Name);
102+
103+
if (criteria?.Source is not true)
104+
{
105+
await instrumentGrain.Prices(criteria);
106+
}
107+
108+
return await grain.Prices(criteria);
105109
}
106110

107111
/// <summary>
108112
/// Bars
109113
/// </summary>
110114
/// <param name="criteria"></param>
111-
public override Task<PricesResponse> GetPriceGroups(Criteria criteria)
115+
public override async Task<PricesResponse> GetPriceGroups(Criteria criteria)
112116
{
113-
return Component<IInstrumentGrain>(criteria.Instrument.Name).PriceGroups(criteria);
117+
var grain = Component<IInstrumentGrain>(criteria.Instrument.Name);
118+
var instrumentGrain = Component<ISchwabInstrumentGrain>(criteria.Instrument.Name);
119+
120+
if (criteria?.Source is not true)
121+
{
122+
await instrumentGrain.PriceGroups(criteria);
123+
}
124+
125+
return await grain.PriceGroups(criteria);
114126
}
115127

116128
/// <summary>

0 commit comments

Comments
 (0)