Example #1
0
        /*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");
                }
            }
        }
Example #2
0
        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);
        }