Exemple #1
0
 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&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));
        }
        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);
        }
Exemple #8
0
 public void Init()
 {
     _exchange = new KrakenLedgerParser();
 }
Exemple #9
0
        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;
        }
Exemple #10
0
 public void ProcessTrades(ITradeDataProvider tradeDataProvider, ITradeParser tradeParser, ITradeStorage tradeStorage)
 {
     lines  = tradeDataProvider.GetTradeData();
     trades = tradeParser.Parse(lines);
     tradeStorage.Persist(trades);
 }
Exemple #11
0
 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();
 }
Exemple #14
0
 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 TradeProcessor(ITradeDataProvider tradeDataProvider, ITradeParser tradeParser, ITradeStorage tradeStorage)
 {
     this.tradeDataProvider = tradeDataProvider;
     this.tradeParser = tradeParser;
     this.tradeStorage = tradeStorage;
 }
 public void Init()
 {
     _exchange = new BinanceParser();
 }