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"); } }
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)); }
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 }); }
public BalanceOnDate(AssetBalance assetBalance) { Balance = assetBalance.Amount; BalanceInUsd = assetBalance.AmountInUsd; Price = Balance == 0 ? 0 : BalanceInUsd / Balance; }
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); } } }
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); } } }