//метод для заполнения данных
        public List <ITrade> FillData(List <string> lines)
        {
            List <ITrade> trades    = new List <ITrade>();
            int           lineCount = 1;

            foreach (var line in lines)
            {
                if (line == null)
                {
                    break;
                }
                string[] fields = line.Split(',');

                ValidationFields(fields, lineCount);

                bool amountTryParse = int.TryParse(fields[1], out int tradeAmount);
                bool priceTryPase   = decimal.TryParse(fields[2], out var tradePrice);

                string sourceCurrencyCode      = fields[0].Substring(0, 3);
                string destinationCurrencyCode = fields[0].Substring(3, 3);
                var    lots = tradeAmount / LOTSIZE;

                var trade = new TradeRecord(destinationCurrencyCode, lots, tradePrice, sourceCurrencyCode);

                trades.Add(trade);

                lineCount++;
            }
            return(trades);
        }
Exemple #2
0
        public void HandleTrades(Stream stream, IReposytory reposytory)
        {
            this.stream = stream;
            TradeRecord trade = new TradeRecord();

            this.reposytory = reposytory;
            StartTrade(trade);
        }
Exemple #3
0
        private IReposytory reposytory; //репозиторий, в который нужно будет закидывать данные,
                                        //их может быть несколько поэтому есть общий интерфейс
                                        //и потом при помощи полиморфного вызова вызывается
                                        //нужный метод
        #endregion

        #region Public Api
        public void HandleTrades(Stream stream)
        {
            this.stream = stream;
            TradeRecord trade = new TradeRecord();

            reposytory = new DataBaseSqlTable();
            StartTrade(trade);
        }
Exemple #4
0
        private TradeRecord GenerateNewTradeRecord(string sourceCurrencyCode, string destinationCurrencyCode, float tradeAmount, decimal tradePrice)
        {
            TradeRecord result = new TradeRecord
            {
                SourceCurrency      = sourceCurrencyCode,
                DestinationCurrency = destinationCurrencyCode,
                Lots  = tradeAmount / LOT_SIZE,
                Price = tradePrice
            };

            return(result);
        }
Exemple #5
0
        // Использование итератора
        internal static IEnumerable <TradeRecord> Parther(IEnumerable <string> lines)
        {
            const float LOTSIZE = 100000f;


            int lineCount = 1;

            foreach (var line in lines)
            {
                var fields = line.Split(new char[] { ',' });

                if (fields.Length != 3)
                {
                    Logger($"WARN: Line {lineCount} malformed. Only {fields.Length} field(s) found.");
                    continue;
                }

                if (fields[0].Length != 6)
                {
                    Console.WriteLine("WARN: Trade currencies on line {0} malformed: '{1}'", lineCount, fields[0]);
                    Logger($"WARN: Trade currencies on line {lineCount} malformed: '{fields[0]}'");
                    continue;
                }

                if (!int.TryParse(fields[1], out var tradeAmount))
                {
                    Console.WriteLine("WARN: Trade amount on line {0} not a valid integer: '{1}'", lineCount, fields[1]);
                    Logger($"WARN: Trade amount on line {lineCount} not a valid integer: '{fields[1]}'");
                }

                if (!decimal.TryParse(fields[2], out var tradePrice))
                {
                    Console.WriteLine("WARN: Trade price on line {0} not a valid decimal: '{1}'", lineCount, fields[2]);
                    Logger($"WARN: Trade price on line {lineCount} not a valid decimal: '{fields[2]}'");
                }

                string sourceCurrencyCode      = fields[0].Substring(0, 3);
                string destinationCurrencyCode = fields[0].Substring(3, 3);
                lineCount++;

                var trade = new TradeRecord
                {
                    SourceCurrency      = sourceCurrencyCode,
                    DestinationCurrency = destinationCurrencyCode,
                    Lots  = tradeAmount / LOTSIZE,
                    Price = tradePrice
                };

                yield return(trade);
            }
        }
        // SRP applying
        public IEnumerable <TradeRecord> GetRecords()
        {
            var trades = new List <TradeRecord>();

            int lineCount = 1;

            foreach (var line in GetLines())
            {
                string[] fields = line.Split(new char[] { ',' });

                if (fields.Length != 3)
                {
                    System.Console.WriteLine("WARN: Line {0} malformed. Only {1} field(s) found.", lineCount, fields.Length);
                    continue;
                }

                if (fields[0].Length != 6)
                {
                    System.Console.WriteLine("WARN: Trade currencies on line {0} malformed: '{1}'", lineCount, fields[0]);
                    continue;
                }

                if (!int.TryParse(fields[1], out var tradeAmount))
                {
                    System.Console.WriteLine("WARN: Trade amount on line {0} not a valid integer: '{1}'", lineCount, fields[1]);
                }

                if (!decimal.TryParse(fields[2], out var tradePrice))
                {
                    System.Console.WriteLine("WARN: Trade price on line {0} not a valid decimal: '{1}'", lineCount, fields[2]);
                }

                var sourceCurrencyCode      = fields[0].Substring(0, 3);
                var destinationCurrencyCode = fields[0].Substring(3, 3);

                var trade = new TradeRecord
                {
                    SourceCurrency      = sourceCurrencyCode,
                    DestinationCurrency = destinationCurrencyCode,
                    Lots  = tradeAmount / LotSize,
                    Price = tradePrice
                };

                trades.Add(trade);

                lineCount++;
            }

            return(trades);
        }
        // Save exact trade
        private void SaveTrade(TradeRecord trade, SqlTransaction transaction, SqlConnection connection)
        {
            var command = connection.CreateCommand();

            command.Transaction = transaction;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "dbo.Insert_Trade";
            command.Parameters.AddWithValue("@sourceCurrency", trade.SourceCurrency);
            command.Parameters.AddWithValue("@destinationCurrency", trade.DestinationCurrency);
            command.Parameters.AddWithValue("@lots", trade.Lots);
            command.Parameters.AddWithValue("@price", trade.Price);

            command.ExecuteNonQuery();
        }
        // Separate record method
        private void AddRecord(IReadOnlyList <string> fields, int tradeAmount,
                               decimal tradePrice)
        {
            var sourceCurrencyCode      = fields[0].Substring(0, 3);
            var destinationCurrencyCode = fields[0].Substring(3, 3);

            var trade = new TradeRecord
            {
                SourceCurrency      = sourceCurrencyCode,
                DestinationCurrency = destinationCurrencyCode,
                Lots  = tradeAmount / LOT_SIZE,
                Price = tradePrice
            };

            trades.Add(trade);
        }
Exemple #9
0
        private IEnumerable <TradeRecord> Parse(IEnumerable <string> tradeRecords)
        {
            int NumberOfTreads        = 0;
            List <TradeRecord> buf    = new List <TradeRecord>();
            IParser            parser = new Parser();
            ILogger            logger = new Logger();

            foreach (var line in tradeRecords)
            {
                string[]    fields      = line.Split(new char[] { ',' });
                TradeRecord tradeRecord = null;
                try
                {
                    tradeRecord = parser.Parse(fields);
                }
                catch (FieldLengthException)
                {
                    logger.Warn($"WARN: Trade length on line {NumberOfTreads} is: '{fields.Length}'");
                    continue;
                }
                catch (CurrencyException)
                {
                    logger.Warn($"WARN: Trade currencies on line {NumberOfTreads} malformed: '{fields[0]}'");
                    continue;
                }
                catch (TradeAmountException)
                {
                    logger.Warn($"WARN: Trade amount on line {NumberOfTreads} not a valid integer: '{fields[1]}'");
                    continue;
                }
                catch (TradePriceException)
                {
                    logger.Warn($"WARN: Trade price on line {NumberOfTreads} not a valid decimal: '{fields[2]}'");
                    continue;
                }

                buf.Add(tradeRecord);
                NumberOfTreads++;
            }

            logger.Info($"INFO: {NumberOfTreads} trades processed");
            return(buf);
        }
Exemple #10
0
        internal static List <TradeRecord> CreateRecords(List <string> lines)
        {
            List <TradeRecord> trades = new List <TradeRecord>();

            foreach (var line in lines)
            {
                string[] fields = line.Split(new char[] { ',' });

                if (fields.Length != 3)
                {
                    Console.WriteLine("WARN: Line malformed. Only {0} field(s) found.", fields.Length);
                    continue;
                }

                if (fields[0].Length != 6)
                {
                    Console.WriteLine("WARN: Trade currencies malformed: '{0}'", fields[0]);
                    continue;
                }

                if (!int.TryParse(fields[1], out var tradeAmount))
                {
                }

                if (!decimal.TryParse(fields[2], out var tradePrice))
                {
                }

                string sourceCurrencyCode      = fields[0].Substring(0, 3);
                string destinationCurrencyCode = fields[0].Substring(3, 3);

                TradeRecord trade = new TradeRecord
                {
                    SourceCurrency      = sourceCurrencyCode,
                    DestinationCurrency = destinationCurrencyCode,
                    Lots  = tradeAmount / _lotSize,
                    Price = tradePrice
                };
                trades.Add(trade);
            }
            return(trades);
        }
        public static List <TradeRecord> CreateTradeList(List <string> lines)
        {
            var trades = new List <TradeRecord>();

            int lineNumber = 0;

            foreach (var line in lines)
            {
                lineNumber++;
                var field = line.Split(new char[] { ',' });

                //проверка на заполнение полей
                if (!CheckFields(field, lineNumber))
                {
                    continue;
                }

                //Не придумал как это обыграть
                if (!int.TryParse(field[1], out var tradeAmount))
                {
                    Console.WriteLine($"WARN: Trade amount on line {lineNumber} not a valid integer: '{field[1]}'");
                }

                if (!decimal.TryParse(field[2], out var tradePrice))
                {
                    Console.WriteLine($"WARN: Trade price on line {lineNumber} not a valid decimal: '{field[2]}'");
                }

                TradeRecord trade = new TradeRecord
                {
                    SourceCurrency      = field[0].Substring(0, 3),
                    DestinationCurrency = field[0].Substring(3, 3),
                    Lots  = tradeAmount / 100000f,
                    Price = tradePrice
                };

                trades.Add(trade);
            }
            return(trades);
        }
        public TradeRecord Parse(string[] fields)
        {
            IValidator validator = new Validator();

            try
            {
                validator.Validate(fields);
            }
            catch (FieldLengthException)
            {
                throw;
            }
            catch (CurrencyException)
            {
                throw;
            }
            catch (TradeAmountException)
            {
                throw;
            }
            catch (TradePriceException)
            {
                throw;
            }

            int tradeAmount = int.Parse(fields[1]);

            decimal tradePrice = decimal.Parse(fields[2], new CultureInfo("en-US"));

            var trade = new TradeRecord
            {
                SourceCurrency      = fields[0].Substring(0, 3),
                DestinationCurrency = fields[0].Substring(3, 3),
                Lots  = tradeAmount / TradeService.LotSize,
                Price = tradePrice
            };

            return(trade);
        }
Exemple #13
0
        // Разделил на 2 метода валидацию и на получение трейдов
        private void GetTrades(List <TradeRecord> trades, List <string> lines)
        {
            var lineCount = 1;

            foreach (var line in lines)
            {
                var fields = line.Split(new char[] { ',' });

                if (Valiation(fields, lineCount, out var tradeAmount, out var tradePrice))
                {
                    var sourceCurrencyCode      = fields[0].Substring(0, 3);
                    var destinationCurrencyCode = fields[0].Substring(3, 3);

                    var trade = new TradeRecord(destinationCurrencyCode, sourceCurrencyCode, tradeAmount / LotSize,
                                                tradePrice);

                    trades.Add(trade);
                }

                lineCount++;
            }
        }
Exemple #14
0
        public static void Save(TradeRecord trade, string connectionString)
        {
            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (var transaction = connection.BeginTransaction())
                {
                    var command = connection.CreateCommand();
                    command.Transaction = transaction;
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "dbo.Insert_Trade";
                    command.Parameters.AddWithValue("@sourceCurrency", trade.SourceCurrency);
                    command.Parameters.AddWithValue("@destinationCurrency", trade.DestinationCurrency);
                    command.Parameters.AddWithValue("@lots", trade.Lots);
                    command.Parameters.AddWithValue("@price", trade.Price);

                    command.ExecuteNonQuery();

                    transaction.Commit();
                }

                connection.Close();
            }
        }