/// <summary>
        /// Constructor
        /// </summary>
        /// <param name="config">Config</param>
        public FiatProviderBase(Config.FiatProviderConfig config)
        {
            Coin = config.FiatCoin;

            if (Coin != ECoin.EUR && Coin != ECoin.USD)
            {
                throw new ArgumentException(nameof(Coin));
            }

            CacheFile = "marketCache.json";

            if (File.Exists(CacheFile))
            {
                // Load cache

                try
                {
                    var data = JsonConvert.DeserializeObject <Dictionary <ECoin, Dictionary <ECoin, Dictionary <DateTime, decimal> > > >(File.ReadAllText(CacheFile));
                    if (data != null)
                    {
                        _cache = data;
                    }

#if DEBUG
                    Debugger.Log(0, "MarketCache", "Loaded " + data.Values.Sum(u => u.Values.Sum(x => x.Count)) + " entries");
#endif
                }
                catch { }
            }

            if (_cache == null)
            {
                _cache = new Dictionary <ECoin, Dictionary <ECoin, Dictionary <DateTime, decimal> > >();
            }
        }
Esempio n. 2
0
 // Take problem specific input
 public void TakeInput()
 {
     for (int i = 0; i < m; i++)
     {
         string[] tokens = Console.ReadLine().Split();
         eCoins[i] = new ECoin(int.Parse(tokens[0]), int.Parse(tokens[1]));
     }
 }
        /// <summary>
        /// USD per Coin
        /// </summary>
        /// <param name="fiatCoin">Fiat coin</param>
        /// <param name="date">Date</param>
        public static decimal UsdPerCoin(ECoin fiatCoin, DateTime date)
        {
            var down = DownloadHelper.Download <FiatResult>($"https://api.exchangeratesapi.io/{date.ToString("yyyy-MM-dd")}?base=USD", true);

            if (down != null && down.Rates.TryGetValue(fiatCoin.ToString(), out var value))
            {
                return(value);
            }

            throw new ArgumentException();
        }
        protected override decimal InternalGetFiatPrice(ITradeParser parser, ECoin coin, DateTime date)
        {
            if (coin == ECoin.USD)
            {
                return(FiatProviderHelper.UsdPerCoin(Coin, date));
            }

            if (_coinCache.Count == 0)
            {
                // Fill cache

                var coins = DownloadHelper.Download <CoinInfo[]>("https://api.coinpaprika.com/v1/coins", false);

                foreach (var c in coins.Where(u => u.Rank > 0).OrderBy(u => u.Rank))
                {
                    if (!_coinCache.ContainsKey(c.Symbol))
                    {
                        _coinCache[c.Symbol] = c.Id;
                    }
                }

                var exchages = DownloadHelper.Download <ExchageInfo[]>("https://api.coinpaprika.com/v1/exchanges", false);

                foreach (var exchage in exchages.OrderBy(u => u.Active))
                {
                    if (!_exchangeCache.ContainsKey(exchage.Name))
                    {
                        _exchangeCache[exchage.Name] = exchage.Id;
                    }
                }
            }

            var preparedDate = date.AddSeconds(-date.Second);

            preparedDate = preparedDate.AddMinutes(-5);

            var ticks = DownloadHelper.Download <TickInfo[]>(
                $"https://api.coinpaprika.com/v1/tickers/{GetCoinId(coin)}/historical?start={PrepareDate(preparedDate)}&limit=10&quote=usd&interval=5m");

            var usdPrice = 0M;

            foreach (var tick in ticks.OrderBy(u => u.Date))
            {
                if (tick.Date > date)
                {
                    break;
                }

                usdPrice = tick.Price;
            }

            return(UsdToPrice(usdPrice, date));
        }
Esempio n. 5
0
        private bool ParseCoin(string coin, out ECoin from, out ECoin to)
        {
            switch (coin.ToUpperInvariant())
            {
            case "ETHUSDT": from = ECoin.ETH; to = ECoin.USDT; break;

            case "BNBUSDT": from = ECoin.BNB; to = ECoin.USDT; break;

            case "BNBBTC": from = ECoin.BNB; to = ECoin.BTC; break;

            case "BTCUSDT": from = ECoin.BTC; to = ECoin.USDT; break;

            case "NEOUSDT": from = ECoin.NEO; to = ECoin.USDT; break;

            case "XRPUSDT": from = ECoin.XRP; to = ECoin.USDT; break;

            case "ONTUSDT": from = ECoin.ONT; to = ECoin.USDT; break;

            case "XMRUSDT": from = ECoin.XMR; to = ECoin.USDT; break;

            case "ETHBTC": from = ECoin.ETH; to = ECoin.BTC; break;

            case "OMGBTC": from = ECoin.OMG; to = ECoin.BTC; break;

            case "BTTBTC": from = ECoin.BTT; to = ECoin.BTC; break;

            case "HOTBTC": from = ECoin.HOT; to = ECoin.BTC; break;

            case "NEOBTC": from = ECoin.NEO; to = ECoin.BTC; break;

            case "GASBTC": from = ECoin.GAS; to = ECoin.BTC; break;

            case "XRPBTC": from = ECoin.XRP; to = ECoin.BTC; break;

            case "ONTBTC": from = ECoin.ONT; to = ECoin.BTC; break;

            case "BNBETH": from = ECoin.BNB; to = ECoin.ETH; break;

            case "NEOETH": from = ECoin.NEO; to = ECoin.ETH; break;

            case "OMGETH": from = ECoin.OMG; to = ECoin.ETH; break;

            case "NCASHETH": from = ECoin.NCASH; to = ECoin.ETH; break;

            case "STORMETH": from = ECoin.STORM; to = ECoin.ETH; break;

            case "BTTBNB": from = ECoin.BTT; to = ECoin.BNB; break;

            default: throw new ArgumentException(coin);
            }

            return(true);
        }
        /// <summary>
        /// Get coin
        /// </summary>
        /// <param name="coin">Coin</param>
        /// <returns>Coin</returns>
        private string GetCoin(ECoin coin)
        {
            switch (coin)
            {
            case ECoin.EUR:
            case ECoin.USD:
            case ECoin.USDT:
            case ECoin.BNB:
            case ECoin.BTC:
            case ECoin.ETH: return(coin.ToString());
            }

            throw new ArgumentException(nameof(coin));
        }
Esempio n. 7
0
        /// <summary>
        /// Convert fees for save price checks
        /// </summary>
        /// <param name="trade">Trade</param>
        /// <param name="from">Coin to be converted into the other from the pair</param>
        /// <returns>Return unified fees</returns>
        public static Quantity[] SumarizeFees(this Trade trade, ECoin from)
        {
            var price = Math.Abs(trade.Price);
            var ret   = new Quantity[trade.Fees.Length];

            for (int x = 0, max = ret.Length; x < max; x++)
            {
                if (trade.Fees[x].Coin == from)
                {
                    var isFrom = trade.From.Coin == from;
                    var value  = trade.Fees[x].Value;

                    if (trade is BuyTrade)
                    {
                        value = !isFrom ? value * price : value / price;
                    }
                    else if (trade is SellTrade)
                    {
                        value = isFrom ? value * price : value / price;
                    }
                    else
                    {
                        throw new ArgumentException();
                    }

                    ret[x] = new Quantity()
                    {
                        Coin  = isFrom ? trade.To.Coin : trade.From.Coin,
                        Value = value
                    };
                }
                else
                {
                    ret[x] = trade.Fees[x];
                }
            }

            // Join Fees

            return(ret.GroupBy(u => u.Coin, p => p.Value, (key, val) => new Quantity()
            {
                Coin = key, Value = val.Sum()
            }).ToArray());
        }
        /// <summary>
        /// Get coin id
        /// </summary>
        /// <param name="coin">Coin</param>
        /// <returns>Return id</returns>
        private string GetCoinId(ECoin coin)
        {
            switch (coin)
            {
            case ECoin.BTC:
            case ECoin.ETH:
            case ECoin.BNB:
            case ECoin.USDT:
            {
                if (!_coinCache.TryGetValue(coin.ToString(), out var value))
                {
                    throw new ArgumentException(nameof(coin));
                }

                return(value);
            }

            default: throw new ArgumentException(nameof(coin));
            }
        }
        private bool ParseCoin(string coin, out ECoin from, out ECoin to)
        {
            switch (coin.ToUpperInvariant())
            {
            case "XXRPZEUR": from = ECoin.XRP; to = ECoin.EUR; break;

            case "XLTCZEUR": from = ECoin.LTC; to = ECoin.EUR; break;

            case "XETHZEUR": from = ECoin.ETH; to = ECoin.EUR; break;

            case "XXBTZEUR": from = ECoin.BTC; to = ECoin.EUR; break;

            case "XXLMZEUR": from = ECoin.XLM; to = ECoin.EUR; break;

            case "EOSEUR": from = ECoin.EOS; to = ECoin.EUR; break;

            case "DASHEUR": from = ECoin.DASH; to = ECoin.EUR; break;

            case "NEXZUSD": from = ECoin.NEX; to = ECoin.USD; break;

            case "USDTZUSD": from = ECoin.USDT; to = ECoin.USD; break;

            case "XETHZUSD": from = ECoin.ETH; to = ECoin.USD; break;

            case "XICNXETH": from = ECoin.ICONOMI; to = ECoin.ETH; break;

            case "XXRPXXBT": from = ECoin.XRP; to = ECoin.BTC; break;

            case "XXDGXXBT": from = ECoin.DOGE; to = ECoin.BTC; break;

            case "XICNXXBT": from = ECoin.ICONOMI; to = ECoin.BTC; break;

            case "XETHXXBT": from = ECoin.ETH; to = ECoin.BTC; break;

            case "XLTCXXBT": from = ECoin.LTC; to = ECoin.BTC; break;

            default: throw new ArgumentException(coin);
            }

            return(true);
        }
Esempio n. 10
0
        /// <summary>
        /// Get fiat price for one coin in specific date
        /// </summary>
        /// <param name="parser">Parser</param>
        /// <param name="coin">Coin</param>
        /// <param name="date">Date</param>
        /// <returns>Price</returns>
        public decimal GetFiatPrice(ITradeParser parser, ECoin coin, DateTime date)
        {
            // Check same coin

            if (coin == Coin)
            {
                return(1);
            }

            if (coin == ECoin.KFEE)
            {
                // Kraken fees

                return(0);
            }

            if (!_cache.TryGetValue(coin, out var cache))
            {
                cache = _cache[coin] = new Dictionary <ECoin, Dictionary <DateTime, decimal> >();
            }

            // Search inside the cache

            if (!cache.TryGetValue(Coin, out var cacheEntry))
            {
                cacheEntry = cache[Coin] = new Dictionary <DateTime, decimal>();
            }

            if (cacheEntry.TryGetValue(date, out var result) && result != 0)
            {
                return(result);
            }

            // Add to cache

            var ret = cacheEntry[date] = InternalGetFiatPrice(parser, coin, date);

            File.WriteAllText(CacheFile, JsonConvert.SerializeObject(_cache, Formatting.Indented));

            return(ret);
        }
        /// <summary>
        /// Get fiat price for one coin in specific date
        /// </summary>
        /// <param name="parser">Parser</param>
        /// <param name="coin">Coin</param>
        /// <param name="date">Date</param>
        /// <returns>Price</returns>
        protected override decimal InternalGetFiatPrice(ITradeParser parser, ECoin coin, DateTime date)
        {
            if (coin == ECoin.USD)
            {
                return(FiatProviderHelper.UsdPerCoin(Coin, date));
            }

            var ret = DownloadHelper.Download <JObject>
                      (
                $"http://api.coinlayer.com/{date.ToString("yyyy-MM-dd")}?access_key={ApiKey}&symbols={GetCoin(coin)}&target={GetCoin(Coin)}&expand=1"
                      );

            if (!ret.TryGetValue("success", out var sucess) ||
                !sucess.Value <bool>() ||
                !ret.TryGetValue("rates", out var rates))
            {
                throw new ArgumentException();
            }

            var val = ((JProperty)rates.First).Value.ToObject <Entry>();

            return(val.Rate);
        }
Esempio n. 12
0
        private bool ParseCoin(string coin, out ECoin from, out ECoin to)
        {
            switch (coin.ToUpperInvariant())
            {
            case "ETH-OMG": from = ECoin.ETH; to = ECoin.OMG; break;

            case "ETH-NEO": from = ECoin.ETH; to = ECoin.NEO; break;

            case "ETH-WAVES": from = ECoin.ETH; to = ECoin.WAVES; break;

            case "ETH-BNT": from = ECoin.ETH; to = ECoin.BNT; break;

            case "USDT-OMG": from = ECoin.USDT; to = ECoin.OMG; break;

            case "USDT-BTC": from = ECoin.USDT; to = ECoin.BTC; break;

            case "USDT-XRP": from = ECoin.USDT; to = ECoin.XRP; break;

            case "BTC-ETH": from = ECoin.BTC; to = ECoin.ETH; break;

            case "BTC-WAVES": from = ECoin.BTC; to = ECoin.WAVES; break;

            case "BTC-OMG": from = ECoin.BTC; to = ECoin.OMG; break;

            case "BTC-MONA": from = ECoin.BTC; to = ECoin.MONA; break;

            case "BTC-XEL": from = ECoin.BTC; to = ECoin.XEL; break;

            case "BTC-ZEC": from = ECoin.BTC; to = ECoin.ZEC; break;

            case "BTC-NEO": from = ECoin.BTC; to = ECoin.NEO; break;

            case "BTC-SALT": from = ECoin.BTC; to = ECoin.SALT; break;

            case "BTC-WINGS": from = ECoin.BTC; to = ECoin.WINGS; break;

            case "BTC-BRX": from = ECoin.BTC; to = ECoin.BRX; break;

            case "BTC-MCO": from = ECoin.BTC; to = ECoin.MCO; break;

            case "BTC-IOC": from = ECoin.BTC; to = ECoin.IOC; break;

            case "BTC-ARK": from = ECoin.BTC; to = ECoin.ARK; break;

            case "BTC-UBQ": from = ECoin.BTC; to = ECoin.UBQ; break;

            case "BTC-SHIFT": from = ECoin.BTC; to = ECoin.SHIFT; break;

            case "BTC-QRL": from = ECoin.BTC; to = ECoin.QRL; break;

            case "BTC-GAME": from = ECoin.BTC; to = ECoin.GAME; break;

            case "BTC-STRAT": from = ECoin.BTC; to = ECoin.STRAT; break;

            case "BTC-STEEM": from = ECoin.BTC; to = ECoin.STEEM; break;

            case "BTC-BAT": from = ECoin.BTC; to = ECoin.BAT; break;

            case "BTC-EMC2": from = ECoin.BTC; to = ECoin.EMC2; break;

            case "BTC-LSK": from = ECoin.BTC; to = ECoin.LSK; break;

            case "BTC-IOP": from = ECoin.BTC; to = ECoin.IOP; break;

            case "BTC-BNT": from = ECoin.BTC; to = ECoin.BNT; break;

            default: throw new ArgumentException(coin);
            }

            return(true);
        }
 protected override decimal InternalGetFiatPrice(ITradeParser parser, ECoin coin, DateTime date) => 0M;
Esempio n. 14
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="coin">Coin</param>
 public FIFO(ECoin coin)
 {
     Coin = coin;
 }
Esempio n. 15
0
 /// <summary>
 /// From or to is
 /// </summary>
 /// <param name="coin">Coin</param>
 /// <returns></returns>
 public bool FromOrToIs(ECoin coin)
 {
     return(From.Coin == coin || To.Coin == coin);
 }
Esempio n. 16
0
 /// <summary>
 /// Get fiat price for one coin in specific date
 /// </summary>
 /// <param name="parser">Parser</param>
 /// <param name="coin">Coin</param>
 /// <param name="date">Date</param>
 /// <returns>Price</returns>
 protected abstract decimal InternalGetFiatPrice(ITradeParser parser, ECoin coin, DateTime date);