private static void HandleSellSignals(SimulationDto simulationDto, IList <CompanyPricesDto> allPrices, SignalEvent signalEvent,
                                              SimulationResultDto simulationResult)
        {
            var prices = ConvertPrices(allPrices, signalEvent.CompaniesToSell, signalEvent.Date);

            foreach (var price in prices)
            {
                if (!simulationResult.CurrentCompanyQuantity.ContainsKey(price.Key))
                {
                    continue;
                }
                var transaction = new SimulationTransactionDto
                {
                    Date        = signalEvent.Date,
                    CompanyId   = price.Key,
                    Price       = price.Value,
                    Action      = SignalAction.Sell,
                    Quantity    = simulationResult.CurrentCompanyQuantity[price.Key],
                    BudgetAfter =
                        simulationDto.Budget + simulationResult.CurrentCompanyQuantity[price.Key] * price.Value
                };
                simulationResult.TransactionsLog.Add(transaction);
                simulationDto.Budget = transaction.BudgetAfter;
                simulationResult.CurrentCompanyQuantity.Remove(price.Key);
            }
        }
 private static void UpdateQuantities(Dictionary <int, int> quantities, SimulationTransactionDto transaction)
 {
     if (transaction.Action == SignalAction.Buy)
     {
         quantities[transaction.CompanyId] += transaction.Quantity;
     }
     else if (transaction.Action == SignalAction.Sell)
     {
         quantities[transaction.CompanyId] -= transaction.Quantity;
     }
 }
        private static void HandleBuySignals(SimulationDto simulationDto, IList <CompanyPricesDto> allPrices, SignalEvent signalEvent,
                                             SimulationResultDto simulationResult)
        {
            var prices = ConvertPrices(allPrices, signalEvent.CompaniesToBuy, signalEvent.Date);

            //.OrderByDescending(item => item.Value);
            foreach (var price in prices)
            {
                var value = simulationDto.Budget;
                if (simulationDto.HasMaximalTransactionLimit)
                {
                    value = Math.Min(value, simulationDto.MaximalBudgetPerTransaction);
                }
                if (simulationDto.HasMinimalTransactionLimit)
                {
                    if (value < simulationDto.MinimalBudgetPerTransaction)
                    {
                        continue; // not enough money
                    }
                    value = Math.Max(value, simulationDto.MinimalBudgetPerTransaction);
                }
                if (value < price.Value)
                {
                    continue;
                }

                int quantity    = (int)Math.Floor(value / price.Value);
                var transaction = new SimulationTransactionDto
                {
                    Date        = signalEvent.Date,
                    CompanyId   = price.Key,
                    Price       = price.Value,
                    Action      = SignalAction.Buy,
                    Quantity    = quantity,
                    BudgetAfter =
                        simulationDto.Budget - quantity * price.Value
                };
                simulationResult.TransactionsLog.Add(transaction);
                if (simulationResult.CurrentCompanyQuantity.ContainsKey(price.Key))
                {
                    simulationResult.CurrentCompanyQuantity[price.Key] += quantity;
                }
                else
                {
                    simulationResult.CurrentCompanyQuantity.Add(price.Key, quantity);
                }
                simulationDto.Budget = transaction.BudgetAfter;
            }
        }