/// <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> > >(); } }
// 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"e=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)); }
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)); }
/// <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); }
/// <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); }
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;
/// <summary> /// Constructor /// </summary> /// <param name="coin">Coin</param> public FIFO(ECoin coin) { Coin = coin; }
/// <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); }
/// <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);