示例#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");
                }
            }
        }
示例#2
0
 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");
 }
示例#3
0
        //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));
        }
示例#4
0
 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);
 }
示例#5
0
 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));
 }