コード例 #1
0
 /// <summary>
 /// Raises a BeforeProcessing event.
 /// </summary>
 protected void OnBeforeProcessing(XmlDocument xmlDoc)
 {
     BeforeProcessing?.Invoke(this, xmlDoc);
 }
コード例 #2
0
        public void Run()
        {
            var trades      = _fileRepository.GetTrades();
            var deposits    = _fileRepository.GetDeposits();
            var withdrawals = _fileRepository.GetWithdraws();
            var dividends   = _fileRepository.GetDividends();
            var dusts       = _fileRepository.GetDusts();
            var fundsOrigin = _fileRepository.GetFundsOrigin();

            Console.WriteLine($"{trades.Length:N0} trades, {dividends.Length:N0} dividends, {deposits.Length:N0} deposits, {withdrawals.Length:N0} withdraws, {dusts.Length:N0} dusts");

            var allEventInOrder = trades.Select(t => (t.Time, (object)t))
                                  .Concat(deposits.Select(t => (t.InsertTime, (object)t)))
                                  .Concat(withdrawals.Select(t => (applyTime: t.ApplyTime, (object)t)))
                                  .Concat(dividends.Select(t => (t.DivTime, (object)t)))
                                  .Concat(dusts.Select(t => (t.OperateTimeLong, (object)t)))
                                  .Concat(fundsOrigin.Select(t => (t.Time, (object)t)))
                                  .OrderBy(GetKey)
                                  .ToArray();

            foreach (var eventTimeAndObject in allEventInOrder)
            {
                BeforeProcessing?.Invoke(eventTimeAndObject.Item1);

                IEnumerable <CapitalGain> capitalGain = Enumerable.Empty <CapitalGain>();
                switch (eventTimeAndObject.Item2)
                {
                case ITrade trade: capitalGain = _portfolio.Process(trade); break;

                case IDeposit deposit: _portfolio.Process(deposit); break;

                case IWithdraw withdraw: capitalGain = _portfolio.Process(withdraw); break;

                case Dividend dividend:
                {
                    var launchpadTrade = _launchpadTradeGenerator.TryGetTrade(dividend);
                    if (launchpadTrade != null)
                    {
                        capitalGain = _portfolio.Process(launchpadTrade);
                        break;
                    }
                    var delistingTrade = _delistingTradeGenerator.TryGetTrade(dividend);
                    if (delistingTrade != null)
                    {
                        capitalGain = _portfolio.Process(delistingTrade);
                        break;
                    }

                    _portfolio.Process(dividend); break;
                }

                case DustRow dust: capitalGain = _portfolio.Process(dust); break;

                case FundsOrigin fundOrigin: _portfolio.Process(fundOrigin); break;

                default: throw new Exception($"Please add type {eventTimeAndObject.Item2.GetType()}");
                }

                _lastEvent = eventTimeAndObject.Item1;
                _capitalGains.AddRange(capitalGain);
            }
        }