public TradeProcessor(ITradeDataProvider tradeDataProvider, ITradeParser tradeParser, ITradeStorage tradeStorage) { this.tradeDataProvider = tradeDataProvider; this.tradeParser = tradeParser; this.tradeStorage = tradeStorage; }
public TradeProcessor(ITradeDataProvider iTradeDataProvider, ITradeParser iTradeParser, ITradeStore iTradeStore ) { this.iTradeDataProvider = iTradeDataProvider; this.iTradeParser = iTradeParser; this.iTradeStore = iTradeStore; }
static void Main(string[] args) { ITradeDataProvider dataProvider = Dependancies.TradeDataProvider; ITradeParser tradeParser = Dependancies.TradeParser; ITradeStorage tradeStorage = Dependancies.TradeStorage; var batchProcessor = new TradeProcessor(dataProvider, tradeParser, tradeStorage); batchProcessor.ProcessTrades(); }
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)); }
public static ITradeParser GetTradeParser(string SourceApp) { ITradeParser tradeParser = null; switch (SourceApp) { case "KPlus": tradeParser = new KPlusParser(); break; case "Xone": tradeParser = new XoneParser(); break; } return(tradeParser); }
/// <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); }
public void Init() { _exchange = new KrakenLedgerParser(); }
static void Main() { Console.ForegroundColor = ConsoleColor.Gray; var cfg = Config.FromFile("config.json"); var provider = new GoogleSheetsProvider(cfg); var parsers = new ITradeParser[] { new KrakenLedgerParser(), // Kraken Ledger before Trades ALWAYS new KrakenTradesParser(), new BittrexParser(), new BinanceParser() }; var priceProvider = new CoinPaprikaPriceProvider(cfg.FiatProvider); // Parser trades var trades = new List <Trade>(); var dataSource = new TradeDataSource() { Data = provider.GetData().ToArray() }; foreach (var parser in parsers) { foreach (var data in dataSource.Data) { if (data.Parsed || !parser.IsThis(data)) { continue; } trades.AddRange(parser.GetTrades(dataSource, data)); data.Parsed = true; } } // Sort trades by date trades.SortByDate(); // Compute fiat values trades.ComputeFiatValues(priceProvider); // Compute fifo var profits = new Dictionary <int, YearProfit>(); trades.ComputeFifo(out var fifo, (trade, fee) => { if (!profits.TryGetValue(trade.Date.Year, out var profit)) { profit = new YearProfit() { Year = trade.Date.Year }; profits.Add(profit.Year, profit); } profit.Fee += fee; }, (trade, buyPrice, sellPrice, amount) => { if (buyPrice <= 0) { //Console.WriteLine("Buy not found for: " + trade.ToString()); } if (!profits.TryGetValue(trade.Date.Year, out var profit)) { profit = new YearProfit() { Year = trade.Date.Year }; profits.Add(profit.Year, profit); } profit.Buyed += (amount * buyPrice); profit.Sold += (amount * sellPrice); profit.Profit += (amount * sellPrice) - (amount * buyPrice); } ); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(JsonConvert.SerializeObject(profits, Formatting.Indented)); Console.ForegroundColor = ConsoleColor.Gray; }
public void ProcessTrades(ITradeDataProvider tradeDataProvider, ITradeParser tradeParser, ITradeStorage tradeStorage) { lines = tradeDataProvider.GetTradeData(); trades = tradeParser.Parse(lines); tradeStorage.Persist(trades); }
public int ParseTrades(ITradeParser tradeParser, ILogger logger) { trades = tradeParser.Parse(lines); logger.LogInfo("Parsed " + trades.Count().ToString() + " trades sucessfully."); return(trades.Count()); }
protected override decimal InternalGetFiatPrice(ITradeParser parser, ECoin coin, DateTime date) => 0M;
public void Init() { _exchange = new BittrexParser(); }
public TradeProcessor(ITradeProcessorFactory tradeProcessorFactory) { this.fileReader = tradeProcessorFactory.GetFileReader(); this.tradeParser = tradeProcessorFactory.GetTradeParser(); this.databaseAccessor = tradeProcessorFactory.GetDatabaseAccessor(); }
/// <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);
public void Init() { _exchange = new KrakenTradesParser(); }
public TradeProcessor(IURLTradeDataProvider uRLTradeDataProvider, ITradeDataProvider tradeDataProvider, ITradeParser tradeParser, AdoNetTradeStorage tradeStorage) { this.uRLTradeDataProvider = uRLTradeDataProvider; this.tradeDataProvider = tradeDataProvider; this.tradeParser = tradeParser; this.tradeStorage = tradeStorage; }
public void Init() { _exchange = new BinanceParser(); }