2024-11-21 stan
在撮合过程中如果服务器 crash,会导致:
限价单撮合过程涉及的关键操作:
mpd_sub(taker->left, taker->left, amount, &mpd_ctx);
mpd_add(taker->deal_stock, taker->deal_stock, amount, &mpd_ctx);
mpd_add(taker->deal_money, taker->deal_money, deal, &mpd_ctx);
mpd_add(taker->deal_fee, taker->deal_fee, ask_fee, &mpd_ctx);
balance_sub(taker->user_id, BALANCE_TYPE_AVAILABLE, m->stock, amount);
if (real) {
append_balance_trade_sub(taker, m->stock, amount, price, amount);
}
balance_add(taker->user_id, BALANCE_TYPE_AVAILABLE, m->money, deal);
if (real) {
append_balance_trade_add(taker, m->money, deal, price, amount);
}
if (mpd_cmp(ask_fee, mpd_zero, &mpd_ctx) > 0) {
balance_sub(taker->user_id, BALANCE_TYPE_AVAILABLE, m->money, ask_fee);
if (real) {
append_balance_trade_fee(taker, m->money, ask_fee, price, amount, taker->taker_fee);
}
}
mpd_sub(maker->left, maker->left, amount, &mpd_ctx);
mpd_sub(maker->freeze, maker->freeze, deal, &mpd_ctx);
mpd_add(maker->deal_stock, maker->deal_stock, amount, &mpd_ctx);
mpd_add(maker->deal_money, maker->deal_money, deal, &mpd_ctx);
mpd_add(maker->deal_fee, maker->deal_fee, bid_fee, &mpd_ctx);
balance_sub(maker->user_id, BALANCE_TYPE_FREEZE, m->money, deal);
if (real) {
append_balance_trade_sub(maker, m->money, deal, price, amount);
}
balance_add(maker->user_id, BALANCE_TYPE_AVAILABLE, m->stock, amount);
if (real) {
append_balance_trade_add(maker, m->stock, amount, price, amount);
}
if (mpd_cmp(bid_fee, mpd_zero, &mpd_ctx) > 0) {
balance_sub(maker->user_id, BALANCE_TYPE_AVAILABLE, m->stock, bid_fee);
if (real) {
append_balance_trade_fee(maker, m->stock, bid_fee, price, amount, maker->maker_fee);
}
}
typedef enum {
MATCH_STATUS_INIT = 0,
MATCH_STATUS_PROCESSING = 1,
MATCH_STATUS_DONE = 2
} match_status_t;
struct order_t {
match_status_t match_status;
uint64_t match_time;
};
优点: