Snippets
Created by
Sergey Pikalov
last modified
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 153 154 155 156 157 158 159 160 161 162 | using System;
using GF.Api.Connection;
using GF.Api.Contracts.Base;
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;
using GF.Api.Values.Contracts.Lookup;
namespace GF.GFApiPagedLoadContractsByBaseSymbol
{
class Program
{
private const string BaseSymbol = "OEW"; //"ES";
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;
private Action _loadCompleteAction;
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 by BaseSymbol {BaseSymbol}");
Console.WriteLine();
_symbolLookupRequestID = client.Contracts.Lookup.ByCriteria(
new SymbolLookupRequestBuilder()
.WithResultCount(1)
.WithBaseSymbol(BaseSymbol, TextSearchMode.Exact)
.Build());
}
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 {BaseSymbol} returns no results");
return;
}
var contract = e.Contracts[0];
Console.WriteLine($"Lookup result received for {BaseSymbol}");
Console.WriteLine($"IsOption: {contract.IsOption}");
if (contract.IsOption)
{
//If the contract is an option, then we must first load all available parent contracts
LoadByBaseContract(client, contract.ParentContract.BaseContract);
_loadCompleteAction = () =>
{
LoadByBaseContract(client, contract.BaseContract);
_loadCompleteAction = null;
};
}
else
LoadByBaseContract(client, contract.BaseContract);
}
private void LoadByBaseContract(GF.Api.IGFClient client, IBaseContract baseContract)//IContractLoadExpression expression)
{
Console.WriteLine($"Requesting first {PageSize} contracts by {baseContract.Symbol}");
_loadContractExpression = new ContractLoadExpressionBuilder()
.Push(new BaseContractIDCriterion(baseContract.ID))
.Build();
var request = new ContractLoadRequestBuilder()
.WithSkipCount(0)
.WithResultCount(PageSize)
.WithExpression(_loadContractExpression)
.Build();
_loadRequestID = client.Contracts.Load.Request(request);
}
private void Load_ContractLoadReceived(GF.Api.IGFClient client, GF.Api.Contracts.Load.ContractLoadResponseEventArgs e)
{
if (_loadRequestID != e.RequestID)
return;
Console.WriteLine($"{e.Contracts.Count} contracts received");
Console.WriteLine("Contracts:");
foreach (var contract in e.Contracts)
Console.WriteLine($"\t{contract.Symbol}");
if (e.Contracts.Count >= PageSize)
{
_loadRequestCounter++;
Console.WriteLine($"Requesting next {PageSize} contracts. Page# {_loadRequestCounter}");
var request = new ContractLoadRequestBuilder()
.WithSkipCount(PageSize * _loadRequestCounter)
.WithResultCount(PageSize)
.WithExpression(_loadContractExpression)
.Build();
_loadRequestID = client.Contracts.Load.Request(request);
}
else
{
_loadRequestCounter = 0;
Console.WriteLine("Done.");
_loadCompleteAction?.Invoke();
}
}
}
}
|
Comments (1)
You can clone a snippet to your computer for local editing. Learn more.
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199