内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
Hyperliquid
Lighter
edgeX
Aster
Aevo
Pendle
WOOFi Pro
Uniswap / PancakeSwap
Aerodrome / Velodrome
KyberSwap
1inch
EVM DEX通用指令
Jupiter
exchange.IO("route", ...)
exchange.IO("token", ...)
exchange.IO("transfer", ...)
exchange.IO("receipt", ...)
exchange.IO("slippage", ...)
exchange.IO("priorityFee", ...)
exchange.IO("dexes", ...)
exchange.IO("rps", ...)
exchange.IO("lp.pools", ...)
exchange.IO("lp.select", ...)
exchange.IO("lp.pool", ...)
exchange.IO("lp.ticks", ...)
exchange.IO("lp.plan", ...)
exchange.IO("lp.simulate", ...)
exchange.IO("lp.add", ...)
exchange.IO("lp.increase", ...)
exchange.IO("lp.decrease", ...)
exchange.IO("lp.collect", ...)
exchange.IO("lp.remove", ...)
exchange.IO("lp.positions", ...)
exchange.IO("pump.*", ...)
exchange.IO("dca.*", ...)
exchange.IO("trigger.*", ...)
exchange.IO("bridge.*", ...)
OKX DEX
DEX策略示例
预测市场
证券与期货
链上与自定义接入
exchange.IO("lp.simulate", ...)
按建仓计划构造全部建仓交易,用节点模拟执行,不签名、不广播。
exchange.IO(k, plan)
exchange.IO(k, plan, payer)示例
-
规划后先模拟,模拟通过再建仓。
javascriptfunction main() { var plan = exchange.IO("lp.plan", {symbol: "SOL_USDC", budget: 100, range: {pct: [-5, 5]}}) if (!plan) { Log("规划失败:", GetLastError()) return } var sim = exchange.IO("lp.simulate", plan) if (!sim) { Log("模拟出错:", GetLastError()) return } sim.positions.forEach(function(p) { Log(p.ok ? "成功" : "失败", p.amountBase, "SOL", p.amountQuote, "USDC", "计算单元", p.unitsConsumed, p.error || "") }) Log("全部通过:", sim.ok, sim.note) } -
以另一个钱包为付款人验证计划(只读)。
javascriptvar PAYER = "" // 填一个持有SOL和USDC的钱包地址 function main() { if (!PAYER) { Log("请先把PAYER设为一个钱包地址") return } var sim = exchange.IO("lp.simulate", {symbol: "SOL_USDC", budget: 200, range: {pct: [-3, 3]}, shape: "spot", protocol: "meteora"}, PAYER) if (!sim) { Log("模拟出错:", GetLastError()) return } Log(sim.protocol, sim.pool, "付款人", sim.payer, "全部通过", sim.ok) sim.positions.forEach(function(p) { Log("bin", p.lowerBinId, p.upperBinId, p.ok, p.unitsConsumed, p.txBytes, p.error || "") }) }
返回值
| 类型 | 描述 |
object / 空值 |
|
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
plan | object | 是 |
|
payer | string | 否 | 另一个钱包地址:以它为付款人和仓位主人模拟(只读,不需要它的私钥),用于自己钱包没钱时验证计划。 |
参考
备注
模拟什么
- 先按计划的
params在最新池价与付款人余额下重新规划,再为每个仓位构造一笔完整的建仓交易,用节点的simulateTransaction执行(不验签)。 - 不换币:计划要先换币(
swap不为null)时按换完的数量模拟,swapNeeded为true;要换币或有shortfall时note提醒付款人必须持有计划的数量模拟才能通过,否则note为空串。 - 各协议的交易:DLMM为新建BinArray、建仓位账户、建ATA、包装SOL、加流动性、解包;Raydium为建ATA、包装SOL、
open_position_with_token22_nft(建仓位NFT与仓位账户,缺的TickArray由程序新建)、解包;Orca为建ATA、包装SOL、新建变长TickArray(initialize_dynamic_tick_array)、开仓(open_position_with_token_extensions)、按数量上限加流动性(increase_liquidity_by_token_amounts_v2)、解包。
positions的每一项
| 字段 | 说明 |
|---|---|
position | 这次模拟新生成的仓位账户(DLMM)或仓位NFT mint(Raydium、Orca)地址;lp.add会另外生成 |
lowerBinId、upperBinId | 区间(Raydium、Orca为tickLower、tickUpper) |
amountBase、amountQuote | 这笔交易存入的两种代币 |
ok、err、error | 是否成功、节点返回的原始错误、失败原因(DLMM、Raydium CLMM、Orca Whirlpool的错误码附名字) |
logs | 程序日志的尾部 |
unitsConsumed、txBytes | 消耗的计算单元、交易字节数 |
常见失败:AccountNotFound为付款人没有SOL(新钱包或空钱包);余额不够计划的数量时程序报代币不足。自己的钱包还没入金时,可以把payer设为一个持有两种代币的公开钱包来验证计划本身。