输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
交易所

按预算、价格区间与形状算出建仓计划:用哪个池子、几个仓位、各放多少两种代币、要不要先换币、押多少租金。只读,不发交易。

exchange.IO(k, params)

示例

  • 规划在SOL/USDC现价上下5%建仓,检查是否要先换币。

    javascript
    function main() { var plan = exchange.IO("lp.plan", {symbol: "SOL_USDC", budget: 100, range: {pct: [-5, 5]}}) if (!plan) { Log("规划失败:", GetLastError()) return } Log(plan.protocol, plan.pool, "现价", plan.price, "仓位数", plan.positions.length) plan.positions.forEach(function(p) { Log("区间", p.priceLower.toFixed(2), "-", p.priceUpper.toFixed(2), "SOL", p.amountBase, "USDC", p.amountQuote) }) Log("需要", plan.needBase, "SOL", plan.needQuote, "USDC", "租金", plan.rentSol, "SOL", "其中可退", plan.rentRefundableSol) if (plan.shortfall) { Log("余额不足:", plan.shortfall) } else if (plan.swap) { Log("建仓前要先", plan.swap.side, plan.swap.amount, plan.swap.currency) } Log("预估日手续费", plan.estDailyFeesUsd, "美元") }
  • 在Meteora池子上比较spot与curve:spot的宽区间拆成多个仓位,curve只能放进一个仓位。

    javascript
    function main() { var pool = exchange.IO("lp.select", "SOL", 100, {quote: "USDC", protocol: "meteora"}) if (!pool) { Log("选池失败:", GetLastError()) return } // 约60个bin:一个仓位放得下 var pct = 30 * pool.binStep / 100 var curve = exchange.IO("lp.plan", {symbol: "SOL_USDC", budget: 100, pool: pool.id, range: {pct: [-pct, pct]}, shape: "curve"}) if (curve) { Log(curve.strategy, "bins", curve.bins, "仓位数", curve.positions.length) } var spot = exchange.IO("lp.plan", {symbol: "SOL_USDC", budget: 100, pool: pool.id, range: {pct: [-10, 10]}, shape: "spot"}) if (spot) { Log(spot.strategy, "bins", spot.bins, "仓位数", spot.positions.length, spot.warning) } }
  • 在Raydium池子上规划4层的curve。

    javascript
    function main() { var plan = exchange.IO("lp.plan", {symbol: "SOL_USDC", budget: 100, protocol: "raydium", range: {pct: [-5, 5]}, shape: "curve", layers: 4}) if (!plan) { Log("规划失败:", GetLastError()) return } Log("tickSpacing", plan.tickSpacing, "层数", plan.layers, "/", plan.layersRequested) plan.positions.forEach(function(p) { Log("tick", p.tickLower, p.tickUpper, "占比", (p.share * 100).toFixed(1) + "%") }) }

返回值

类型描述

object / 空值

计划对象,字段见备注;可以原样交给lp.simulate、lp.add。参数错误、选不到池子、空池、区间超出一个计划的上限时返回空值,GetLastError()中有原因。钱包余额不够不算错误,照样返回计划,shortfall说明差额。

参数

名称类型必填描述

k

string

是

固定为lp.plan,用于生成建仓计划。

params

object

是

计划参数{symbol, budget, range, shape, pool, protocol, fee, binStep, tickSpacing, slippage, layers},见备注。也可以传一个计划(取其中的params)。

参考

备注

计划参数
键必填说明
symbol是交易对,如SOL_USDC:决定价格朝向(计价币/基础币)与budget的币种
budget是预算,按计价币计:两种代币合计的价值
range是价格区间,四种写法见下
shape否形状:spot(缺省)、curve、bidask,见下
pool否池子地址或协议:地址;不给时按lp.select的规则选池
protocol、fee、binStep、tickSpacing否不给pool时的选池条件,同lp.select的options
slippage否价格保护比例,缺省0.01,最大0.5,见下
layers否Raydium、Orca的curve、bidask层数,缺省3,最多20

range的写法:

  • {lower, upper}:价格(计价币/基础币)。
  • {pct: [-5, 5]}:相对现价的百分比。
  • {bins: [lowerBinId, upperBinId]}:DLMM的bin号(含两端)。
  • {ticks: [tickLower, tickUpper]}:Raydium、Orca的tick。bins与ticks同义,按池子的协议解释为bin号或tick。

价格向外取整到bin,或向外对齐到tick间距。

形状

Meteora DLMM按bin分配,对应DLMM的三种策略(strategy):spot为SpotImBalanced(各bin等值),curve为CurveImBalanced(两边朝现价变厚),bidask为BidAskImBalanced(两边朝外变厚)。现价所在的bin及以下放池子的Y,以上放X。一个仓位最多70个bin:spot的区间更宽时拆成多个仓位(每个一笔交易、各押一份租金,最多10个,warning说明),curve、bidask超过70个bin时报错。

Raydium CLMM与Orca Whirlpools按Uniswap的方式规划:spot为单一区间;curve为多层嵌套的区间(现价附近最厚);bidask为现价两侧分段(越远越厚,含现价的那一格空着)。layers为层数,区间太窄时实际层数(layers)可能少于layersRequested。每个仓位一个NFT、一笔交易,一个计划最多20个仓位。Orca的Splash池(tick间距不小于32768)只能建全区间仓位,区间与形状被忽略(warning说明)。

价格保护(slippage)
  • DLMM:换算成允许active bin偏离的bin数maxActiveBinSlippage,执行时active bin偏离超过它则交易失败。
  • Raydium:给出两种代币的用量上限:以一种代币定量(SOL那一侧优先),另一种的上限为价格在这个比例内浮动时的最大用量。
  • Orca:限定执行价格,priceBounds为由此算出的价格界限,执行时越界则交易失败。

返回字段
  • 通用:params(参数原样)、symbol、pool、protocol、fee、feeRate、price(计价币/基础币)、shape、budget、budgetUsd、slippageBps、volume24hUsd。
  • positions:各仓位的{lowerBinId, upperBinId, priceLower, priceUpper, amountBase, amountQuote, share}(Raydium、Orca为tickLower、tickUpper),share为这个仓位占计划总值的比例。
  • needBase、needQuote为计划要存入的两种代币,haveBase、haveQuote为钱包可用的量(SOL那一侧已扣除租金与手续费的预留,钱包里的wSOL一并算进SOL);swap为建仓前要换的币{side, amount, currency}(多换1%留余量),不用换为null;两种代币合计也不够时swap为null、shortfall为差额说明:计划存入的两种代币数量(与needBase、needQuote相同)、钱包现有数量及按池价折合的计价币价值,缺的那种要用另一种换时,付换币的那一种一共需要多少(存入量加换币成本,含1%余量)、还差多少;SOL那一侧另写明为租金与手续费留出的数量。
  • rentSol为建仓要押的租金,其中rentRefundableSol为仓位账户(Raydium、Orca还有NFT mint与NFT账户,Orca另含两个tick)的租金,关仓时退回;其余是新建BinArray、TickArray的租金,不退。
  • shareOfPool为本计划在现价处的流动性占比(DLMM为在active bin里的份额),estDailyFeesUsd = volume24hUsd × feeRate × shareOfPool(假设价格一直在区间内);现价处没有流动性的计划(如bidask)这两项为0。
  • DLMM另有strategy、binStep、activeId、lowerBinId、upperBinId、bins(bin数)、maxActiveBinSlippage、binArraysToCreate(要新建的BinArray序号);Raydium、Orca另有tickSpacing、tick、tickLower、tickUpper(整个区间)、layers、layersRequested、tickArraysToCreate(要新建的TickArray起点),Raydium另有liquidities(各仓位的流动性),Orca另有priceBounds;有需要说明的情况时另有warning。

计划只是当时的快照:lp.simulate与lp.add收到计划后会按其中的params在最新的池价与余额下重新规划。预估手续费按过去24小时的成交估算,不代表未来收益。