Snippets

GainFuturesDev GFApi Paginated Options Lookup

Created by Vitaliy Pfau
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.");
        }
    }
}

Comments (0)

HTTPS SSH

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