/*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 Fill_OHLC(GF.Api.Contracts.IContract contract, GF.Api.Subscriptions.Bars.Bar bar) { L.Add(bar.Low); H.Add(bar.High); O.Add(bar.Open); C.Add(bar.Close); Console.WriteLine("OHLC Lists Filled"); }
//ExitPosition with no Position required... Does require contract and EventArgs... public IOrder ExitPosition_Alt(GF.Api.Contracts.IContract contract, OrdersProcessor orderProcessor, EventArgs e) { //var vol = GetPositionVolume(position) //Requires position here too! var vol = e.ContractPosition.Net.Volume; var exit_qty = Math.Abs(qty); //var contract = e.ContractPosition.Contract.ElectronicContract; //Might be able to drop IContract arg? return(orderProcessor.SendOrder( vol < 0 ? OrderSide.BuyToCover : OrderSide.Sell, exit_qty, contract, OrderType.Market)); }
private static void DisplayBar(GF.Api.Contracts.IContract contract, GF.Api.Subscriptions.Bars.Bar bar) { Console.WriteLine( "{0} {1} O:{2} H:{3} L:{4} C:{5} Vol:{6} Ticks:{7} UpVol:{8} DownVol:{9}", contract.Symbol, bar.OpenTimestamp.ToLocalTime(), contract.PriceToString(bar.Open), contract.PriceToString(bar.High), contract.PriceToString(bar.Low), contract.PriceToString(bar.Close), bar.Volume, bar.Ticks, bar.UpVolume, bar.DownVolume); }
public IEnumerable <GF.Api.Orders.IOrder> GetPositionOrders(GF.Api.Accounts.IAccount account, GF.Api.Contracts.IContract contract) { return(WorkingOrders.Where(order => order.Account.ID == account.ID && order.Contract.PositionContract.ID == contract.PositionContract.ID)); }