Exemplo n.º 1
0
        private static void UpdateBasedOnTradeBroker(Trade trade, decimal commission, BrokerKind brokerKind,
                                                     Dictionary <string, AssetBalance> currentAssetBalances)
        {
            var quoteAsset = trade.Market.Replace(trade.BaseAsset, string.Empty); // e.g. USDT
            var baseAsset  = trade.BaseAsset;                                     // e.g. ETH

            var quoteAssetBalance =
                currentAssetBalances.ContainsKey(quoteAsset) ? currentAssetBalances[quoteAsset].Balance : 0M;
            var baseAssetBalance = currentAssetBalances.ContainsKey(baseAsset) ? currentAssetBalances[baseAsset].Balance : 0M;

            if (trade.TradeDirection == TradeDirection.Long)
            {
                var costExcludingFee = trade.EntryQuantity.Value * trade.EntryPrice.Value; // Cost in quote asset (e.g. USDT)
                var fee = commission * costExcludingFee;

                if (costExcludingFee + fee > quoteAssetBalance)
                {
                    costExcludingFee = quoteAssetBalance / (1M + commission);
                    fee = quoteAssetBalance - costExcludingFee;
                    trade.EntryQuantity = costExcludingFee / trade.EntryPrice.Value;
                }

                currentAssetBalances[quoteAsset] = new AssetBalance(quoteAsset, quoteAssetBalance - fee - costExcludingFee);
                currentAssetBalances[baseAsset]  = new AssetBalance(baseAsset, baseAssetBalance + trade.EntryQuantity.Value);
                trade.Commission      = fee;
                trade.CommissionAsset = quoteAsset;
            }

            if (trade.TradeDirection == TradeDirection.Short)
            {
                if (trade.EntryQuantity > baseAssetBalance)
                {
                    trade.EntryQuantity = baseAssetBalance;
                }

                var fee = trade.EntryQuantity.Value * trade.EntryPrice.Value * commission;
                var quoteAssetReturn = (trade.EntryQuantity.Value * trade.EntryPrice.Value)
                                       - fee;
                currentAssetBalances[quoteAsset] = new AssetBalance(quoteAsset, quoteAssetBalance + quoteAssetReturn);
                currentAssetBalances[baseAsset]  = new AssetBalance(baseAsset, baseAssetBalance - trade.EntryQuantity.Value);
                trade.Commission      = fee;
                trade.CommissionAsset = quoteAsset;
            }

            if (brokerKind == BrokerKind.Trade)
            {
                trade.RiskAmount = 0;
            }
            else
            {
                throw new ApplicationException("This needs implementing");
            }
        }
Exemplo n.º 2
0
        public async Task <string> GetAllAssets()
        {
            List <AssetBalance> list = new List <AssetBalance>();

            var assets = await client.Asset.ListAssetsAsync();

            foreach (var item in assets.Result)
            {
                AssetBalance balance = new AssetBalance();
                balance.AssetRef = item.AssetRef;
                balance.Name     = item.Name;
                balance.TxID     = item.GenesisTxId;
                balance.Details  = item.Details;

                client.Asset.Subscribe(item.Name, false);
                var transactions = await client.Asset.ListAssetTransactions(item.AssetRef, true);

                foreach (var transaction in transactions.Result)
                {
                    AssetTransaction at = new AssetTransaction();
                    at.Time      = transaction.Time;
                    at.Date      = BlockChainHelper.UnixTimeStampToDateTime(transaction.Time).ToString();
                    at.TxID      = transaction.TxId;
                    at.BlockHash = transaction.BlockHash;
                    if (transaction.Addresses.Count == 1)
                    {
                        KeyValuePair <string, decimal> address = transaction.Addresses.First();

                        at.AddressFrom = "";
                        at.AddressTo   = address.Key;
                        at.Qty         = address.Value;
                    }
                    else
                    {
                        IOrderedEnumerable <KeyValuePair <string, decimal> > oList = transaction.Addresses.OrderBy(e => e.Value);

                        KeyValuePair <string, decimal> addressFrom = oList.First();
                        KeyValuePair <string, decimal> addressTo   = oList.ElementAtOrDefault(1);

                        at.AddressFrom = addressFrom.Key;
                        at.AddressTo   = addressTo.Key;
                        at.Qty         = addressTo.Value;
                    }
                    balance.Transactions.Add(at);
                }

                list.Add(balance);
            }

            return(JsonConvert.SerializeObject(list, Formatting.Indented));
        }
Exemplo n.º 3
0
        private static AssetBalance ComputeBalanceDynamics(AssetBalance startBalance, AssetBalance endBalance)
        {
            if (startBalance == null && endBalance == null)
            {
                throw new InvalidOperationException("At least one balance is required");
            }

            return(new AssetBalance
            {
                Exchange = startBalance?.Exchange ?? endBalance.Exchange,
                Amount = endBalance?.Amount ?? 0,
                AmountInUsd = endBalance?.AmountInUsd ?? 0,
                Credit = endBalance?.Credit ?? 0,
                CreditInUsd = endBalance?.CreditInUsd ?? 0
            });
        }
Exemplo n.º 4
0
 public BalanceOnDate(AssetBalance assetBalance)
 {
     Balance      = assetBalance.Amount;
     BalanceInUsd = assetBalance.AmountInUsd;
     Price        = Balance == 0 ? 0 : BalanceInUsd / Balance;
 }
Exemplo n.º 5
0
        public static void Bot()
        {
            string symbol = Globals.C1 + Globals.C2;

            //GetAccountInformation
            var accInfo = API.GetAccountInformation();

            //Check account funds for both currencies
            AssetBalance Currency1     = (from coin in accInfo.Balances where coin.Asset == Globals.C1 select coin).FirstOrDefault();
            var          freeCurrency1 = Currency1.Free;

            AssetBalance Currency2     = (from coin in accInfo.Balances where coin.Asset == Globals.C2 select coin).FirstOrDefault();
            var          freeCurrency2 = Currency2.Free;

            //Get Price of last BCCBTC trade
            var lastTrade      = API.GetLastTrade(symbol);
            var lastTradePrice = 0.0;
            var lastTradeSide  = OrderSides.SELL;            //if lastTrade == null, this means buy Currency1


            //get price and OrderSide of last trade (if any)
            if (lastTrade != null)
            {
                lastTradePrice = lastTrade.Price;

                if (lastTrade.isBuyer == true)
                {
                    lastTradeSide = OrderSides.BUY;
                }
                else
                {
                    lastTradeSide = OrderSides.SELL;
                }
            }

            //Check current price
            var currentPrice = API.GetOnePrice(symbol);

            //Calculate actual price change percentage
            var priceChange = 100 * (currentPrice - lastTradePrice) / currentPrice;

            Console.WriteLine("Current Price is " + currentPrice);
            Console.WriteLine("Price Change is " + priceChange);

            //Create Order
            Order marketOrder = null;

            if (lastTradeSide == OrderSides.BUY && priceChange > Globals.percentageChange)
            {
                //if last order was buy, and price has increased
                //sell C1
                marketOrder = API.PlaceMarketOrder(symbol, OrderSides.SELL, Globals.quatityPerTrade);
            }
            else if (lastTradeSide == OrderSides.SELL && priceChange < -Globals.percentageChange)
            {
                //if last order was sell, and price has decreased
                //buy C1
                marketOrder = API.PlaceMarketOrder(symbol, OrderSides.BUY, Globals.quatityPerTrade);
            }


            //Statements
            if (marketOrder == null)
            {
                Console.WriteLine("No trade was made.");
                var actualLastTrade = API.GetLastTrade(symbol);
                if (actualLastTrade.isBuyer == true)
                {
                    Console.WriteLine(actualLastTrade.Qty + " of " + Globals.C1 + " was previously bought for " + actualLastTrade.Price);
                }
                else if (actualLastTrade.isBuyer == false)
                {
                    Console.WriteLine(actualLastTrade.Qty + " of " + Globals.C1 + " was previously sold for " + actualLastTrade.Price);
                }
            }
            else
            {
                var newLastTrade = API.GetLastTrade(symbol);
                if (marketOrder.Side == OrderSides.BUY)
                {
                    Console.WriteLine(newLastTrade.Qty + " of " + Globals.C1 + " was bought for " + newLastTrade.Price);
                }
                else if (marketOrder.Side == OrderSides.SELL)
                {
                    Console.WriteLine(newLastTrade.Qty + " of " + Globals.C1 + " was sold for " + newLastTrade.Price);
                }
            }
        }
Exemplo n.º 6
0
        public static void Bot()
        {
            string symbol = General.C1 + General.C2;

            //Obtenir les informations de compte
            var accInfo = API.GetAccountInformation();

            //Vérifier les fonds du compte pour les deux monnaies
            AssetBalance Currency1     = (from coin in accInfo.Balances where coin.Asset == General.C1 select coin).FirstOrDefault();
            var          freeCurrency1 = Currency1.Free;

            AssetBalance Currency2     = (from coin in accInfo.Balances where coin.Asset == General.C2 select coin).FirstOrDefault();
            var          freeCurrency2 = Currency2.Free;

            //Obtenir le prix du dernier trade BCCBTC
            var lastTrade      = API.GetLastTrade(symbol);
            var lastTradePrice = 0.0;
            var lastTradeSide  = OrderSides.SELL;            //si lastTrade == null, cela signifie acheter la Devise1


            //obtenir le prix et l'OrderSide de la dernière transaction (le cas échéant)
            if (lastTrade != null)
            {
                lastTradePrice = lastTrade.Price;

                if (lastTrade.isBuyer == true)
                {
                    lastTradeSide = OrderSides.BUY;
                }
                else
                {
                    lastTradeSide = OrderSides.SELL;
                }
            }

            //Regarder le prix actuel
            var currentPrice = API.GetOnePrice(symbol);

            //Calculer le pourcentage de changement de prix réel
            var priceChange = 100 * (currentPrice - lastTradePrice) / currentPrice;

            Console.WriteLine("Current Price is " + currentPrice);
            Console.WriteLine("Price Change is " + priceChange);

            //Creer un ordre
            Order marketOrder = null;

            if (lastTradeSide == OrderSides.BUY && priceChange > General.percentageChange)
            {
                //si la dernière commande était un achat et que le prix a augmenté.
                //Vendre C1
                marketOrder = API.PlaceMarketOrder(symbol, OrderSides.SELL, General.quatityPerTrade);
            }
            else if (lastTradeSide == OrderSides.SELL && priceChange < -General.percentageChange)
            {
                //si le dernier ordre était une vente, et que le prix a baissé.
                //Acheter C1
                marketOrder = API.PlaceMarketOrder(symbol, OrderSides.BUY, General.quatityPerTrade);
            }


            //Déclarations
            if (marketOrder == null)
            {
                Console.WriteLine("No trade was made.");
                var actualLastTrade = API.GetLastTrade(symbol);
                if (actualLastTrade.isBuyer == true)
                {
                    Console.WriteLine(actualLastTrade.Qty + " of " + General.C1 + " was previously bought for " + actualLastTrade.Price);
                }
                else if (actualLastTrade.isBuyer == false)
                {
                    Console.WriteLine(actualLastTrade.Qty + " of " + General.C1 + " was previously sold for " + actualLastTrade.Price);
                }
            }
            else
            {
                var newLastTrade = API.GetLastTrade(symbol);
                if (marketOrder.Side == OrderSides.BUY)
                {
                    Console.WriteLine(newLastTrade.Qty + " of " + General.C1 + " was bought for " + newLastTrade.Price);
                }
                else if (marketOrder.Side == OrderSides.SELL)
                {
                    Console.WriteLine(newLastTrade.Qty + " of " + General.C1 + " was sold for " + newLastTrade.Price);
                }
            }
        }