exchange.IO("dca.*", ...)
用Jupiter的定投(DCA)分批买入或卖出:创建、列出、撤销与模拟。
exchange.IO(k)
exchange.IO(k, params)
exchange.IO(k, params, wallet)
exchange.IO(k, id)示例
-
创建前先模拟:每天买入100 USDC的SOL,共10天(只读)。
javascriptfunction main() { var params = {symbol: "SOL_USDC", side: "buy", total: 1000, numberOfOrders: 10, interval: 86400} var sim = exchange.IO("dca.simulate", params) if (!sim) { Log("参数不合要求:", GetLastError()) return } Log(sim.version, "模拟", sim.ok ? "成功" : "失败", sim.reason || "", "每份", sim.plan.perOrder, "共", sim.plan.numberOfOrders, "份") } -
创建定投,查看进度,再撤销。
javascriptfunction main() { var params = {symbol: "SOL_USDC", side: "buy", total: 200, perOrder: 100, interval: 3600, maxPrice: 300} var r = exchange.IO("dca.create", params) if (!r) { Log("创建失败:", GetLastError()) return } Log("已创建", r.version, r.id, "交易", r.signature) Sleep(5 * 60 * 1000) var list = exchange.IO("dca.list", {symbol: "SOL_USDC"}) || [] list.forEach(function(d) { Log(d.id, d.state, "已成交", d.ordersFilled, "/", d.numberOfOrders, "花出", d.spent, "换到", d.received, "均价", d.avgPrice) }) var c = exchange.IO("dca.cancel", r.id) Log("撤销:", c ? JSON.stringify(c) : GetLastError()) }
返回值
| 类型 | 描述 |
object / array / 空值 |
|
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 指令名: |
params | object | 否 |
|
id | string | 否 |
|
wallet | string | 否 |
|
参考
备注
v1与V2
| Recurring v1 | Trigger V2 | |
|---|---|---|
何时使用(trigger.api为缺省的auto) | 没有配置API Key,或计价币不是USDC、USDT | 配置了API Key且计价币为USDC或USDT |
| 资金存放 | 链上定投订单账户(程序DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M) | Jupiter托管的vault(与V2限价单共用) |
| 定投ID | 定投订单账户地址 | 订单UUID |
| 最低金额 | 至少2份,每份至少值50美元 | 至少2份,每份至少值10美元 |
| 间隔与开始时间 | 任意整数秒 | 60秒到1年;startAt最多30天后 |
| 价格区间 | 区间外的一轮跳过 | 按基础币的美元价判断,区间外的一轮顺延到下一个间隔 |
| 其它 | 不支持Token-2022代币;Jupiter从换到的币中收0.1%手续费 | 每个钱包最多10个进行中的定投;滑点由Jupiter自动设定;手续费已含在换到的数量中 |
exchange.IO("trigger.api")同样适用于定投:v1保持Recurring v1,v2强制V2。Jupiter已不再维护Recurring v1(仍可用)。定投不进exchange.GetOrders()等订单函数,只能用dca.list查看。
定投参数
| 键 | 必填 | 说明 |
|---|---|---|
symbol | 是 | 交易对,如SOL_USDC |
side | 是 | buy:用计价币分批买入基础币,total、perOrder按计价币计;sell:分批卖出基础币,按基础币计 |
total | 是 | 总额,创建时一次存入 |
perOrder、numberOfOrders | 二选一 | 每份金额或份数;都给时必须一致,只给perOrder时total必须是它的整数倍 |
interval | 是 | 每份的间隔秒数(整数) |
minPrice、maxPrice | 否 | 价格区间(计价币/基础币),见上表 |
startAt | 否 | 开始时间戳(毫秒,必须在将来),缺省立即开始 |
dca.create
返回{id, version, signature, symbol, side, total, perOrder, numberOfOrders, interval, minPrice, maxPrice, startAt, priorityFeeLamports},version为v1或v2。v1:总额存入新建的定投订单账户,signature为创建交易,只等广播、不等上链;下单前在本地检查份数、每份金额(按Jupiter价格接口折算美元)与Token-2022。V2:总额存入vault(存入交易由连接器签名,Jupiter在创建定投时上链,返回时已上链),id为订单UUID,另有vault。
dca.list
列出本钱包的定投(v1在前;配置了API Key或trigger.api为v2时再列V2)。参数{status, symbol}:status为active(缺省,进行中)或history(已结束),symbol只列这个交易对。每项为{id, version, symbol, side, state, total, perOrder, numberOfOrders, ordersFilled, interval, minPrice, maxPrice, spent, received, filledQty, avgPrice, fee, createdAt, updatedAt, openTx, closeTx, info}:
state为active、completed或canceled,V2另有pending(存入中)、canceling(已撤销、未取回)、failed(存入失败)。spent为已花出的输入币,received为已换到的输出币,fee为其中被扣的手续费(输出币计;V2为null);filledQty、avgPrice为按基础币折算的成交量与均价;V2行另有nextFillAt;info为Jupiter的原始行。- Jupiter收录新建的v1定投有几分钟延迟:这期间本程序刚创建(10分钟内)、链上账户已存在的定投也列在
active里,indexed为false,数字取自链上账户(ordersFilled、fee、updatedAt、closeTx为null)。
dca.cancel
撤销一笔进行中的定投,按id的形状分v1、V2(V2要配置API Key或trigger.api为v2)。已成交的轮次不退。
- v1:剩余的输入币与未提取的输出币退回钱包,只等广播、不等上链;返回
{id, version, signature, priorityFeeLamports}。Jupiter还没收录的v1定投(刚创建的几分钟内)只要链上账户属于本钱包也能撤:连接器按定投程序的close_dca指令自己构造撤销交易,先模拟再签名广播,返回另带indexed: false。 - V2分两步:Jupiter先停止定投并生成取回交易,连接器核对、签名后交给Jupiter上链;返回
{id, version, signature, refund, refundCurrency, roundsRemaining, info},signature为取回交易,refund为退回的输入币数量。第二步失败时定投停在canceling,再撤一次即可取回。
dca.simulate
按dca.create的参数生成交易,用节点的simulateTransaction执行(不签名、不广播),用来在下单前检查余额、最低金额等;params写成{cancel: id}时模拟撤销这笔定投。返回{ok, err, reason, logs, unitsConsumed, version, wallet, id, plan, priorityFeeLamports}:ok为模拟是否成功,失败时reason为原因(付款钱包一个SOL都没有时节点只回err为AccountNotFound,reason为AccountNotFound (the paying wallet has no SOL));id为将要新建的定投账户地址;plan为换算后的定投参数。
走V2时模拟的是存入vault的交易,只能用本钱包,结果另有vault、没有id;钱包还没有vault时报错,先用exchange.IO("trigger.vault", "register")注册(不动钱)。V2定投不能模拟撤销(撤销调用本身就会停止定投)。