示例#1
0
        /// <summary>
        /// Subscribe to summary (ticker) data
        /// </summary>
        /// <param name="symbols">Trading Symbols</param>
        /// <param name="onData">On Data Handler</param>
        /// <returns></returns>
        public virtual async Task <CallResult <UpdateSubscription> > SubscribeToSummaryAsync(IEnumerable <string> symbols, Action <BitMaxSocketSummary> onData)
        {
            var internalHandler = new Action <BitMaxSocketBarChannelResponse <BitMaxSocketSummary> >(data =>
            {
                data.Data.Symbol = data.Symbol;
                onData(data.Data);
            });

            var request = new BitMaxSocketCashChannelRequest(NextRequestId(), BitMaxSocketCashChannelOperation.Subscribe, "summary:" + string.Join(",", symbols));

            return(await Subscribe(request, "summary", false, internalHandler).ConfigureAwait(false));
        }
示例#2
0
        /// <summary>
        /// The data field is a list containing one or more trade objects. The server may combine consecutive trades with the same price and bm value into one aggregated item. Each trade object contains the following fields:
        /// </summary>
        /// <param name="symbols">Trading Symbols List</param>
        /// <param name="period">Candle Period</param>
        /// <param name="onData">On Data Handler</param>
        /// <returns></returns>
        public virtual async Task <CallResult <UpdateSubscription> > SubscribeToCandlesAsync(IEnumerable <string> symbols, BitMaxPeriod period, Action <BitMaxSocketCandle> onData)
        {
            var internalHandler = new Action <BitMaxSocketBarChannelResponse <BitMaxSocketCandle> >(data =>
            {
                data.Data.Symbol = data.Symbol;
                onData(data.Data);
            });

            var period_s = JsonConvert.SerializeObject(period, new PeriodConverter(false));
            var request  = new BitMaxSocketCashChannelRequest(NextRequestId(), BitMaxSocketCashChannelOperation.Subscribe, "bar:" + period_s + ":" + string.Join(",", symbols));

            return(await Subscribe(request, "bar", false, internalHandler).ConfigureAwait(false));
        }
示例#3
0
        /// <summary>
        /// The data field is a list containing one or more trade objects. The server may combine consecutive trades with the same price and bm value into one aggregated item. Each trade object contains the following fields:
        /// </summary>
        /// <param name="symbols">Trading Symbols List</param>
        /// <param name="onData">On Data Handler</param>
        /// <returns></returns>
        public virtual async Task <CallResult <UpdateSubscription> > SubscribeToTradesAsync(IEnumerable <string> symbols, Action <BitMaxSocketTrade> onData)
        {
            var internalHandler = new Action <BitMaxSocketChannelResponse <IEnumerable <BitMaxSocketTrade> > >(data =>
            {
                foreach (var d in data.Data)
                {
                    d.Symbol = data.Symbol;
                    onData(d);
                }
            });

            var request = new BitMaxSocketCashChannelRequest(NextRequestId(), BitMaxSocketCashChannelOperation.Subscribe, "trades:" + string.Join(",", symbols));

            return(await Subscribe(request, "trades", false, internalHandler).ConfigureAwait(false));
        }
示例#4
0
        /// <summary>
        /// Note: once you subscribe to the order channel, you will start receiving messages from the balance channel automatically. If you unsubscribe from the order channel, you will simultaneously unsubscribe from the balance channel.
        /// You need to specify the account when subscribing to the order channel. You could specify account category cash, margin, or specific account id.
        /// Order Messages:
        /// - You can track the state change of each order thoughout its life cycle with the order update message (m=order). The data field is a single order udpate object. Each order update object contains the following fields:
        /// Balance Messages:
        /// - You will also receive balance update message (m=balance) for the asset balance updates not caused by orders. For instance, when you make wallet deposits/withdrawals, or when you transfer asset from the cash account to the margin account, you will receive balance update message.
        /// </summary>
        /// <param name="cashAccountType">Cash Account Type</param>
        /// <param name="onSpotBalanceData">On Data Handler</param>
        /// <param name="onMarginBalanceData">On Data Handler</param>
        /// <param name="onCashOrderData">On Data Handler</param>
        /// <returns></returns>
        protected virtual async Task <CallResult <UpdateSubscription> > SubscribeToBalanceAndOrdersAsync(BitMaxAccountType cashAccountType, Action <BitMaxSocketSpotBalanceExt> onSpotBalanceData, Action <BitMaxSocketMarginBalanceExt> onMarginBalanceData, Action <BitMaxSocketCashOrderExt> onCashOrderData)
        {
            var internalHandler = new Action <BitMaxSocketAccountResponse <object> >(data =>
            {
                var data_s = data.Data.ToString();
                if (data.Method == "balance")
                {
                    if (data.AccountType == BitMaxAccountType.Spot)
                    {
                        var balance         = JsonConvert.DeserializeObject <BitMaxSocketSpotBalanceExt>(data_s);
                        balance.AccountId   = data.AccountId;
                        balance.AccountType = data.AccountType;
                        if (onSpotBalanceData != null)
                        {
                            onSpotBalanceData(balance);
                        }
                    }
                    else if (data.AccountType == BitMaxAccountType.Margin)
                    {
                        var balance         = JsonConvert.DeserializeObject <BitMaxSocketMarginBalanceExt>(data_s);
                        balance.AccountId   = data.AccountId;
                        balance.AccountType = data.AccountType;
                        if (onMarginBalanceData != null)
                        {
                            onMarginBalanceData(balance);
                        }
                    }
                }
                else if (data.Method == "order")
                {
                    var order         = JsonConvert.DeserializeObject <BitMaxSocketCashOrderExt>(data_s);
                    order.AccountId   = data.AccountId;
                    order.AccountType = data.AccountType;
                    if (onCashOrderData != null)
                    {
                        onCashOrderData(order);
                    }
                }

                //data.Data.Symbol = data.Symbol;
                //onData(data.Data);
            });

            var request = new BitMaxSocketCashChannelRequest(NextRequestId(), BitMaxSocketCashChannelOperation.Subscribe, "order:" + (cashAccountType == BitMaxAccountType.Spot ? "cash" : "margin"));

            return(await Subscribe(request, "order", true, internalHandler).ConfigureAwait(false));
        }
示例#5
0
        public virtual async Task <CallResult <UpdateSubscription> > SubscribeToFuturesOrdersAsync(Action <BitMaxSocketFuturesOrderExt> onOrderData)
        {
            var internalHandler = new Action <BitMaxSocketAccountResponse <object> >(data =>
            {
                var data_s = data.Data.ToString();
                if (data.Method == "order")
                {
                    var order         = JsonConvert.DeserializeObject <BitMaxSocketFuturesOrderExt>(data_s);
                    order.AccountId   = data.AccountId;
                    order.AccountType = data.AccountType;
                    if (onOrderData != null)
                    {
                        onOrderData(order);
                    }
                }

                //data.Data.Symbol = data.Symbol;
                //onData(data.Data);
            });

            var request = new BitMaxSocketCashChannelRequest(NextRequestId(), BitMaxSocketCashChannelOperation.Subscribe, "order:futures");

            return(await Subscribe(request, "order:futures", true, internalHandler).ConfigureAwait(false));
        }