exchange.IO("lp.plan", ...)
生成建仓计划(只读,不花钱):按预算、价格区间和形状算出各仓位的区间、流动性和两种代币的数量,以及钱包够不够、还要换多少币。
exchange.IO(k, params)示例
-
在选中的池子里规划一个现价±5%的区间仓位,看需要多少资金、钱包够不够。
javascriptfunction main() { var sel = exchange.IO("lp.select", "ETH", 100, {quote: "USDC"}) var params = {symbol: "ETH_USDC", budget: 100, pool: sel.id, range: {pct: [-5, 5]}} var plan = exchange.IO("lp.plan", params) if (!plan) { Log("计划失败:", GetLastError()) return } var p = plan.positions[0] Log("区间:", p.priceLower, "~", p.priceUpper, "现价:", plan.price) Log("需要:", plan.needBase, "ETH +", plan.needQuote, "USDC") Log("预估日手续费:", plan.estDailyFeesUsd, "美元") if (plan.swap) { Log("建仓前要先", plan.swap.side, plan.swap.amount, plan.swap.currency) } if (plan.shortfall) { Log("钱包不够:", plan.shortfall) } } -
三层curve形状:现价附近的仓位最厚。
javascriptfunction main() { var plan = exchange.IO("lp.plan", {symbol: "ETH_USDC", budget: 100, range: {pct: [-5, 5]}, shape: "curve", layers: 3}) plan.positions.forEach(function (p) { Log(p.priceLower, "~", p.priceUpper, "占预算:", p.share) }) if (plan.warning) { Log(plan.warning) } } -
Aerodrome、Velodrome:不写range即为基础池子(volatile)计划。
javascriptfunction main() { var plan = exchange.IO("lp.plan", {symbol: "ETH_USDC", budget: 100, stable: false}) Log(plan.protocol, plan.pool, "存入:", plan.amountBase, "ETH +", plan.amountQuote, "USDC", "得到LP代币:", plan.lpTokens) }
返回值
| 类型 | 描述 |
object / 空值 | 计划对象,字段说明见备注;可以原样传给 |
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
params | object | 是 | 计划参数,如 |
参考
Uniswap / PancakeSwap Aerodrome / Velodrome exchange.IO exchange.IO("lp.select") exchange.IO("lp.simulate") exchange.IO("lp.add") exchange.IO("lp.pools")
备注
params的各项:
| 参数 | 说明 |
|---|---|
symbol | 交易对,如ETH_USDC;价格按计价币/基础币 |
budget | 预算,按计价币计 |
range | 价格区间,三种写法:{lower, upper}为价格;{pct: [-5, 5]}为相对现价的百分比;{ticks: [lo, hi]}为tick。都会对齐到池子的tick间距 |
shape | 形状:spot(默认)单一区间;curve多层嵌套、现价附近最厚;bidask两侧分段、越远越厚 |
layers | curve、bidask的层数,默认3,最多20 |
pool | 池子ID;不写时按lp.select的规则选池(用到下面的fee、tickSpacing) |
fee | 选池时优先的费率(百万分之一) |
slippage | 价格保护比例,默认0.01(1%),最大0.5 |
tickSpacing、protocol | Aerodrome、Velodrome选Slipstream池子时的筛选,protocol默认["slipstream", "slipstream2"] |
stable | Aerodrome、Velodrome基础池子计划:true为stable池子,false为volatile池子,不写两种都看 |
stake | Aerodrome、Velodrome:为true时lp.add建仓后直接质押进gauge |
计划对象的字段:
| 字段 | 说明 |
|---|---|
params | 计划参数原样回显 |
symbol、pool、protocol、fee、tickSpacing、tick、price | 选中的池子与现价 |
shape、layers、layersRequested | 形状、实际层数与请求的层数;实际层数少于请求时另有warning说明原因 |
budget、budgetUsd | 预算(计价币、美元) |
positions | 各仓位{tickLower, tickUpper, priceLower, priceUpper, liquidity, amountBase, amountQuote, share},share为该仓位占预算的比例 |
needBase、needQuote | 建仓需要的两种代币数量 |
haveBase、haveQuote | 钱包里可用的数量 |
swap | 建仓前要换的币{side, amount, currency}(sell为卖出基础币,buy为买入基础币),不用换为null |
payWith | 交易对写原生币时,包装币那一侧用哪种币付(如ETH或WETH),其它情况为null |
shortfall | 钱包不够时的说明,够时为null;有它时lp.add报错。内容见下文「资金」 |
shareOfPool | 建仓后在现价处占池子流动性的比例 |
volume24hUsd、estDailyFeesUsd | 池子24小时成交额、按占池比例估算的日手续费(美元),只是按过去成交外推 |
slippageBps | 价格保护(万分之几) |
资金:钱包里缺哪种代币就用另一种换(多换1%),swap给出要换的数量,lp.add执行时先下这笔市价单;两种代币加起来都不够预算时shortfall说明差额:计划存入的两种代币数量(与needBase、needQuote相同)、钱包现有数量(haveBase、haveQuote)及按池价折合的计价币价值,缺的那种要用另一种换时,付换币的那一种一共需要多少(存入量加换币成本,含1%余量)、还差多少。例如预算100 USDC、计划存入0.02 ETH + 50 USDC、钱包只有60 USDC时,说明里写买缺的0.02 ETH约需50.5 USDC,USDC一侧共需100.5 USDC(存入50 + 换币50.5),还差40.5 USDC。原生币按当前gas价留出约300万gas的手续费,其余才算可用。V3、Slipstream池子里原生币以包装币参与,交易对写原生币(如ETH_USDC)时,包装币那一侧要么整笔用原生币付、要么整笔用包装币付,不会拼着用:原生币够这一侧全额时用原生币,否则包装币够就用包装币,都不够时按余额多的那种计算,payWith为实际用的币。V4/Infinity CL池子里原生币池子与包装币池子是两种池子,各用各的币。
选池:不写pool时每次都按lp.select的规则重新选池,lp.simulate、lp.add收到计划后也是按其中的params重新计算(用最新池价),可能选到别的池子;要建在看过的那个池子里,就在params里写上pool。Uniswap、PancakeSwap用V4/Infinity CL池子时必须写pool(取自lp.select的{protocol: "v4"}或{protocol: "infinity"})。
区间与形状:区间在现价以上时整个仓位都是基础币,在现价以下时都是计价币,这时estDailyFeesUsd为0,价格回到区间才赚手续费。curve的各层都跨过现价、互不相同且对齐tick间距,优先逐层向内嵌套,排不下时用区间内其它跨现价的组合补齐;双边区间最多能放下「现价以下的合法下沿数×现价以上的合法上沿数」层,超过时给出能放下的最多层数。
Aerodrome、Velodrome:有range时用Slipstream池子;不写range(或pool是基础池子)时为基础池子计划:两种代币按储备比例存入,计划为{params, symbol, pool, protocol, stable, fee, price, budget, budgetUsd, needBase, needQuote, haveBase, haveQuote, amountBase, amountQuote, lpTokens, swap, shortfall, shareOfPool, volume24hUsd, estDailyFeesUsd, slippageBps},lpTokens为预计得到的LP代币数量。stake为true时建仓后直接质押(见exchange.IO("lp.stake"))。