Пример #1
0
        private void OnOrderNew(Messages.Order bitfinexOrder)
        {
            if (bitfinexOrder.Status == "ACTIVE")
            {
                var brokerId = bitfinexOrder.Id.ToStringInvariant();

                Order order;
                if (_orderMap.TryGetValue(bitfinexOrder.ClientOrderId, out order))
                {
                    if (CachedOrderIDs.ContainsKey(order.Id))
                    {
                        CachedOrderIDs[order.Id].BrokerId.Clear();
                        CachedOrderIDs[order.Id].BrokerId.Add(brokerId);
                    }
                    else
                    {
                        order.BrokerId.Add(brokerId);
                        CachedOrderIDs.TryAdd(order.Id, order);
                    }

                    OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, OrderFee.Zero, "Bitfinex Order Event")
                    {
                        Status = OrderStatus.Submitted
                    });
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Event invocator for the OrderFilled event
        /// </summary>
        /// <param name="e">The OrderEvent</param>
        private void OnOrderSubmit(BinanceOrderSubmitEventArgs e)
        {
            var brokerId = e.BrokerId;
            var order    = e.Order;

            if (CachedOrderIDs.ContainsKey(order.Id))
            {
                CachedOrderIDs[order.Id].BrokerId.Clear();
                CachedOrderIDs[order.Id].BrokerId.Add(brokerId);
            }
            else
            {
                order.BrokerId.Add(brokerId);
                CachedOrderIDs.TryAdd(order.Id, order);
            }
        }
Пример #3
0
        private bool SubmitOrder(string endpoint, Order order)
        {
            LockStream();

            var payload = new JsonObject();

            payload.Add("request", endpoint);
            payload.Add("nonce", GetNonce().ToString());
            payload.Add("symbol", _symbolMapper.GetBrokerageSymbol(order.Symbol));
            payload.Add("amount", Math.Abs(order.Quantity).ToString(CultureInfo.InvariantCulture));
            payload.Add("side", ConvertOrderDirection(order.Direction));
            payload.Add("type", ConvertOrderType(_algorithm.BrokerageModel.AccountType, order.Type));
            payload.Add("price", GetOrderPrice(order).ToString(CultureInfo.InvariantCulture));

            if (order.BrokerId.Any())
            {
                payload.Add("order_id", long.Parse(order.BrokerId.FirstOrDefault()));
            }

            var orderProperties = order.Properties as BitfinexOrderProperties;

            if (orderProperties != null)
            {
                if (order.Type == OrderType.Limit)
                {
                    payload.Add("is_hidden", orderProperties.Hidden);
                    payload.Add("is_postonly", orderProperties.PostOnly);
                }
            }

            var request = new RestRequest(endpoint, Method.POST);

            request.AddJsonBody(payload.ToString());
            SignRequest(request, payload.ToString());

            var response = ExecuteRestRequest(request);
            var orderFee = OrderFee.Zero;

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var raw = JsonConvert.DeserializeObject <Messages.Order>(response.Content);

                if (string.IsNullOrEmpty(raw?.Id))
                {
                    var errorMessage = $"Error parsing response from place order: {response.Content}";
                    OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, orderFee, "Bitfinex Order Event")
                    {
                        Status = OrderStatus.Invalid, Message = errorMessage
                    });
                    OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Warning, (int)response.StatusCode, errorMessage));

                    UnlockStream();
                    return(true);
                }

                var brokerId = raw.Id;
                if (CachedOrderIDs.ContainsKey(order.Id))
                {
                    CachedOrderIDs[order.Id].BrokerId.Clear();
                    CachedOrderIDs[order.Id].BrokerId.Add(brokerId);
                }
                else
                {
                    order.BrokerId.Add(brokerId);
                    CachedOrderIDs.TryAdd(order.Id, order);
                }

                // Generate submitted event
                OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, orderFee, "Bitfinex Order Event")
                {
                    Status = OrderStatus.Submitted
                });
                Log.Trace($"Order submitted successfully - OrderId: {order.Id}");

                UnlockStream();
                return(true);
            }

            var message = $"Order failed, Order Id: {order.Id} timestamp: {order.Time} quantity: {order.Quantity} content: {response.Content}";

            OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, orderFee, "Bitfinex Order Event")
            {
                Status = OrderStatus.Invalid
            });
            OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Warning, -1, message));

            UnlockStream();
            return(true);
        }
Пример #4
0
        /// <summary>
        /// Creates a new order
        /// </summary>
        /// <param name="order"></param>
        /// <returns></returns>
        public override bool PlaceOrder(Orders.Order order)
        {
            LockStream();

            var req = new RestRequest("/orders", Method.POST);

            dynamic payload = new ExpandoObject();

            payload.size       = Math.Abs(order.Quantity);
            payload.side       = order.Direction.ToString().ToLower();
            payload.type       = ConvertOrderType(order.Type);
            payload.price      = order is LimitOrder ? ((LimitOrder)order).LimitPrice : order is StopMarketOrder ? ((StopMarketOrder)order).StopPrice : 0;
            payload.product_id = ConvertSymbol(order.Symbol);

            if (_algorithm.BrokerageModel.AccountType == AccountType.Margin)
            {
                payload.overdraft_enabled = true;
            }

            req.AddJsonBody(payload);

            GetAuthenticationToken(req);
            var response = RestClient.Execute(req);

            if (response.StatusCode == System.Net.HttpStatusCode.OK && response.Content != null)
            {
                var raw = JsonConvert.DeserializeObject <Messages.Order>(response.Content);

                if (raw == null || raw.Id == null)
                {
                    OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Error, (int)response.StatusCode, "GDAXBrokerage.PlaceOrder: Error parsing response from place order: " + response.Content));
                    UnlockStream();
                    return(false);
                }

                var brokerId = raw.Id;
                if (CachedOrderIDs.ContainsKey(order.Id))
                {
                    CachedOrderIDs[order.Id].BrokerId.Add(brokerId);
                }
                else
                {
                    order.BrokerId.Add(brokerId);
                    CachedOrderIDs.TryAdd(order.Id, order);
                }

                // Add fill splits in all cases; we'll need to handle market fills too.
                FillSplit.TryAdd(order.Id, new GDAXFill(order));

                // Generate submitted event
                OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
                {
                    Status = OrderStatus.Submitted
                });

                OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Information, -1, "GDAXBrokerage.PlaceOrder: Order completed successfully orderid:" + order.Id.ToString()));
                UnlockStream();
                return(true);
            }

            OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
            {
                Status = OrderStatus.Invalid
            });

            var message = $"GDAXBrokerage.PlaceOrder: Order failed Order Id: {order.Id} timestamp: {order.Time} quantity: {order.Quantity} content: {response.Content}";

            OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Error, -1, message));
            UnlockStream();
            return(false);
        }
Пример #5
0
        /// <summary>
        /// Creates a new order
        /// </summary>
        /// <param name="order"></param>
        /// <returns></returns>
        public override bool PlaceOrder(Order order)
        {
            LockStream();

            var req = new RestRequest("/orders", Method.POST);

            dynamic payload = new ExpandoObject();

            payload.size       = Math.Abs(order.Quantity);
            payload.side       = order.Direction.ToString().ToLower();
            payload.type       = ConvertOrderType(order.Type);
            payload.price      = (order as LimitOrder)?.LimitPrice ?? ((order as StopMarketOrder)?.StopPrice ?? 0);
            payload.product_id = ConvertSymbol(order.Symbol);

            if (_algorithm.BrokerageModel.AccountType == AccountType.Margin)
            {
                payload.overdraft_enabled = true;
            }

            var orderProperties = order.Properties as GDAXOrderProperties;

            if (orderProperties != null)
            {
                if (order.Type == OrderType.Limit)
                {
                    payload.post_only = orderProperties.PostOnly;
                }
            }

            req.AddJsonBody(payload);

            GetAuthenticationToken(req);
            var response = ExecuteRestRequest(req, GdaxEndpointType.Private);

            if (response.StatusCode == HttpStatusCode.OK && response.Content != null)
            {
                var raw = JsonConvert.DeserializeObject <Messages.Order>(response.Content);

                if (raw?.Id == null)
                {
                    var errorMessage = $"Error parsing response from place order: {response.Content}";
                    OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
                    {
                        Status = OrderStatus.Invalid, Message = errorMessage
                    });
                    OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Warning, (int)response.StatusCode, errorMessage));

                    UnlockStream();
                    return(true);
                }

                if (raw.Status == "rejected")
                {
                    var errorMessage = "Reject reason: " + raw.RejectReason;
                    OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
                    {
                        Status = OrderStatus.Invalid, Message = errorMessage
                    });
                    OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Warning, (int)response.StatusCode, errorMessage));

                    UnlockStream();
                    return(true);
                }

                var brokerId = raw.Id;
                if (CachedOrderIDs.ContainsKey(order.Id))
                {
                    CachedOrderIDs[order.Id].BrokerId.Add(brokerId);
                }
                else
                {
                    order.BrokerId.Add(brokerId);
                    CachedOrderIDs.TryAdd(order.Id, order);
                }

                // Add fill splits in all cases; we'll need to handle market fills too.
                FillSplit.TryAdd(order.Id, new GDAXFill(order));

                // Generate submitted event
                OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
                {
                    Status = OrderStatus.Submitted
                });
                OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Information, -1, "Order completed successfully orderid:" + order.Id));

                UnlockStream();
                return(true);
            }

            var message = $"Order failed, Order Id: {order.Id} timestamp: {order.Time} quantity: {order.Quantity} content: {response.Content}";

            OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
            {
                Status = OrderStatus.Invalid
            });
            OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Warning, -1, message));

            UnlockStream();
            return(true);
        }
Пример #6
0
        /// <summary>
        /// Creates a new order
        /// </summary>
        /// <param name="order"></param>
        /// <returns></returns>
        public override bool PlaceOrder(Orders.Order order)
        {
            var req = new RestRequest("/orders", Method.POST);

            dynamic payload = new ExpandoObject();

            payload.size       = Math.Abs(order.Quantity);
            payload.side       = order.Direction.ToString().ToLower();
            payload.type       = ConvertOrderType(order.Type);
            payload.price      = order is LimitOrder ? ((LimitOrder)order).LimitPrice : order is StopMarketOrder ? ((StopMarketOrder)order).StopPrice : 0;
            payload.product_id = ConvertSymbol(order.Symbol);

            if (_algorithm.BrokerageModel.AccountType == AccountType.Margin)
            {
                payload.overdraft_enabled = true;
            }

            req.AddJsonBody(payload);

            GetAuthenticationToken(req);
            var response = RestClient.Execute(req);

            if (response.StatusCode == System.Net.HttpStatusCode.OK && response.Content != null)
            {
                dynamic raw = JsonConvert.DeserializeObject <dynamic>(response.Content);

                if (raw == null || raw.id == null)
                {
                    Log.Error("GDAXBrokerage.PlaceOrder: Error parsing response from place order");

                    return(false);
                }

                string brokerId = raw.id;
                if (CachedOrderIDs.ContainsKey(order.Id))
                {
                    CachedOrderIDs[order.Id].BrokerId.Add(brokerId);
                }
                else
                {
                    order.BrokerId.Add(brokerId);
                    CachedOrderIDs.TryAdd(order.Id, order);
                }

                if (order.Type != OrderType.Market)
                {
                    FillSplit.TryAdd(order.Id, new GDAXFill(order));
                }

                OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
                {
                    Status = OrderStatus.Submitted
                });

                if (order.Type == OrderType.Market)
                {
                    OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, (decimal)raw.fill_fees, "GDAX Order Event")
                    {
                        Status = OrderStatus.Filled
                    });
                    Orders.Order outOrder = null;
                    CachedOrderIDs.TryRemove(order.Id, out outOrder);
                }

                Log.Trace("GDAXBrokerage.PlaceOrder: Order completed successfully orderid:" + order.Id.ToString());
                return(true);
            }

            OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, 0, "GDAX Order Event")
            {
                Status = OrderStatus.Invalid
            });
            Log.Trace("GDAXBrokerage.PlaceOrder: Order failed Order Id: " + order.Id + " timestamp:" + order.Time + " quantity: " + order.Quantity.ToString()
                      + " content:" + response.Content);
            return(false);
        }