Exemple #1
0
        // Token: 0x060001E0 RID: 480 RVA: 0x00007F2C File Offset: 0x0000612C
        public override List <Currency> GetBalance()
        {
            List <Currency> result;

            try
            {
                List <Currency>  list     = new List <Currency>();
                BalancesResponse balances = this._client.GetBalances();
                list.Add(new Currency
                {
                    Name   = "BTC_EXCH",
                    Amount = balances.exchange.BTC.ToString()
                });
                list.Add(new Currency
                {
                    Name   = "BTC_DSPT",
                    Amount = balances.deposit.BTC.ToString()
                });
                list.Add(new Currency
                {
                    Name   = "BTC_TRDNG",
                    Amount = balances.trading.BTC.ToString()
                });
                list = (from x in list
                        orderby x.Amount descending
                        select x).ToList <Currency>();
                result = list;
            }
            catch
            {
                result = new List <Currency>();
            }
            return(result);
        }
Exemple #2
0
        public BalancesResponse GetBalances()
        {
            BalancesRequest  req      = new BalancesRequest(Nonce);
            string           response = SendRequest(req, "GET");
            BalancesResponse resp     = BalancesResponse.FromJSON(response);

            return(resp);
        }
Exemple #3
0
        public BitfinexRestAPI()
        {
            var secret = ConfigurationManager.AppSettings["ApiSecret"];
            var key    = ConfigurationManager.AppSettings["ApiKey"];


            api = new BitfinexApiV1(key, secret);

            bal = api.GetBalances();
        }
Exemple #4
0
        public override async Task <BalancesResponse> GetBalances(Empty request, ServerCallContext context)
        {
            var walletId = context.GetHttpContext().User.GetWalletId();
            var balances = await _balanceService.GetBalancesAsync(walletId);

            var res = new BalancesResponse();

            res.Payload.AddRange(_mapper.Map <List <Balance> >(balances));

            return(res);
        }
Exemple #5
0
        public void HandlePurchasingNorbertsGambitRequirement(PendingOrder curNgRequirement, bool firstTime = true)
        {
            if (firstTime)
            {
                Console.WriteLine("Currency conversion (Norberts Gambit) is required to purchase some securities in USD.");
            }

            if (curNgRequirement.Quantity <= 0)
            {
                Console.WriteLine("Order quantity reduced to zero.");
                Console.WriteLine("Skipping order.");
                return;
            }

            if (curNgRequirement.TargetValue < ACCEPTABLE_NG_VALUE_THRESHOLD)
            {
                Console.WriteLine("Current conversion amount is below acceptable threshold of: " + ACCEPTABLE_NG_VALUE_THRESHOLD);
                Console.WriteLine("Skipping conversion.");
                return;
            }

            var orderImpact           = GetMarketOrderImpact(curNgRequirement);
            BalancesResponse balances = GetBalances(curNgRequirement.AccountNumber);

            var cashLevel = balances.perCurrencyBalances.FirstOrDefault(p => p.currency == curNgRequirement.Symbol.currency).cash;

            if (cashLevel < Math.Abs(orderImpact.buyingPowerEffect))
            {
                if (firstTime)
                {
                    Console.WriteLine("Order of " + Math.Abs(orderImpact.buyingPowerEffect) + " exceeds current cash level: " + cashLevel);
                    Console.WriteLine("Attempting to reduce quantity purchased...");

                    curNgRequirement.Quantity = (int)Math.Floor(cashLevel / orderImpact.price);
                }
                else
                {
                    curNgRequirement.Quantity -= 1;
                }

                HandlePurchasingNorbertsGambitRequirement(curNgRequirement, false);
                return;
            }

            Console.WriteLine("Proceeding to purchace $" + Math.Abs(orderImpact.buyingPowerEffect) + " in " + NG_SYMBOL_CAD);
            var success = CreateMarketOrder(curNgRequirement);

            if (success)
            {
                EmailHelper.SendNorbertsGambitEmail(curNgRequirement.AccountNumber, curNgRequirement.Quantity, db);
            }
        }
Exemple #6
0
        public override async Task <BalancesResponse> GetBalances(Empty request, ServerCallContext context)
        {
            var clientId = context.GetClientId();
            var balances = await _balancesClient.GetClientBalances(clientId);

            var res = new BalancesResponse {
                Body = new BalancesResponse.Types.Body()
            };

            res.Body.Balances.AddRange(_mapper.Map <List <Balance> >(balances));

            return(res);
        }
Exemple #7
0
 public void OutputFinalResults()
 {
     foreach (var curAccount in curUser.accounts)
     {
         Console.WriteLine("\nAccount: " + curAccount.type);
         Console.WriteLine("Account number: " + curAccount.number);
         BalancesResponse balances = GetBalances(curAccount.number);
         Console.WriteLine("CAD Cash: " + balances.perCurrencyBalances.FirstOrDefault(p => p.currency == CURRENCY_CAD).cash);
         Console.WriteLine("USD Cash: " + balances.perCurrencyBalances.FirstOrDefault(p => p.currency == CURRENCY_USD).cash);
         var breakdownPendingOrders = GetAccountBreakdown(curAccount.number);
         Console.WriteLine("\n-- Account Breakdown --");
         OutputPendingOrdersTable(breakdownPendingOrders);
     }
 }
Exemple #8
0
        public List <PendingOrder> GetPendingOrdersForAccount(string accountNumber)
        {
            var pendingOrders = new List <PendingOrder>();

            PositionsResponse positions = GetPositions(accountNumber);
            BalancesResponse  balances  = GetBalances(accountNumber);

            var accountCategories = db.AccountCategories.Where(p => p.Account.Number == accountNumber);

            foreach (var curAccountCategory in accountCategories)
            {
                foreach (var curStockTarget in curAccountCategory.Category.StockTargets)
                {
                    var symbol = GetSymbol(curStockTarget.Symbol);
                    var quote  = GetQuote(symbol.symbolId);

                    var curPosition = positions.positions.FirstOrDefault(p => p.symbol == curStockTarget.Symbol);

                    double totalEquity     = balances.combinedBalances.FirstOrDefault(p => p.currency == symbol.currency).totalEquity;
                    double curPercentOwned = curPosition != null ? (curPosition.currentMarketValue / totalEquity) * 100 : 0;

                    double accountTargetPercent = ((curAccountCategory.Percent / 100) * (curStockTarget.TargetPercent / 100)) * 100;
                    double percentOfTarget      = (curPercentOwned / accountTargetPercent) * 100;

                    if (percentOfTarget < 100)
                    {
                        var valueToBuy     = ((accountTargetPercent - curPercentOwned) / 100) * totalEquity;
                        int numSharesToBuy = (int)Math.Floor(valueToBuy / quote.askPrice);

                        if (numSharesToBuy > 0)
                        {
                            pendingOrders.Add(new PendingOrder()
                            {
                                AccountNumber = accountNumber,
                                Symbol        = symbol,
                                Quote         = quote,
                                IsBuyOrder    = true,
                                TargetValue   = valueToBuy,
                                Quantity      = numSharesToBuy,
                                TargetPercent = accountTargetPercent,
                                OwnedPercent  = curPercentOwned,
                            });
                        }
                    }
                }
            }

            return(pendingOrders);
        }
Exemple #9
0
        public bool HandlePurchaseOfPendingOrder(PendingOrder pendingOrder, bool firstTime = true)
        {
            if (firstTime)
            {
                Console.WriteLine("\nAttempting to purchase: " + pendingOrder.Symbol.symbol + " on account # " + pendingOrder.AccountNumber);
            }

            if (pendingOrder.Quantity <= 0)
            {
                Console.WriteLine("Order quantity reduced to zero.");
                Console.WriteLine("Skipping order.");
                return(false);
            }

            var orderImpact = GetMarketOrderImpact(pendingOrder);

            if (orderImpact.estimatedCommissions / (orderImpact.price * pendingOrder.Quantity) > ACCEPTABLE_COMMISSION_PERCENT_THRESHOLD)
            {
                Console.WriteLine("Trade value calculation: " + orderImpact.tradeValueCalculation);
                Console.WriteLine("Commission: " + orderImpact.estimatedCommissions);

                Console.WriteLine("Commissions greater than " + ACCEPTABLE_COMMISSION_PERCENT_THRESHOLD * 100 + "% of value purchased.");
                Console.WriteLine("Skipping order.");
                return(false);
            }

            BalancesResponse balances = GetBalances(pendingOrder.AccountNumber);
            var cashLevel             = balances.perCurrencyBalances.FirstOrDefault(p => p.currency == pendingOrder.Symbol.currency).cash;

            if (cashLevel < Math.Abs(orderImpact.buyingPowerEffect))
            {
                if (firstTime)
                {
                    Console.WriteLine("Order of " + Math.Abs(orderImpact.buyingPowerEffect) + " exceeds current cash level: " + cashLevel);
                    Console.WriteLine("Attempting to reduce quantity purchased...");

                    pendingOrder.Quantity = (int)Math.Floor(cashLevel / orderImpact.price);
                }
                else
                {
                    pendingOrder.Quantity -= 1;
                }

                return(HandlePurchaseOfPendingOrder(pendingOrder, false));
            }

            return(CreateMarketOrder(pendingOrder));
        }
        public async Task <ActionResult> BalanceInformation()
        {
            var memberApi = GetMemberApiProxy(Request);

            BalancesResponse   balances    = null;
            BalanceSetResponse balansesSet = null;

            try
            {
                balances = await memberApi.GetBalancesAsync(new BalancesRequest());

                balansesSet = await memberApi.GetBalancesSetAsync();
            }
            catch (MemberApiProxyException) { }

            var settings = new AppSettings();
            var brandId  = settings.BrandId;

            var offlineDeposit = await memberApi.GetOfflineDepositFormDataAsync(brandId);

            var fundTransfer = await memberApi.GetFundTransferFormDataAsync(brandId);

            var withdrawal = await memberApi.GetWithdrawalFormDataAsync(brandId);

            var pedingDeposits = await memberApi.GetPendingDeposits();

            var wallets = await memberApi.GetWalletsAsync(brandId);

            var onlineDeposit = await memberApi.GetOnlineDepositFormDataAsync(brandId);

            var model = new BalanceInformationModel
            {
                Wallets           = wallets,
                Balances          = balances,
                OfflineDeposit    = offlineDeposit,
                OnlineDeposit     = onlineDeposit,
                FundTransfer      = fundTransfer,
                Withdrawal        = withdrawal,
                PendingDeposits   = pedingDeposits,
                WalletsBalanceSet = balansesSet
            };

            return(View(model));
        }
Exemple #11
0
        public override async Task <BalancesResponse> GetBalances(Empty request, ServerCallContext context)
        {
            var session  = SessionFromContext(context);
            var balances = await _matchingEngineClient.Balances.GetAllAsync(new BalancesGetAllRequest
            {
                BrokerId = session.TenantId,
                WalletId = (ulong)session.ClientId,
            });

            var response = new BalancesResponse();

            foreach (var balance in balances.Balances)
            {
                response.Payload.Add(new Balance
                {
                    AssetId   = balance.AssetId,
                    Available = balance.Amount.ToString(CultureInfo.InvariantCulture),
                    Reserved  = balance.Reserved.ToString(CultureInfo.InvariantCulture),
                    Timestamp = balances.Timestamp
                });
            }

            return(response);
        }
Exemple #12
0
        public bool CreateMarketOrder(string accountNumber, string symbol, int symbolId, bool isBuyOrder, int quantity)
        {
            if (quantity <= 0)
            {
                throw new Exception("Attempting market order of 0 quantity.");
            }

            var action      = isBuyOrder ? "Buy" : "Sell";
            var orderImpact = GetMarketOrderImpact(accountNumber, symbolId, isBuyOrder, quantity);

            if (IS_LIVE)
            {
                BalancesResponse balances = GetBalances(accountNumber);
                var cashLevelCAD          = balances.perCurrencyBalances.FirstOrDefault(p => p.currency == CURRENCY_CAD).cash;
                var cashLevelUSD          = balances.perCurrencyBalances.FirstOrDefault(p => p.currency == CURRENCY_USD).cash;

                Console.WriteLine("\n-- Attempthing market order --");
                Console.WriteLine("Account: " + accountNumber);
                Console.WriteLine("Symbol: " + symbol);
                Console.WriteLine("Action: " + action);
                Console.WriteLine("Value: " + orderImpact.tradeValueCalculation);
                Console.WriteLine("Estimated Commissions: " + orderImpact.estimatedCommissions);
                Console.WriteLine("Buying Power Effect: " + orderImpact.buyingPowerEffect);
                Console.WriteLine("Current Cash CAD: " + cashLevelCAD);
                Console.WriteLine("Current Cash USD: " + cashLevelUSD);

                Console.WriteLine("Allow? Y for yes");
                var input = Console.ReadLine().Trim();

                if (input != "y" && input != "Y")
                {
                    Console.WriteLine("Market order cancelled.");
                    return(false);
                }
            }

            if (orderImpact.buyingPowerResult < 0)
            {
                throw new Exception("Order would cause negative buying power.");
            }

            if (orderImpact.estimatedCommissions / (orderImpact.price * quantity) > ACCEPTABLE_COMMISSION_PERCENT_THRESHOLD)
            {
                throw new Exception("Commissions greater than " + ACCEPTABLE_COMMISSION_PERCENT_THRESHOLD * 100 + "% of value purchased.");
            }

            var request = new RestRequest("/v1/accounts/{accountNumber}/orders", Method.POST);

            request.AddUrlSegment("accountNumber", accountNumber);

            var body = new
            {
                accountNumber  = accountNumber,
                symbolId       = symbolId,
                quantity       = quantity,
                isAllOrNone    = false,
                isAnonymous    = false,
                orderType      = "Market",
                timeInForce    = "Day",
                action         = action,
                primaryRoute   = "AUTO",
                secondaryRoute = "AUTO",
            };

            request.RequestFormat = DataFormat.Json;
            request.AddBody(body);

            var response = client.Execute(request);

            if (response.StatusCode == HttpStatusCode.OK)
            {
                Console.WriteLine("-- Create Market Order Post --");
                Console.WriteLine("Action: " + action);
                Console.WriteLine("Symbol: " + symbol);
                Console.WriteLine("Quantity: " + quantity);
                Console.WriteLine("Response: " + response.Content);
                Console.WriteLine("");
                return(true);
            }
            else
            {
                throw new Exception("Create market order request failed.");
            }
        }
Exemple #13
0
        public List <PendingOrder> GetAccountBreakdown(string accountNumber)
        {
            var pendingOrders = new List <PendingOrder>();

            PositionsResponse positions = GetPositions(accountNumber);
            BalancesResponse  balances  = GetBalances(accountNumber);

            var accountCategories = db.AccountCategories.Where(p => p.Account.Number == accountNumber);

            foreach (var curAccountCategory in accountCategories)
            {
                foreach (var curStockTarget in curAccountCategory.Category.StockTargets)
                {
                    var symbol = GetSymbol(curStockTarget.Symbol);
                    var quote  = GetQuote(symbol.symbolId);

                    var    curPosition     = positions.positions.FirstOrDefault(p => p.symbol == curStockTarget.Symbol);
                    double curPercentOwned = 0;
                    double curValue        = 0;
                    int    curQuantity     = 0;
                    if (curPosition != null)
                    {
                        double totalEquity = balances.combinedBalances.FirstOrDefault(p => p.currency == symbol.currency).totalEquity;
                        curPercentOwned = curPosition != null ? (curPosition.currentMarketValue / totalEquity) * 100 : 0;
                        curValue        = curPosition.currentMarketValue;
                        curQuantity     = (int)curPosition.openQuantity;
                    }

                    double accountTargetPercent = ((curAccountCategory.Percent / 100) * (curStockTarget.TargetPercent / 100)) * 100;

                    pendingOrders.Add(new PendingOrder()
                    {
                        AccountNumber = accountNumber,
                        Symbol        = symbol,
                        Quote         = quote,
                        TargetValue   = curValue,
                        Quantity      = curQuantity,
                        TargetPercent = accountTargetPercent,
                        OwnedPercent  = curPercentOwned,
                    });
                }
            }

            // add owned stocks that are not on the target list
            foreach (var curPosition in positions.positions)
            {
                if (pendingOrders.FirstOrDefault(p => p.Symbol.symbol == curPosition.symbol) == null)
                {
                    var symbol = GetSymbol(curPosition.symbol);
                    var quote  = GetQuote(symbol.symbolId);

                    double totalEquity     = balances.combinedBalances.FirstOrDefault(p => p.currency == symbol.currency).totalEquity;
                    double curPercentOwned = curPosition != null ? (curPosition.currentMarketValue / totalEquity) * 100 : 0;

                    pendingOrders.Add(new PendingOrder()
                    {
                        AccountNumber = accountNumber,
                        Symbol        = symbol,
                        Quote         = quote,
                        TargetValue   = curPosition.currentMarketValue,
                        Quantity      = (int)curPosition.openQuantity,
                        TargetPercent = 0,
                        OwnedPercent  = curPercentOwned,
                    });
                }
            }

            return(pendingOrders);
        }
Exemple #14
0
        public List <PendingOrder> GetNorbertsGambitRequirements(List <PendingOrder> pendingOrders)
        {
            var NGSymbolUSD = GetSymbol(NG_SYMBOL_USD);
            var NGQuoteUSD  = GetQuote(NGSymbolUSD.symbolId);

            var pendingNGOrders = new List <PendingOrder>();

            var pendingOrderGroups = pendingOrders.GroupBy(p => p.AccountNumber);

            foreach (var curPendingOrderGroup in pendingOrderGroups)
            {
                var curAccountNumber = curPendingOrderGroup.Key;

                // sell all NG stocks that are already converted to US
                SellAllUSNGStocks(curAccountNumber);

                // get total USD required
                double requiredUSD = 0;
                foreach (var curPendingOrder in curPendingOrderGroup)
                {
                    if (curPendingOrder.Symbol.currency == CURRENCY_USD)
                    {
                        requiredUSD += curPendingOrder.TargetValue;
                    }
                }

                //get total USD that is waiting to be converted
                BalancesResponse balances = GetBalances(curAccountNumber);
                var curBalanceUSD         = balances.perCurrencyBalances.FirstOrDefault(p => p.currency == CURRENCY_USD);

                // calculate value already being converted
                PositionsResponse positions = GetPositions(curAccountNumber);
                var ngPositionCAD           = positions.positions.FirstOrDefault(p => p.symbol == NG_SYMBOL_CAD);
                var pendingNGValueUSD       = 0.0;
                if (ngPositionCAD != null)
                {
                    pendingNGValueUSD = ngPositionCAD.openQuantity * NGQuoteUSD.bidPrice;
                }

                var remainingUSDRequired = requiredUSD - (curBalanceUSD.cash + pendingNGValueUSD);

                if (remainingUSDRequired > 0)
                {
                    var numNGSharesNeeded = (int)Math.Ceiling(remainingUSDRequired / NGQuoteUSD.bidPrice);

                    var NGSymbolCAD = GetSymbol(NG_SYMBOL_CAD);
                    var NGQuoteCAD  = GetQuote(NGSymbolCAD.symbolId);

                    pendingNGOrders.Add(new PendingOrder()
                    {
                        AccountNumber = curAccountNumber,
                        Symbol        = NGSymbolCAD,
                        Quote         = NGQuoteCAD,
                        Quantity      = numNGSharesNeeded,
                        IsBuyOrder    = true,
                        TargetValue   = numNGSharesNeeded * NGQuoteCAD.askPrice
                    });
                }
            }

            return(pendingNGOrders);
        }
Exemple #15
0
        public List <PendingOrder> GetNorbertsGambitRequirements()
        {
            var NGSymbolUSD     = GetSymbol(NG_SYMBOL_USD);
            var NGQuoteUSD      = GetQuote(NGSymbolUSD.symbolId);
            var pendingNGOrders = new List <PendingOrder>();

            foreach (var curAccount in curUser.accounts)
            {
                // sell all NG stocks that are already converted to US
                SellAllUSNGStocks(curAccount.number);

                BalancesResponse balances = GetBalances(curAccount.number);

                // calculate total amount of USD that should be in the account
                var    accountCategories = db.AccountCategories.Where(p => p.Account.Number == curAccount.number);
                double requiredUSDValue  = 0;
                foreach (var curAccountCategory in accountCategories)
                {
                    foreach (var curStockTarget in curAccountCategory.Category.StockTargets)
                    {
                        var symbol = GetSymbol(curStockTarget.Symbol);
                        if (symbol.currency == CURRENCY_USD)
                        {
                            double totalEquity = balances.combinedBalances.FirstOrDefault(p => p.currency == symbol.currency).totalEquity;
                            requiredUSDValue += totalEquity * ((curAccountCategory.Percent / 100) * (curStockTarget.TargetPercent / 100));
                        }
                    }
                }

                // reduce required amount by USD assets already owned
                PositionsResponse positions = GetPositions(curAccount.number);
                foreach (var curPosition in positions.positions)
                {
                    var symbol = GetSymbol(curPosition.symbol);
                    if (symbol.currency == CURRENCY_USD)
                    {
                        requiredUSDValue -= curPosition.currentMarketValue;
                    }
                }

                // reduce required amount by the value that is already being processed
                var ngPositionCAD = positions.positions.FirstOrDefault(p => p.symbol == NG_SYMBOL_CAD);
                if (ngPositionCAD != null)
                {
                    requiredUSDValue -= ngPositionCAD.openQuantity * NGQuoteUSD.bidPrice;
                }

                if (requiredUSDValue > 0)
                {
                    var numNGSharesNeeded = (int)Math.Ceiling(requiredUSDValue / NGQuoteUSD.bidPrice);

                    var NGSymbolCAD = GetSymbol(NG_SYMBOL_CAD);
                    var NGQuoteCAD  = GetQuote(NGSymbolCAD.symbolId);

                    var valueToBuyCAD = numNGSharesNeeded * NGQuoteCAD.askPrice;

                    // if required to buy is greater than cash on hand, truncate to cash level.
                    var curCashCAD = balances.perCurrencyBalances.FirstOrDefault(p => p.currency == CURRENCY_CAD).cash;
                    if (valueToBuyCAD > curCashCAD)
                    {
                        numNGSharesNeeded = (int)Math.Floor(curCashCAD / NGQuoteCAD.askPrice);
                        valueToBuyCAD     = numNGSharesNeeded * NGQuoteCAD.askPrice;
                    }

                    pendingNGOrders.Add(new PendingOrder()
                    {
                        AccountNumber = curAccount.number,
                        Symbol        = NGSymbolCAD,
                        Quote         = NGQuoteCAD,
                        Quantity      = numNGSharesNeeded,
                        IsBuyOrder    = true,
                        TargetValue   = valueToBuyCAD
                    });
                }
            }

            return(pendingNGOrders);
        }