예제 #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
파일: data.cs 프로젝트: zoakes/GAIN_Modular
 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);
     }
 }
예제 #3
0
        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);
                    }
                }
            }
        }
예제 #4
0
파일: data.cs 프로젝트: zoakes/GAIN_Modular
 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);
     }
 }
예제 #5
0
        //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
        }
예제 #6
0
파일: data.cs 프로젝트: zoakes/GAIN_Modular
 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");
 }
예제 #7
0
파일: data.cs 프로젝트: zoakes/GAIN_Modular
        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));
        }
예제 #8
0
        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...");
        }
예제 #9
0
 //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);
 }
예제 #10
0
파일: data.cs 프로젝트: zoakes/GAIN_Modular
 private static void RegisterOnBarsReceived(GF.Api.IGFClient client)
 {
     client.Subscriptions.Bars.BarsReceived += GFClient_OnBarsReceived;
 }
예제 #11
0
        //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;
        }
예제 #12
0
 private void GFClient_OnDisconnected(GF.Api.IGFClient client, GF.Api.Connection.DisconnectedEventArgs disconnectedEventArgs)
 {
     _resultActions.Clear();
 }
예제 #13
0
 public PositionCloser(GF.Api.IGFClient client)
 {
     _client = client;
     _client.Connection.Aggregate.Disconnected += GFClient_OnDisconnected;
     _client.Orders.OrderStateChanged          += GFClient_OnOrderStateChanged;
 }