核心交易功能
Core Trading Features
概述
市场系统让价格响应交易活动。当玩家或AI交易者与市场实体(ID 22)买卖商品时,价格会根据供需自动调整。
✅ 开箱即用
无需配置 - 系统已自动完成:MarketManager 追踪需求、TradeManager 报告市场交易、价格自动更新、交易图表实时显示。
无需配置 - 系统已自动完成:MarketManager 追踪需求、TradeManager 报告市场交易、价格自动更新、交易图表实时显示。
使用系统
1. 与市场交易
所有与交易者 ID 22 的交易会自动影响价格:
# 玩家从市场买入
trade_manager.execute_transfer(
commodity_id,
22, "trader", # From: Market Entity
player_id, "trader", # To: Player
quantity,
"player_bag"
)
# → 价格会因买入压力上涨
# 玩家卖给市场
trade_manager.execute_transfer(
commodity_id,
player_id, "trader", # From: Player
22, "trader", # To: Market Entity
quantity,
"market_warehouse"
)
# → 价格会因卖出压力下跌
2. 检查市场状态
# 获取商品的需求信息
var demand = market_manager.get_market_demand(commodity_id)
print("Net Demand: ", demand.net_demand) # 正数 = 买入压力
# 打印完整的市场报告
market_manager.debug_print_market_demand()
3. 观察价格变化
打开交易图表 UI - 价格自动更新:
- 买入压力 → 价格上涨(绿色)
- 卖出压力 → 价格下跌(红色)
- 需求随时间衰减 → 价格稳定
4. 测试系统
# 运行综合测试
var trade_manager = get_node("/root/GlobalData/TradeManager")
trade_manager.test_market_price_response()
# 输出显示:
# - 初始价格
# - 交易活动
# - 需求变化
# - 最终价格
理解价格变化
价格公式
New Price = Current Price + Random Volatility + Trend + Demand Impact
Demand Impact = Net Demand × 0.0015 × Current Price
示例
- 铁矿石价格:$15.00
- 玩家买入 100 单位
- 净需求:+100
- 需求影响:100 × 0.0015 × 15 = +$2.25 ✓
- 价格在接下来几个 tick 上涨至约 $17.25
需求衰减
需求自然衰减(每 tick 5%):
- Tick 0:+100 需求
- Tick 14:+50 需求(减半)
- Tick 28:+25 需求
- 最终:~0 需求 → 价格稳定
调优市场
默认设置(平衡)
demand_decay_rate: 0.95 # 每 tick 衰减 5%
price_sensitivity: 0.0015 # 适度响应
max_price_change: 0.05 # 每 tick 最大 5%
demand_smoothing: 0.3 # 平滑但响应迅速
更剧烈的市场波动
market_manager.set_market_parameters({
"price_sensitivity": 0.005, # 3倍响应
"max_price_change_per_tick": 0.10, # 允许 10% 波动
"demand_decay_rate": 0.85 # 更快衰减
})
更稳定的市场
market_manager.set_market_parameters({
"price_sensitivity": 0.0005, # 更低响应
"max_price_change_per_tick": 0.02, # 仅 2% 波动
"demand_decay_rate": 0.98 # 更慢衰减
})
常见场景
场景 1:玩家大量购买
玩家购买 500 铁矿石
→ 高买入压力
→ 价格上涨 10-15%
→ 接下来一分钟,需求衰减
→ 价格稳定在新水平 (+5%)
场景 2:市场崩盘
玩家出售 1000 钻石
→ 高卖出压力
→ 价格暴跌 20-30%
→ 其他玩家看到便宜价格
→ 开始买入
→ 需求平衡
→ 价格部分恢复
场景 3:交易均衡
买卖量相等
→ 净需求 ~0
→ 价格自然波动(随机游走)
→ 无明显趋势
调试
检查系统是否正常工作
# 1. 验证 MarketManager 已连接
var tm = get_node("/root/GlobalData/TradeManager")
tm.print_debug_info()
# 应显示: "MarketManager连接状态: 已连接"
# 2. 执行测试交易
tm.execute_transfer(3, 22, "trader", 1, "trader", 10.0, "test")
# 3. 检查需求是否记录
var mm = get_node("/root/GlobalData/MarketManager")
mm.debug_print_market_demand()
# 应显示商品 ID 3 的需求
故障排除
问题:价格不变
- 检查交易是否涉及市场实体(ID 22)
- 验证 MarketManager 已连接:
trade_manager.print_debug_info() - 检查游戏时间是否运行(未暂停)
问题:价格变化过大/过小
- 调整
price_sensitivity参数 - 检查
max_price_change_per_tick限制
问题:需求不衰减
- 验证游戏时间在运行:MarketManager._process() 正在执行
- 检查衰减率:
market_manager.get_market_parameters()
最佳实践
游戏玩法
- 从默认参数开始
- 运行测试观察行为
- 根据期望的经济速度调整
- 通过交易图表监控
AI 交易者
# AI 应与市场实体交易
ai_trader.buy_commodity(commodity_id, quantity)
↓
# 内部调用
trade_manager.execute_transfer(
commodity_id,
22, "trader", # 始终从/到市场
ai_trader_id, "trader",
quantity,
"ai_inventory"
)
平衡建议
- 高交易量商品:降低敏感度
- 稀有商品:提高敏感度
- 防止操纵:限制每 tick 最大变化
- 确保流动性:市场实体保持大量储备
控制台命令
用于测试的常用命令:
# 快速查看市场状态
get_node("/root/GlobalData/MarketManager").debug_print_market_demand()
# 运行综合测试
get_node("/root/GlobalData/TradeManager").test_market_price_response()
# 检查参数
print(get_node("/root/GlobalData/MarketManager").get_market_parameters())
# 调整市场
get_node("/root/GlobalData/MarketManager").set_market_parameters({
"price_sensitivity": 0.003
})
后续步骤
- ✅ 系统已就绪
- 打开交易图表观察价格
- 与市场实体(ID 22)进行一些交易
- 实时观察价格响应
- 根据需要调整参数
相关资源
- 完整文档:
market_system_design.md - 实现细节:
MARKET_IMPLEMENTATION_SUMMARY.md - Market Manager:
gdt/scripts/core/managers/market_manager.gd - Trade Manager:
gdt/scripts/trade/trade_manager.gd