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; } }