2024-11-20 stan
on_cmd_order_put_market 处理市价单请求,主要包含:
market_put_market_order 执行市价单market_put_market_order 的主要步骤:
if (side == MARKET_ORDER_SIDE_ASK) {
mpd_t *balance = balance_get(user_id, BALANCE_TYPE_AVAILABLE, m->stock);
if (!balance || mpd_cmp(balance, amount, &mpd_ctx) < 0) {
return -1;
}
skiplist_iter *iter = skiplist_get_iterator(m->bids);
skiplist_node *node = skiplist_next(iter);
if (node == NULL) {
skiplist_release_iterator(iter);
return -3;
}
skiplist_release_iterator(iter);
if (mpd_cmp(amount, m->min_amount, &mpd_ctx) < 0) {
return -2;
}
} else {
mpd_t *balance = balance_get(user_id, BALANCE_TYPE_AVAILABLE, m->money);
if (!balance || mpd_cmp(balance, amount, &mpd_ctx) < 0) {
return -1;
}
skiplist_iter *iter = skiplist_get_iterator(m->asks);
skiplist_node *node = skiplist_next(iter);
if (node == NULL) {
skiplist_release_iterator(iter);
return -3;
}
skiplist_release_iterator(iter);
order_t *order = node->value;
mpd_t *require = mpd_new(&mpd_ctx);
mpd_mul(require, order->price, m->min_amount, &mpd_ctx);
if (mpd_cmp(amount, require, &mpd_ctx) < 0) {
mpd_del(require);
return -2;
}
mpd_del(require);
}
mpd_copy(order->price, mpd_zero, &mpd_ctx);
mpd_copy(order->amount, amount, &mpd_ctx);
mpd_copy(order->taker_fee, taker_fee, &mpd_ctx);
mpd_copy(order->maker_fee, mpd_zero, &mpd_ctx);
mpd_copy(order->left, amount, &mpd_ctx);
mpd_copy(order->freeze, mpd_zero, &mpd_ctx);
mpd_copy(order->deal_stock, mpd_zero, &mpd_ctx);
mpd_copy(order->deal_money, mpd_zero, &mpd_ctx);
mpd_copy(order->deal_fee, mpd_zero, &mpd_ctx);
特点: