Exemplo n.º 1
0
        /// <summary>
        /// Sets an account. Returns true if the account was updated.
        /// </summary>
        /// <param name="account"></param>
        /// <returns></returns>
        public async Task <bool> SetAccountAsync(Account account, DbContext context = null)
        {
            context = context ?? this.DbContext;

            if (await account.SaveAsync(context))
            {
                OnAccountAdd?.Invoke(account);
                return(true);
            }
            else
            {
                OnAccountUpdate?.Invoke(account);
                return(false);
            }
        }
        public async Task Connect()
        {
            try
            {
                if (connection.IsConnected)
                {
                    return;
                }
                //initialize a connection
                connection = new Connection(Config);
                //subscribe to events
                connection.OnClose     += Connection_OnClose;
                connection.OnException += Connection_OnException;
                //try to connect
                await connection.Connect();

                //fetch current account state
                AccountState = await GetAccountData();

                //track state on the client side
                if (AccountState != null && OnAccountUpdate != null)
                {
                    _ = Task.Factory.StartNew(() => OnAccountUpdate.Invoke(AccountState));
                }
            }
            catch (Exception e)
            {
                //failed to connect - dispose everything
                if (connection != null)
                {
                    await connection.CloseConnection(WebSocketCloseStatus.ProtocolError);

                    connection.Dispose();
                    connection = null;
                }
                throw new Exception("Failed to connect to Centaurus Alpha server", e);
            }
        }
 private void HandleQuantumResult(MessageEnvelope envelope)
 {
     if (!(envelope.Message is IEffectsContainer effectsMessage))
     {
         return;
     }
     if (effectsMessage.Effects.Count > 0)
     {
         try
         {
             //apply effects to the client-side state
             foreach (var effect in effectsMessage.Effects)
             {
                 AccountState.ApplyAccountStateChanges(effect);
             }
             //notify subscribers about the account state update
             OnAccountUpdate?.Invoke(AccountState);
         }
         catch (Exception e)
         {
             OnException?.Invoke(e);
         }
     }
 }
Exemplo n.º 4
0
 private void handleAccountUpdates(
     JsonAccountUpdate update)
 {
     OnAccountUpdate?.Invoke(update);
 }
 private void handleAccountUpdate(
     JToken token) =>
     OnAccountUpdate.DeserializeAndInvoke<IAccountUpdate, JsonAccountUpdate>(token);
Exemplo n.º 6
0
 private void HandleAccountUpdates(IAccountUpdate update)
 {
     OnAccountUpdate?.Invoke(update);
 }
Exemplo n.º 7
0
        private void ResultMessageHandler(MessageEnvelope envelope)
        {
            lock (processedEffectsMessages)
            {
                if (AccountData == null ||
                    !(envelope.Message is IEffectsContainer effectsMessage) ||
                    processedEffectsMessages.Any(r => r == envelope.Message.MessageId))
                {
                    return;
                }
                RegisterNewEffectsMessage(envelope.Message.MessageId);
                try
                {
                    foreach (var effect in effectsMessage.Effects)
                    {
                        switch (effect)
                        {
                        case NonceUpdateEffect nonceUpdateEffect:
                            AccountData.Nonce = nonceUpdateEffect.Nonce;
                            break;

                        case BalanceCreateEffect balanceCreateEffect:
                            AccountData.AddBalance(balanceCreateEffect.Asset, constellation);
                            break;

                        case BalanceUpdateEffect balanceUpdateEffect:
                            AccountData.UpdateBalance(balanceUpdateEffect.Asset, balanceUpdateEffect.Amount);
                            break;

                        case OrderPlacedEffect orderPlacedEffect:
                        {
                            AccountData.AddOrder(orderPlacedEffect.OrderId, orderPlacedEffect.Amount, orderPlacedEffect.Price, constellation);
                            var decodedId = OrderIdConverter.Decode(orderPlacedEffect.OrderId);
                            if (decodedId.Side == OrderSide.Buy)
                            {
                                AccountData.UpdateLiabilities(0, orderPlacedEffect.QuoteAmount);
                            }
                            else
                            {
                                AccountData.UpdateLiabilities(decodedId.Asset, orderPlacedEffect.Amount);
                            }
                        }
                        break;

                        case OrderRemovedEffect orderRemoveEffect:
                        {
                            AccountData.RemoveOrder(orderRemoveEffect.OrderId);
                            var decodedId = OrderIdConverter.Decode(orderRemoveEffect.OrderId);
                            if (decodedId.Side == OrderSide.Buy)
                            {
                                AccountData.UpdateLiabilities(0, -orderRemoveEffect.QuoteAmount);
                            }
                            else
                            {
                                AccountData.UpdateLiabilities(decodedId.Asset, -orderRemoveEffect.Amount);
                            }
                        }
                        break;

                        case TradeEffect tradeEffect:
                        {
                            AccountData.UpdateOrder(tradeEffect.OrderId, tradeEffect.AssetAmount);

                            var decodedId = OrderIdConverter.Decode(tradeEffect.OrderId);
                            if (decodedId.Side == OrderSide.Buy)
                            {
                                if (!tradeEffect.IsNewOrder)
                                {
                                    AccountData.UpdateLiabilities(0, -tradeEffect.QuoteAmount);
                                }
                                AccountData.UpdateBalance(0, -tradeEffect.QuoteAmount);
                                AccountData.UpdateBalance(decodedId.Asset, tradeEffect.AssetAmount);
                            }
                            else
                            {
                                if (!tradeEffect.IsNewOrder)
                                {
                                    AccountData.UpdateLiabilities(decodedId.Asset, -tradeEffect.AssetAmount);
                                }
                                AccountData.UpdateBalance(decodedId.Asset, -tradeEffect.AssetAmount);
                                AccountData.UpdateBalance(0, tradeEffect.QuoteAmount);
                            }
                        }
                        break;

                        case WithdrawalCreateEffect withdrawalCreateEffect:
                            foreach (var withdrawalItem in withdrawalCreateEffect.Items)
                            {
                                AccountData.UpdateLiabilities(withdrawalItem.Asset, withdrawalItem.Amount);
                            }
                            break;

                        case WithdrawalRemoveEffect withdrawalRemoveEffect:
                            foreach (var withdrawalItem in withdrawalRemoveEffect.Items)
                            {
                                if (withdrawalRemoveEffect.IsSuccessful)
                                {
                                    AccountData.UpdateBalance(withdrawalItem.Asset, -withdrawalItem.Amount);
                                }
                                AccountData.UpdateLiabilities(withdrawalItem.Asset, -withdrawalItem.Amount);
                            }
                            break;

                        default:
                            break;
                        }
                    }
                    OnAccountUpdate?.Invoke(AccountData);
                }
                catch (Exception exc)
                {
                    OnException?.Invoke(exc);
                }
            }
        }
Exemplo n.º 8
0
 protected void OnAccountUpdateHandler(AccountDataEventArgs e)
 {
     OnAccountUpdate?.Invoke(this, e);
 }