public static void RunExample(Dictionary <string, string> dict)
        {
            ExchangeKrakenAPI api    = new ExchangeKrakenAPI();
            ExchangeTicker    ticker = api.GetTickerAsync("XXBTZUSD").Sync();

            Console.WriteLine("On the Kraken exchange, 1 bitcoin is worth {0} USD.", ticker.Bid);

            // load API keys created from ExchangeSharpConsole.exe keys mode=create path=keys.bin keylist=public_key,private_key
            api.LoadAPIKeys("keys.bin");

            /// place limit order for 0.01 bitcoin at ticker.Ask USD
            ExchangeOrderResult result = api.PlaceOrderAsync(new ExchangeOrderRequest
            {
                Amount       = 0.01m,
                IsBuy        = true,
                Price        = ticker.Ask,
                MarketSymbol = "XXBTZUSD"
            }).Sync();

            // Kraken is a bit funny in that they don't return the order details in the initial request, so you have to follow up with an order details request
            //  if you want to know more info about the order - most other exchanges don't return until they have the order details for you.
            // I've also found that Kraken tends to fail if you follow up too quickly with an order details request, so sleep a bit to give them time to get
            //  their house in order.
            System.Threading.Thread.Sleep(500);
            result = api.GetOrderDetailsAsync(result.OrderId).Sync();

            Console.WriteLine("Placed an order on Kraken for 0.01 bitcoin at {0} USD. Status is {1}. Order id is {2}.", ticker.Ask, result.Result, result.OrderId);
        }
        public override async Task RunCommand()
        {
            using var api = new ExchangeKrakenAPI();
            var ticker = await api.GetTickerAsync("XXBTZUSD");

            Console.WriteLine("On the Kraken exchange, 1 bitcoin is worth {0} USD.", ticker.Bid);

            try
            {
                // load API keys created from ExchangeSharpConsole.exe keys mode=create path=keys.bin keylist=public_key,private_key
                api.LoadAPIKeys(KeyPath);
            }
            catch (ArgumentException)
            {
                Console.Error.WriteLine(
                    "Invalid key file.\n" +
                    "Try generating a key file with the \"keys\" utility."
                    );
                Environment.Exit(Program.ExitCodeError);
                return;
            }

            // place limit order for 0.01 bitcoin at ticker.Ask USD
            var result = await api.PlaceOrderAsync(new ExchangeOrderRequest
            {
                Amount       = 0.01m,
                IsBuy        = true,
                Price        = ticker.Ask,
                MarketSymbol = "XXBTZUSD"
            });

            // Kraken is a bit funny in that they don't return the order details in the initial request, so you have to follow up with an order details request
            //  if you want to know more info about the order - most other exchanges don't return until they have the order details for you.
            // I've also found that Kraken tends to fail if you follow up too quickly with an order details request, so sleep a bit to give them time to get
            //  their house in order.
            await Task.Delay(500);

            result = await api.GetOrderDetailsAsync(result.OrderId);

            Console.WriteLine(
                "Placed an order on Kraken for 0.01 bitcoin at {0} USD. Status is {1}. Order id is {2}.",
                ticker.Ask, result.Result, result.OrderId
                );
        }