股票监控系统(多用户、多股票)
系统需求
- 支持同时监控多个股票代码(如 AAPL、GOOGL、TSLA)
- 每个用户可以订阅不同股票的价格变动
- 支持不同策略组合(价格警报、自动交易、日志记录)
- 实时显示不同用户的订阅状态
完整实现代码
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <memory>
#include <thread>
#include <mutex>
#include <atomic>
#include <random>
#include <iomanip>
#include <chrono>
#include <algorithm>
#include <initializer_list>
class StockEvent;
class PriceUpdateEvent;
using StockSymbol = std::string;
using UserID = std::string;
class TradingStrategy {
public:virtual ~TradingStrategy() = default;virtual void handleEvent(const StockEvent& event) = 0;virtual std::vector<StockSymbol> subscribedSymbols() const = 0;
};
class StockEvent {
public:virtual ~StockEvent() = default;virtual StockSymbol symbol() const = 0;virtual double price() const = 0;virtual std::string toString() const = 0;
};
class PriceUpdateEvent : public StockEvent {StockSymbol _symbol;double _price;std::chrono::system_clock::time_point _timestamp;public:PriceUpdateEvent(StockSymbol sym, double price): _symbol(std::move(sym)), _price(price),_timestamp(std::chrono::system_clock::now()) {}StockSymbol symbol() const override { return _symbol; }double price() const override { return _price; }std::string toString() const override {std::time_t t = std::chrono::system_clock::to_time_t(_timestamp);std::stringstream ss;ss << _symbol << " $" << std::fixed << std::setprecision(2) << _price<< " @ " << std::ctime(&t);return ss.str();}
};
class StockExchange {struct StockData {double basePrice;std::atomic<double> currentPrice;std::vector<std::shared_ptr<TradingStrategy>> subscribers;StockData(const StockData&) = delete;StockData(double base, double current, std::vector<std::shared_ptr<TradingStrategy>>&& subs): basePrice(base),currentPrice(current),subscribers(std::move(subs)) {}};std::unordered_map<StockSymbol, StockData*> _stocks;mutable std::mutex _mutex;std::atomic<bool> _running{true};std::vector<std::thread> _workers;double generateNewPrice(double base) {static std::mt19937 gen(std::random_device{}());std::normal_distribution<> dist(0, base * 0.02);return base + dist(gen);}