-
Notifications
You must be signed in to change notification settings - Fork 43
/
StreamingLevel1DynamicExample.cs
152 lines (134 loc) · 6.4 KB
/
StreamingLevel1DynamicExample.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Threading.Tasks;
using IQFeed.CSharpApiClient.Examples.Common;
using IQFeed.CSharpApiClient.Streaming.Common.Messages;
using IQFeed.CSharpApiClient.Streaming.Level1;
using IQFeed.CSharpApiClient.Streaming.Level1.Handlers;
using IQFeed.CSharpApiClient.Streaming.Level1.Messages;
namespace IQFeed.CSharpApiClient.Examples.Examples.StreamingLevel1
{
public class StreamingLevel1DynamicExample : IExampleAsync
{
public bool Enable => false; // *** SET TO TRUE TO RUN THIS EXAMPLE ***
public string Name => nameof(StreamingLevel1DynamicExample);
public async Task RunAsync()
{
// *************************************
// Step 1 - !!! Configure your credentials for IQConnect in user environment variable or app.config !!!
// Check the documentation for more information.
// Step 2 - Run IQConnect launcher
IQFeedLauncher.Start();
// Step 3 - Create an array that includes the fields desired for Update and Summary messages
var fields = new[]
{
// The IQFeed servers *ALWAYS* include Symbol as first message data field, regardless of fields requested via SelectUpdateFieldName/SELECT UPDATE FIELDS
// DynamicFieldset.Symbol *MUST* be the first dynamic field in the array at this time. Parsing errors will result otherwise.
DynamicFieldset.Symbol,
DynamicFieldset.SevenDayYield,
DynamicFieldset.Ask,
DynamicFieldset.AskChange,
DynamicFieldset.AskMarketCenter,
DynamicFieldset.AskSize,
DynamicFieldset.AskTime,
DynamicFieldset.AvailableRegions,
DynamicFieldset.AverageMaturity,
DynamicFieldset.Bid,
DynamicFieldset.BidChange,
DynamicFieldset.BidMarketCenter,
DynamicFieldset.BidSize,
DynamicFieldset.BidTime,
DynamicFieldset.Change,
DynamicFieldset.ChangeFromOpen,
DynamicFieldset.Close,
DynamicFieldset.CloseRange1,
DynamicFieldset.CloseRange2,
DynamicFieldset.DaysToExpiration,
DynamicFieldset.DecimalPrecision,
DynamicFieldset.Delay,
DynamicFieldset.ExchangeID,
DynamicFieldset.ExtendedTrade,
DynamicFieldset.ExtendedTradeDate,
DynamicFieldset.ExtendedTradeMarketCenter,
DynamicFieldset.ExtendedTradeSize,
DynamicFieldset.ExtendedTradeTime,
DynamicFieldset.ExtendedTradingChange,
DynamicFieldset.ExtendedTradingDifference,
DynamicFieldset.FinancialStatusIndicator,
DynamicFieldset.FractionDisplayCode,
DynamicFieldset.High,
DynamicFieldset.Last,
DynamicFieldset.LastDate,
DynamicFieldset.LastMarketCenter,
DynamicFieldset.LastSize,
DynamicFieldset.LastTime,
DynamicFieldset.Low,
DynamicFieldset.MarketCapitalization,
DynamicFieldset.MarketOpen,
DynamicFieldset.MessageContents,
DynamicFieldset.MostRecentTrade,
DynamicFieldset.MostRecentTradeConditions,
DynamicFieldset.MostRecentTradeDate,
DynamicFieldset.MostRecentTradeMarketCenter,
DynamicFieldset.MostRecentTradeSize,
DynamicFieldset.MostRecentTradeTime,
DynamicFieldset.NetAssetValue,
DynamicFieldset.NumberOfTradesToday,
DynamicFieldset.Open,
DynamicFieldset.OpenInterest,
DynamicFieldset.OpenRange1,
DynamicFieldset.OpenRange2,
DynamicFieldset.PercentChange,
DynamicFieldset.PercentOffAverageVolume,
DynamicFieldset.PreviousDayVolume,
DynamicFieldset.PriceEarningsRatio,
DynamicFieldset.Range,
DynamicFieldset.RestrictedCode,
DynamicFieldset.Settle,
DynamicFieldset.SettlementDate,
DynamicFieldset.Spread,
DynamicFieldset.Tick,
DynamicFieldset.TickID,
DynamicFieldset.TotalVolume,
DynamicFieldset.Volatility,
DynamicFieldset.VWAP,
};
// Step 4 - Use the appropriate factory to create the client. Pass a new Level1MessageDynamicHandler to indicate dynamic fields in use
var level1Client = Level1ClientFactory.CreateNew(new Level1MessageDynamicHandler());
// Step 5 - Connect it
level1Client.Connect();
// Step 6 - Request the feed to begin returning selected fields in Summary and Update messages
level1Client.SelectUpdateFieldName(fields);
// Step 7 - Register to appropriate events
level1Client.Fundamental += Level1ClientOnFundamental;
level1Client.Summary += Level1ClientOnSummary;
level1Client.Update += Level1ClientOnSummary;
level1Client.Timestamp += Level1ClientOnTimestamp;
// Step 8 - Make your streaming Level 1 requests
level1Client.ReqWatch("AAPL");
Console.WriteLine("Watching APPL for the next 10 seconds... Please be patient ;-)\n");
await Task.Delay(TimeSpan.FromSeconds(10));
// Step 9 - Unwatch and unregister events
level1Client.ReqUnwatch("AAPL");
level1Client.Fundamental -= Level1ClientOnFundamental;
level1Client.Summary -= Level1ClientOnSummary;
level1Client.Update -= Level1ClientOnSummary;
level1Client.Timestamp -= Level1ClientOnTimestamp;
}
private void Level1ClientOnTimestamp(TimestampMessage msg)
{
Console.WriteLine(msg);
}
private void Level1ClientOnSummary(IUpdateSummaryMessage msg)
{
Console.WriteLine(msg.DynamicFields); // dynamic message here
}
private void Level1ClientOnFundamental(FundamentalMessage msg)
{
Console.WriteLine(msg);
}
public void Run()
{
throw new NotImplementedException();
}
}
}