/*Entry Logic... COULD ALSO BE USED TO CALL RUN_TS_CS if needed (Called on Tick... so that works) * private static void GFClient_OnPriceTick(GF.Api.IGFClient client, GF.Api.Contracts.PriceChangedEventArgs e) * { * //TRADING LOGIC !! REPLACE WITH SHIT YOU WANT. * if (Math.Abs(e.Price.LastPrice - e.Price.BidPrice) < e.Contract.TickSize) * PlaceOrder(client, e.Contract, OrderSide.Buy, e.Price.BidPrice, "By Bid"); * else if (Math.Abs(e.Price.LastPrice - e.Price.AskPrice) < e.Contract.TickSize) * PlaceOrder(client, e.Contract, OrderSide.Sell, e.Price.AskPrice, "By Ask"); * } */ private static void PlaceOrder(GF.Api.IGFClient client, GF.Api.Contracts.IContract contract, GF.Api.Values.Orders.OrderSide orderSide, int qty, double limitPrice = 0.0, string comments = "") { //var qty = position.Net.Volume; //TWEAK THIS SO THAT IF LIMITPRICE = 0.0, MARKET ORDER!!!! if (client.Orders.Get().Count == 0 || client.Orders.Get().Last().IsFinalState) { OrderDraft orderDraft = new OrderDraftBuilder() .WithAccountID(client.Accounts.Get().First().ID) .WithContractID(contract.ID) .WithSide(orderSide) .WithOrderType(GF.Api.Values.Orders.OrderType.Market) //.WithPrice(limitPrice) .WithQuantity(1) .WithEnd(DateTime.UtcNow.AddMinutes(1)) .WithComments(comments) .Build(); IReadOnlyList <OrderDraftValidationError> validationErrors = client.Orders.Drafts.Validate(orderDraft); if (validationErrors.Any()) { Console.WriteLine($"ERROR. Order {orderSide} {orderDraft.Quantity} {contract.Symbol} @ {contract.PriceToString(limitPrice)} Limit is invalid:"); foreach (var error in validationErrors) { Console.WriteLine($"\t{error.Message}"); } } else { GF.Api.Orders.IOrder order = client.Orders.SendOrder(orderDraft); Console.WriteLine($"Order {order} was sent"); } } }
public void OnBar(GF.Api.IGFClient client, GF.Api.Subscriptions.Bars.BarsReceivedEventArgs e) { foreach (var bar in e.Bars) { Fill_OHLC(e.Subscription.Contract, bar); } }
private void GFClient_OnOrderStateChanged(GF.Api.IGFClient client, GF.Api.Orders.OrderStateChangedEventArgs e) { if (!e.Order.IsFinalState) { return; } var avgPosition = e.Order.Account.AvgPositions[e.Order.Contract]; if (avgPosition == null) { return; } if (_resultActions.TryGetValue(avgPosition, out var action)) { var orders = GetPositionOrders(e.Order.Account, e.Order.Contract).ToList(); if (orders.Any()) { CancelAll(orders); } else { if (avgPosition.Net.Volume == 0) { _resultActions.Remove(avgPosition); action(); } else { PlaceExitOrder(avgPosition); } } } }
private static void GFClient_OnBarsReceived(GF.Api.IGFClient client, GF.Api.Subscriptions.Bars.BarsReceivedEventArgs e) { Console.WriteLine($"{e.Bars.Count} bars received for {e.Subscription.Contract.Symbol} {e.Subscription.Description.Type} {e.Subscription.Description.Interval}"); foreach (var bar in e.Bars) { DisplayBar(e.Subscription.Contract, bar); } }
//Helper function for cat_Trail private double get_position_pnl(GF.Api.IGFClient client, GF.Api.Positions.PositionChangedEventArgs e) { //SEEMS LIKE IT NEEDS A LOOP... NO? //foreach(var pos in GF.Api.Positions....) return(e.ContractPosition.OTE); //+ e.ContractPosition.Gain; //Think Gain is Realized PNL, we want UNREALIZED only. //THINK from documentation that it's only OTE for OpenPNL }
public void Fill_Hist_Bars(GF.Api.IGFClient client, GF.Api.Subscriptions.Bars.BarsReceivedEventArgs e) { //Data d = new Data(); Console.WriteLine("Getting past (lb) bars..."); //CHECK WHAT ORDER THEY ARE ADDED... foreach (var bar in e.Bars) { d.hist.Add(bar); } Console.WriteLine("historical bars populated"); }
private static void GFClient_OnSymbolLookupReceived(GF.Api.IGFClient client, GF.Api.Contracts.Lookup.SymbolLookupEventArgs e) { Data d = new Data(); //to get property -- must be an easier way? // Subscribe 10-min bars and loads previous 3 days of historical bars client.Subscriptions.Bars.Subscribe( e.Contracts.First().ID, client.Subscriptions.Bars.Duration.Create(DateTime.UtcNow.AddDays(-d.lookback)), client.Subscriptions.Bars.Description.CreateMinutes(10)); }
public Connect(int p = 9200) { gfClient = GF.Api.Impl.GFApi.CreateClient(); //Removed declaration stuff (type, object -- etc) account = gfClient.Accounts.Get().FirstOrDefault(); runner = new GF.Api.Threading.GFClientRunner(gfClient); //declared in class def runner.Start(); Console.WriteLine("Runner (HB) started."); port = p; Console.WriteLine("Connecting..."); }
//Hidden Entry into the program -- This initializes the RUN. private void GFClient_OnAvgPositionChanged(GF.Api.IGFClient client, GF.Api.Positions.PositionChangedEventArgs e) { //Connect c; For static call to shit // IFF -- This is called ONCE, replace run_cat_trail with RUN() here -- //Run(e); run_cat_trail(e); //Can throw RUN in here!! Since I can;t get it to run otherwise... Also does nice logging. -- OR just call check_ts_cs right from here. Console.WriteLine( "Average Position. {0}/{1}: Net Pos: {2} @ {3}, Bought: {4}, Sold {5}, Prev Pos: {6} P/L: {7:c}", e.Account.Spec, e.ContractPosition.Contract.Symbol, e.ContractPosition.Net.Volume, e.ContractPosition.Net.Price, e.ContractPosition.Long.Volume, e.ContractPosition.Short.Volume, e.ContractPosition.Prev.Volume, e.ContractPosition.OTE + e.ContractPosition.Gain); }
private static void RegisterOnBarsReceived(GF.Api.IGFClient client) { client.Subscriptions.Bars.BarsReceived += GFClient_OnBarsReceived; }
//Trailstop // Catstop portion... public void RegisterOnAvgPositionChanged(GF.Api.IGFClient client) { client.Accounts.AvgPositionChanged += GFClient_OnAvgPositionChanged; //client.Accounts.AvgPositionChanged += run_cat_trail; // No idea how to start this? //client.Accounts.AvgPositionChanged += Test; }
private void GFClient_OnDisconnected(GF.Api.IGFClient client, GF.Api.Connection.DisconnectedEventArgs disconnectedEventArgs) { _resultActions.Clear(); }
public PositionCloser(GF.Api.IGFClient client) { _client = client; _client.Connection.Aggregate.Disconnected += GFClient_OnDisconnected; _client.Orders.OrderStateChanged += GFClient_OnOrderStateChanged; }