+using GF.Api.Connection;
+using GF.Api.Contracts.Criteria;
+using GF.Api.Contracts.Load.Expression;
+using GF.Api.Contracts.Load.Request;
+using GF.Api.Contracts.Lookup.Request;
+namespace GFApiPagedOptionsLookup
+ private const string Symbol = "ESZ20";
+ private const int MaxPageSize = 1000; //Load request does not allow more than this
+ private const int PageSize = MaxPageSize;
+ private const string UserName = "";
+ private const string Password = "";
+ private SymbolLookupRequestID _symbolLookupRequestID;
+ private IContractLoadExpression _loadContractExpression;
+ private int _loadRequestCounter;
+ private ContractLoadRequestID _loadRequestID;
+ static void Main(string[] args)
+ var client = GFApi.CreateClient();
+ var runner = new GFClientRunner(client);
+ Console.WriteLine("Connecting...");
+ client.Connection.Aggregate.LoginFailed += Aggregate_LoginFailed;
+ client.Connection.Aggregate.LoginCompleted += Aggregate_LoginCompleted;
+ client.Contracts.Lookup.SymbolLookupReceived += Lookup_SymbolLookupReceived;
+ client.Contracts.Load.ContractLoadReceived += Load_ContractLoadReceived;
+ client.Connection.Aggregate.Connect(
+ new ConnectionContextBuilder()
+ .WithUserName(UserName)
+ .WithPassword(Password)
+ .WithHost("api.gainfutures.com")
+ .WithUUID("9e61a8bc-0a31-4542-ad85-33ebab0e4e86")
+ Console.WriteLine("Press any key to exit");
+ private void Aggregate_LoginCompleted(GF.Api.IGFClient client, LoginCompleteEventArgs e)
+ Console.WriteLine("Connected");
+ Console.WriteLine($"Request symbol {Symbol}");
+ _symbolLookupRequestID = client.Contracts.Lookup.BySymbol(Symbol);
+ private static void Aggregate_LoginFailed(GF.Api.IGFClient client, LoginFailedEventArgs e) =>
+ Console.WriteLine($"Login failed: {e.FailReason}");
+ private void Lookup_SymbolLookupReceived(GF.Api.IGFClient client, GF.Api.Contracts.Lookup.SymbolLookupEventArgs e)
+ if (e.RequestID != _symbolLookupRequestID)
+ if (e.Contracts.Count > 1)
+ Console.WriteLine($"Looking up contract {Symbol} returns multiple results");
+ if (e.Contracts.Count < 1)
+ Console.WriteLine($"Looking up contract {Symbol} returns no results");
+ var contract = e.Contracts[0];
+ Console.WriteLine($"Lookup result received for {Symbol}");
+ Console.WriteLine($"HasOptions: {contract.HasOptions}");
+ if (contract.HasOptions)
+ Console.WriteLine($"Requesting first {PageSize} options available for {Symbol}");
+ _loadContractExpression = new ContractLoadExpressionBuilder()
+ .Push(new ParentContractIDCriterion(contract.ID))
+ var request = new ContractLoadRequestBuilder()
+ .WithResultCount(PageSize)
+ .WithExpression(_loadContractExpression)
+ _loadRequestID = client.Contracts.Load.Request(request);
+ Console.WriteLine($"{Symbol} has no options");
+ private void Load_ContractLoadReceived(GF.Api.IGFClient client, GF.Api.Contracts.Load.ContractLoadResponseEventArgs e)
+ if (_loadRequestID != e.RequestID)
+ Console.WriteLine($"{e.Contracts.Count} options received");
+ Console.WriteLine("Options:");
+ foreach (var contract in e.Contracts)
+ Console.WriteLine($"\t{contract.Symbol}");
+ if (e.Contracts.Count >= PageSize)
+ Console.WriteLine($"Requesting next {PageSize} options available for {Symbol}. Page# {_loadRequestCounter}");
+ var request = new ContractLoadRequestBuilder()
+ .WithSkipCount(PageSize * _loadRequestCounter)
+ .WithResultCount(PageSize)
+ .WithExpression(_loadContractExpression)
+ _loadRequestID = client.Contracts.Load.Request(request);
+ Console.WriteLine("Done.");