public async Task <Task> ProcessCsv(string csv, Dictionary <string, string> attr)
        {
            var    path    = attr["FilePath"];
            var    machine = attr["MachineName"];
            string key     = path + "-" + machine;

            var epexRows = _parser.Parse(csv, CultureInfo.GetCultureInfo("en-US"));

            var posHelp    = new PositionsHelper(_context, key);
            var currentPos = await posHelp.GetCurrentPosition();

            var tradeNo = Int32.MinValue;

            foreach (var row in epexRows.OrderBy(r => r.TradeNo))
            {
                tradeNo = Convert.ToInt32(row.TradeNo);
                if (tradeNo > currentPos)
                {
                    // Quantity bestemmes af buy/sell: Hvis vi har købt skal quantity angives med positivt fortegn.
                    // Hvis vi har solgt skal quantity angives med negativt fortegn
                    decimal quant = row.Quantity;
                    decimal price = row.Price;
                    int     fact  = row.BuySell.ToUpper() == "B" ? 1 : -1;

                    Effect effect = Effect.FromMegawatts(quant * fact);
                    Money  money  = new Money(price, new Currency(row.Currency));

                    // Hent alias og heraf grid ud fra landekoden i CSV filen (aflæses i EIC feltet).
                    TsoAlias alias = GetTsoAliases(row.EIC.Substring(3, 2), "TsoAlias");
                    Grid     grid  = alias.Grid;

                    // Vi henter tidszonen fra grid
                    var timeZone = grid.TimeZoneInfo;

                    //CSV timeperiod format : 20200123 15:00-20200123 15:30
                    DateTimeOffset from       = GetEpexDateTimeOffSet(row.Contract.Substring(0, 14), timeZone);
                    DateTimeOffset to         = GetEpexDateTimeOffSet(row.Contract.Substring(15, 14), timeZone);
                    TimePeriod     timePeriod = new TimePeriod(from, to);

                    var sourceBook = _context.Books.Where(tso => (tso.ShortName == row.TSO || tso.ShortName == row.TSO + " INTRA")).FirstOrDefault() ?? throw new ArgumentException($"Could not get exchange book for TSO {row.TSO}");
                    var targetBook = grid.DefaultTradeBook ?? throw new ArgumentException($"Could not get default trade book for grid {grid}");

                    var traderId = _context.Traders.Where(trader => trader.ExternalTraderId == row.TraderId && trader.TradingPlatform == "EPEX").FirstOrDefault() ?? throw new ArgumentException($"Could not validate trader {row.TraderId}");

                    var transaction = Model.Entities.Transaction.CreateTrade(grid, timePeriod, sourceBook, targetBook, effect, money, traderId.ExternalTraderId, row.Text);
                    transaction.SetExternalReference(new ExternalReference("EPEX-" + row.TSO + "-" + row.OrderNo + "-" + row.TradeNo));

                    var ex = await _context.Transactions.FindByExternalReferenceAsync(transaction.ExternalReference);

                    if (ex == null)
                    {
                        await _context.Transactions.AddAsync(transaction);
                    }
                }
            }
            await posHelp.SetPosition(tradeNo);

            _context.SaveChanges();
            return(Task.CompletedTask);
        }
Esempio n. 2
0
        private void UpdateData()
        {
            try
            {
                Dictionary <long, Position> oldPositions = PositionsHelper.GetLastLoadPositions()
                                                           .ToDictionary(el => el.Auc);

                IAucJsonFile    file         = GetAucJsonFile();
                List <Position> newPositions = file.AucPositions.ToList();

                List <Position> oldHardPositions  = new List <Position>();
                List <Position> newHardPositions  = new List <Position>();
                List <Position> toUpdatePositions = new List <Position>();

                foreach (Position newPos in newPositions)
                {
                    Position oldPos = null;
                    // Если не получилось найти, значит лот новый (раньше такого лота не было, позможно перевыставили).
                    if (!oldPositions.TryGetValue(newPos.Auc, out oldPos))
                    {
                        newHardPositions.Add(newPos);
                    }
                }

                // Обновляем старые лоты.
                AucTraderDbContextHelper.SavePositionsAsPackages(newHardPositions);
            }
            catch (Exception)
            {
            }
        }
Esempio n. 3
0
        private void UpdateData2()
        {
            try
            {
                Dictionary <long, Position> oldPositions = PositionsHelper.GetLastLoadPositions2()
                                                           .ToDictionary(el => el.Auc);

                IAucJsonFile    file         = GetAucJsonFile();
                List <Position> newPositions = file.AucPositions.ToList();

                Dictionary <long, Position> toUpdatePositions = new Dictionary <long, Position>();
                List <Position>             newHardPositions  = new List <Position>();
                List <Position>             oldHardPositions  = new List <Position>();

                DateTime withdrwanDateTime = newPositions.First().LoadDateTime;
                foreach (Position newPos in newPositions)
                {
                    Position oldPos = null;
                    // Если не получилось найти, значит лот новый (раньше такого лота не было, позможно перевыставили).
                    if (!oldPositions.TryGetValue(newPos.Auc, out oldPos))
                    {
                        // Не нашли старой позиции, значит новая, может быть перевыставили и пох, пока что.
                        newHardPositions.Add(newPos);
                        continue;
                    }

                    // Нашли старую идентичную позицию, обновим ее новыми даннымы.
                    if (oldPos != null)
                    {
                        newPos.Id = oldPos.Id;
                        toUpdatePositions.Add(newPos.Auc, newPos);
                    }
                }

                foreach (var oldPos in oldPositions.Values)
                {
                    Position pos;
                    if (!toUpdatePositions.TryGetValue(oldPos.Auc, out pos))
                    {
                        // Не смогли найти, значит лот выбыл.
                        oldPos.WithdrawnDateTime = withdrwanDateTime;
                        oldHardPositions.Add(oldPos);
                    }
                }

                // Закрываем старые лоты.
                AucTraderDbContextHelper.SavePositionsAsPackages(oldHardPositions);

                // Обновляем старые данные.
                AucTraderDbContextHelper.SavePositionsAsPackages(toUpdatePositions.Values.ToList());

                // Обновляем старые лоты.
                AucTraderDbContextHelper.SavePositionsAsPackages(newHardPositions);
            }
            catch (Exception e)
            {
                AppLogHelper.TraceError("", e);
            }
        }