股票监控系统(多用户、多股票)
系统需求
- 支持同时监控多个股票代码(如 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);
}