交易行的挂单等待模式效率低下:买家挂求购单、卖家挂售卖单,两边的单子互相看不见,成交靠缘分。撮合引擎引入自动匹配:求购价与售卖价交叉时自动成交(系统按先挂先得原则执行),买卖双方从等人变成被系统配对——流动性在撮合中自然生长。
撮合引擎与成交执行:价格交叉检测、自动成交。示例代码如下:
local engine = { buys = {}, sells = {} }
local function addBuy(buyer, item, price)
engine.buys[#engine.buys + 1] =
{ buyer = buyer, item = item, price = price }
end
local function addSell(seller, item, price)
engine.sells[#engine.sells + 1] =
{ seller = seller, item = item, price = price }
end
local function matchAndTrade()
for i = #engine.buys, 1, -1 do
local b = engine.buys[i]
for j = #engine.sells, 1, -1 do
local s = engine.sells[j]
if s.item == b.item and s.price <= b.price then
executeTrade(b.buyer, s.seller, s.item, s.price)
table.remove(engine.buys, i)
table.remove(engine.sells, j)
break
end
end
end
end
成交执行示例代码如下:
local function executeTrade(buyer, seller, item, price)
print("成交:" .. item .. " " .. price .. "金币 " ..
seller .. "->" .. buyer)
end
engine 分 buys 与 sells 两个列表,matchAndTrade 遍历求购单在售卖单中找同品名且价格交叉的对手方,找到即执行成交并从两侧移除。撮合按倒序遍历(最新的单优先匹配),成交价取售卖方的报价(卖方定价权)。
撮合引擎踩过三个坑:一是撮合遍历中同时修改两个列表的元素,倒序遍历加 break 保证删除安全;二是同品名不同绑定价的物品被误匹配(绑定与非绑定混拍),匹配条件加绑定状态一致校验;三是撮合在主线程执行耗时长时阻塞其他逻辑,撮合按批次分帧执行(每帧最多撮合 50 对)。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景:if dist 20 then rate = 0.5 end —— 距离折损的全部骨架。组队打宝有人…
【游戏】 一、业务场景:STOCK = STOCK - 1 —— 全服限量抢购的核心一行。限量 1000 件的活动因不验余量…
【语法】 一、抛坑提问:按"金币除以等级"的复合值排序,比较函数里每次都现算除法,n log n 次重复计算——装饰排序先把…
【语法】 一、抛坑提问:背包格子列表整体后移 2 格,末尾 2 件绕回头部,逐个搬移要写嵌套循环——三步反转法三次交换完成,…
【游戏】 一、业务场景:PROGRESS = 0 —— 任务重接的全部规则。讨伐祖玛教主 30 只的任务卡在 29 只想换路…
【语法】 一、隐蔽陷阱:嵌套盒子求总金币用递归,盒子层数不可控时调用栈随之失控;把递归改成显式栈循环,层数与内存占用从失控变…