/*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"); } } }
private void PlaceExitOrder(GF.Api.Positions.IPosition avgPosition) { OrderDraft orderDraft = new OrderDraftBuilder() .WithAccountID(avgPosition.Account.ID) .WithContractID(avgPosition.Contract.ID) .WithSide(avgPosition.Net.Volume > 0 ? OrderSide.Sell : OrderSide.Buy) .WithOrderType(OrderType.Market) .WithQuantity(Math.Abs(avgPosition.Net.Volume)) .WithComments("Exit") .Build(); IReadOnlyList <OrderDraftValidationError> validationErrors = _client.Orders.Drafts.Validate(orderDraft); if (validationErrors.Any()) { throw new Exception($"Exit Order Draft validation error: {validationErrors.First()}"); } _client.Orders.SendOrder(orderDraft); }