Snippets

GainFuturesDev GFApi Paginated Options Lookup

Created by Vitaliy Pfau

File snippet.cs Added

  • Ignore whitespace
  • Hide word diff
+using System;
+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;
+using GF.Api.Impl;
+using GF.Api.Threading;
+
+namespace GFApiPagedOptionsLookup
+{
+    class Program
+    {
+        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)
+        {
+            new Program().Run();
+        }
+
+        private void Run()
+        {
+            var client = GFApi.CreateClient();
+            var runner = new GFClientRunner(client);
+            runner.Start();
+
+            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)
+                    .WithPort(9210)
+                    .WithHost("api.gainfutures.com")
+                    .WithUUID("9e61a8bc-0a31-4542-ad85-33ebab0e4e86")
+                    .WithForceLogin(true)
+                    .Build());
+
+            Console.WriteLine("Press any key to exit");
+            Console.WriteLine();
+            Console.ReadKey();
+
+            runner.Stop();
+        }
+
+        private void Aggregate_LoginCompleted(GF.Api.IGFClient client, LoginCompleteEventArgs e)
+        {
+            Console.WriteLine("Connected");
+            Console.WriteLine($"Request symbol {Symbol}");
+            Console.WriteLine();
+
+            _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)
+                return;
+
+            if (e.Contracts.Count > 1)
+            {
+                Console.WriteLine($"Looking up contract {Symbol} returns multiple results");
+                return;
+            }
+            if (e.Contracts.Count < 1)
+            {
+                Console.WriteLine($"Looking up contract {Symbol} returns no results");
+                return;
+            }
+
+            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))
+                    .Build();
+
+                var request = new ContractLoadRequestBuilder()
+                    .WithSkipCount(0)
+                    .WithResultCount(PageSize)
+                    .WithExpression(_loadContractExpression)
+                    .Build();
+
+                _loadRequestID = client.Contracts.Load.Request(request);
+            }
+            else
+                Console.WriteLine($"{Symbol} has no options");
+        }
+
+        private void Load_ContractLoadReceived(GF.Api.IGFClient client, GF.Api.Contracts.Load.ContractLoadResponseEventArgs e)
+        {
+            if (_loadRequestID != e.RequestID)
+                return;
+
+            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)
+            {
+                _loadRequestCounter++;
+
+                Console.WriteLine($"Requesting next {PageSize} options available for {Symbol}. Page# {_loadRequestCounter}");
+
+                var request = new ContractLoadRequestBuilder()
+                    .WithSkipCount(PageSize * _loadRequestCounter)
+                    .WithResultCount(PageSize)
+                    .WithExpression(_loadContractExpression)
+                    .Build();
+
+                _loadRequestID = client.Contracts.Load.Request(request);
+            }
+            else
+                Console.WriteLine("Done.");
+        }
+    }
+}
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.