static IDictionary <string, Tuple <float, float> > UpdateDistributionTable(IList <string> trackedAssets, IDictionary <string, float> targetDistribution) { spotAccountInformation = GetSpotAccountInformation(); Console.WriteLine("Initial balances in Bitcoin: "); IDictionary <string, float> assetBalancesInBitcoin = new Dictionary <string, float>(); foreach (string asset in trackedAssets) { assetBalancesInBitcoin.Add(asset, GetValueInBitcoin(asset)); } foreach (KeyValuePair <string, float> kvp in assetBalancesInBitcoin) { Console.WriteLine(kvp.Key + " : " + kvp.Value); } Console.WriteLine(); Console.WriteLine("Distribution table: "); float totalBitcoinValue = assetBalancesInBitcoin.Sum(x => x.Value); IDictionary <string, Tuple <float, float> > distribuitonTable = new Dictionary <string, Tuple <float, float> >(); foreach (string asset in trackedAssets) { distribuitonTable.Add(asset, new Tuple <float, float>(targetDistribution[asset], ((float)assetBalancesInBitcoin[asset]) / totalBitcoinValue)); } return(distribuitonTable); }
static void Trade(string side, string pair, string quantityParam, float quantity) { var client = new RestClient("https://api.binance.com/"); IRestResponse response; var request = new RestRequest("/api/v3/order/test", Method.POST); request.AddParameter("symbol", pair); request.AddParameter("side", side); request.AddParameter("type", "MARKET"); request.AddParameter(quantityParam, Math.Round(quantity, 8).ToString("N8")); request.AddParameter("timestamp", GetTimestamp() - 2000); request.AddParameter("recvWindow", 60000); string parameterlist = ""; foreach (Parameter p in request.Parameters) { parameterlist = parameterlist + p.ToString() + "&"; } parameterlist = parameterlist.Substring(0, parameterlist.Length - 1); request.AddParameter("signature", GetHMAC(parameterlist, secretKey)); request.AddHeader("X-MBX-APIKEY", apiKey); response = client.Execute(request); var content = response.Content; ErrorResponse errorResponse = JsonConvert.DeserializeObject <ErrorResponse>(content); if (errorResponse.code < 0) { Console.WriteLine("Failed order: Side: {0}; Pair: {1}; {2}: {3}", side, pair, quantityParam, quantity.ToString("N8")); throw new ErrorResponseException(errorResponse); } else { Console.WriteLine("Order passed filter: Side: {0}; Pair: {1}; {2}: {3}.. Do you want to continue? (y/n)", side, pair, quantityParam, quantity.ToString("N8")); if (Console.ReadLine().Equals("y")) { request.Resource = "/api/v3/order"; response = client.Execute(request); content = response.Content; errorResponse = JsonConvert.DeserializeObject <ErrorResponse>(content); if (errorResponse.code < 0) { Console.WriteLine("Failed order: Side: {0}; Pair: {1}; {2}: {3}", side, pair, quantityParam, quantity.ToString("N8")); throw new ErrorResponseException(errorResponse); } else { spotAccountInformation = GetSpotAccountInformation(); } } else { Console.WriteLine("Order aborted."); return; } Console.WriteLine("Successful order: Side: {0}; Pair: {1}; {2}: {3}", side, pair, quantityParam, quantity.ToString("N8")); } }
static SpotAccountInformation GetSpotAccountInformation() { var client = new RestClient("https://api.binance.com/"); var request = new RestRequest("/api/v3/account", Method.GET); AddSpotAccountRequestParams(ref request); request.AddHeader("X-MBX-APIKEY", apiKey); IRestResponse response = client.Execute(request); if (!response.IsSuccessful) { Console.WriteLine("Unsuccesful account information GET request."); // throw new Environment.Exit(-2); } var content = response.Content; SpotAccountInformation spotAccountInformation = JsonConvert.DeserializeObject <SpotAccountInformation>(content); return(spotAccountInformation); }
static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("No parameters are provided. \nPlease enter them now in the following format: [apiKey] [secretKey] [primary asset] [seconday asset] [asset1] [target1] [asset2] [target2].."); string inputText = Console.ReadLine(); args = inputText.Split(' '); } try { apiKey = args[0]; secretKey = args[1]; } catch (ArgumentNullException) { Console.WriteLine("Not all keys are provided."); Environment.Exit(-1); } try { primaryAsset = args[2]; secondaryAsset = args[3]; } catch (ArgumentNullException) { Console.WriteLine("The primary or secondary asset is not provided."); Environment.Exit(-1); } spotAccountInformation = GetSpotAccountInformation(); IList <string> trackedAssets = new List <string>(); IDictionary <string, float> targetDistribution = new Dictionary <string, float>(); if ((args.Length % 2) != 0 || args.Length == 2) { Console.Write("The list of distribution targets is incomplete or empty. Entered list: "); for (int i = 2; i <= args.Length; i++) { Console.Write(args[i] + " "); } Environment.Exit(-1); } for (int i = 4; i < args.Length; i += 2) { trackedAssets.Add(args[i].ToString()); targetDistribution.Add(args[i].ToString(), float.Parse(args[i + 1]) / 100); } Console.WriteLine("Initial balances in Bitcoin: "); IDictionary <string, float> assetBalancesInBitcoin = new Dictionary <string, float>(); foreach (string asset in trackedAssets) { Console.WriteLine("Enter additional amount for " + asset + " in BTC: "); float additionalAmound = 0; try { additionalAmound = float.Parse(Console.ReadLine()); } catch (System.FormatException) { // ignore } assetBalancesInBitcoin.Add(asset, GetValueInBitcoin(asset) + additionalAmound); } foreach (KeyValuePair <string, float> kvp in assetBalancesInBitcoin) { Console.WriteLine(kvp.Key + " : " + kvp.Value); } Console.WriteLine(); Console.WriteLine("Distribution table: "); Console.WriteLine("Asset: target, current percentage -> deviation(Δ)"); float totalBitcoinValue = assetBalancesInBitcoin.Sum(x => x.Value); IDictionary <string, Tuple <float, float> > distribuitonTable = new Dictionary <string, Tuple <float, float> >(); foreach (string asset in trackedAssets) { distribuitonTable.Add(asset, new Tuple <float, float>(targetDistribution[asset], ((float)assetBalancesInBitcoin[asset]) / totalBitcoinValue)); } foreach (KeyValuePair <string, Tuple <float, float> > kvp in distribuitonTable) { Console.WriteLine(kvp.Key + " : " + kvp.Value.ToString() + " -> " + (kvp.Value.Item2 - kvp.Value.Item1) * 100 + "%"); } Console.WriteLine("Total balance in Bitcoin: " + totalBitcoinValue); Console.WriteLine("Press any key to continue."); Console.ReadKey(); Console.WriteLine(); foreach (string asset in trackedAssets) { HandleDifference(asset, ((distribuitonTable[asset].Item2 - distribuitonTable[asset].Item1) * totalBitcoinValue)); } Console.WriteLine("Press any key to continue."); Console.ReadKey(); }