关于 orderly-trading-orders
orderly-trading-orders 是面向 Orderly Network 开发者的订单管理技能,涵盖 REST API 与 React SDK 的下单、修改和撤单。它还介绍订单类型、参数校验、批量操作及实时订单流。
主要功能
- 01介绍多种订单类型
- 02通过 REST API 下单与编辑
- 03使用 React SDK 管理订单
- 04批量创建或撤销订单
- 05实时监控订单状态
适用场景
- 01构建交易界面的订单表单
- 02实现自动交易机器人的订单逻辑
- 03按交易品种规则校验订单参数
- 04追踪订单状态并撤销挂单
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ orderlynetwork/ skills --skill orderly-trading-orders安装后在 Claude Code 中输入/orderly-trading-orders确认已加载。
详细介绍
Orderly Network:交易订单
此技能涵盖 Orderly Network 上订单管理的各个方面,包括通过 REST API 和 React SDK 下单、修改和取消订单。
使用场景
- 构建交易界面
- 实现下单逻辑
- 管理订单生命周期
- 创建自动交易机器人
前提条件
- 已注册 Orderly 账户
- 具有
trading权限范围的 Ed25519 API 密钥 - 账户中有足够的抵押品
订单类型
| 类型 | 描述 | 使用场景 |
|---|---|---|
LIMIT | 按指定价格下单 | 精确入场/出场 |
MARKET | 按当前最佳可用价格执行 | 立即执行 |
IOC | 立即成交或取消 | 可接受部分成交 |
FOK | 全部成交或取消 | 要么全部成交,要么不成交 |
POST_ONLY | 仅做市订单 | 赚取做市返佣 |
ASK | 保证以最佳卖价成交 | 快速卖出 |
BID | 保证以最佳买价成交 | 快速买入 |
REST API:下单
端点
POST /v1/order
请求正文
interface OrderRequest {
symbol: string; // e.g., "PERP_ETH_USDC"
side: 'BUY' | 'SELL';
order_type: 'LIMIT' | 'MARKET' | 'IOC' | 'FOK' | 'POST_ONLY' | 'ASK' | 'BID';
order_price?: number; // Required for LIMIT orders
order_quantity: number; // Base asset quantity
visible_quantity?: number; // For hidden orders (0 = hidden)
client_order_id?: string; // Your custom ID
trigger_price?: string; // For stop orders
}
示例
import { signAsync } from '@noble/ed25519';
async function placeOrder(order: OrderRequest) {
const timestamp = Date.now();
const body = JSON.stringify(order);
const message = `${timestamp}POST/v1/order${body}`;
const signature = await signAsync(new TextEncoder().encode(message), privateKey);
// Encode as base64url (browser & Node.js compatible)
const base64 = btoa(String.fromCharCode(...signature));
const base64url = base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
const response = await fetch('https://api.orderly.org/v1/order', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'orderly-timestamp': String(timestamp),
'orderly-account-id': accountId,
'orderly-key': `ed25519:${publicKeyBase58}`,
'orderly-signature': base64url,
},
body,
});
return response.json();
}
// Place a limit buy order
const order = await placeOrder({
symbol: 'PERP_ETH_USDC',
side: 'BUY',
order_type: 'LIMIT',
order_price: 3000,
order_quantity: 0.1,
});
React SDK:useOrderEntry
SDK 提供了一个便捷的下单 Hook:
import { useOrderEntry, OrderSide, OrderType } from '@orderly.network/hooks';
function OrderForm({ symbol }: { symbol: string }) {
const {
submit,
setValue,
getValue,
helper,
reset,
isSubmitting
} = useOrderEntry(symbol, {
initialOrder: {
side: OrderSide.BUY,
order_type: OrderType.LIMIT,
price: '',
order_quantity: '',
},
});
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
// Validate before submission
const validationResult = await helper.validate();
if (!validationResult) {
console.error('Validation failed');
return;
}
try {
await submit();
reset();
console.log('Order placed successfully');
} catch (error) {
console.error('Order failed:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<select
onChange={(e) => setValue('side', e.target.value as OrderSide)}
value={getValue('side')}
>
<option value={OrderSide.BUY}>Buy</option>
<option value={OrderSide.SELL}>Sell</option>
</select>
<select
onChange={(e) => setValue('order_type', e.target.value as OrderType)}
value={getValue('order_type')}
>
<option value={OrderType.LIMIT}>Limit</option>
<option value={OrderType.MARKET}>Market</option>
</select>
<input
type="text"
placeholder="Price"
value={getValue('price') || ''}
onChange={(e) => setValue('price', e.target.value)}
/>
<input
type="text"
placeholder="Quantity"
value={getValue('order_quantity') || ''}
onChange={(e) => setValue('order_quantity', e.target.value)}
/>
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? 'Placing...' : 'Place Order'}
</button>
</form>
);
}
订单验证
提交前,请验证订单参数:
// Get order rules for a symbol
const rulesResponse = await fetch('https://api.orderly.org/v1/public/info/PERP_ETH_USDC');
const rules = await rulesResponse.json();
/*
Rules include:
- base_min: Minimum order size
- base_max: Maximum order size
- base_tick: Size increment
- quote_min: Minimum price
- quote_max: Maximum price
- quote_tick: Price increment
- min_notional: Minimum order value
*/
function validateOrder(order: OrderRequest, rules: OrderRules): boolean {
// Price filter
if (order.order_price) {
const price = parseFloat(order.order_price);
if (price < rules.quote_min || price > rules.quote_max) {
throw new Error('Price out of range');
}
if ((price - rules.quote_min) % rules.quote_tick !== 0) {
throw new Error('Invalid price tick');
}
}
// Size filter
const quantity = parseFloat(order.order_quantity);
if (quantity < rules.base_min || quantity > rules.base_max) {
throw new Error('Quantity out of range');
}
if ((quantity - rules.base_min) % rules.base_tick !== 0) {
throw new Error('Invalid quantity tick');
}
// Min notional
const notional = (parseFloat(order.order_price) || 0) * quantity;
if (notional < rules.min_notional) {
throw new Error(`Minimum order value is ${rules.min_notional}`);
}
return true;
}
取消订单
取消单个订单
// REST API
DELETE /v1/order?order_id={order_id}&symbol={symbol}
// React SDK
import { useOrderStream } from '@orderly.network/hooks';
function OrderList() {
const [orders, { cancelOrder }] = useOrderStream({
status: OrderStatus.INCOMPLETE,
});
return orders.map((order) => (
<div key={order.order_id}>
{order.symbol} - {order.side} - {order.order_qty}
<button onClick={() => cancelOrder(order.order_id)}>
Cancel
</button>
</div>
));
}
取消所有订单
// REST API - Cancel all open orders
DELETE /v1/orders?symbol={symbol} // Optional symbol filter
// React SDK
const [orders, { cancelAllOrders }] = useOrderStream();
await cancelAllOrders(); // Cancel all
await cancelAllOrders({ symbol: 'PERP_ETH_USDC' }); // Cancel for specific symbol
按客户端订单 ID 取消
DELETE /v1/client/order?client_order_id={client_order_id}&symbol={symbol}
批量订单
在单个请求中下单或取消多个订单:
// Batch create (max 10 orders)
POST /v1/batch-order
Body: {
orders: [
{ symbol: 'PERP_ETH_USDC', side: 'BUY', order_type: 'LIMIT', order_price: 3000, order_quantity: 0.1 },
{ symbol: 'PERP_BTC_USDC', side: 'BUY', order_type: 'LIMIT', order_price: 50000, order_quantity: 0.01 }
]
}
// Batch cancel (max 10 orders)
DELETE /v1/batch-order?order_ids={id1},{id2},...
// Example
const batchResponse = await fetch('https://api.orderly.org/v1/batch-order', {
method: 'POST',
headers: { /* auth headers */ },
body: JSON.stringify({
orders: [
{ symbol: 'PERP_ETH_USDC', side: 'BUY', order_type: 'LIMIT', order_price: 3000, order_quantity: 0.1 },
{ symbol: 'PERP_BTC_USDC', side: 'BUY', order_type: 'LIMIT', order_price: 50000, order_quantity: 0.01 }
]
}),
});
修改订单
修改现有订单的价格或数量:
// REST API
PUT /v1/order
Body: {
order_id: '123456',
order_price: '3100', // New price
order_quantity: '0.2', // New quantity
}
订单流(实时)
实时监控订单:
import { useOrderStream, OrderStatus } from '@orderly.network/hooks';
function OrderMonitor() {
const [orders, { cancelOrder }] = useOrderStream({
status: OrderStatus.INCOMPLETE,
});
return (
<table>
<thead>
<tr>
<th>Symbol</th>
<th>Side</th>
<th>Price</th>
<th>Quantity</th>
<th>Filled</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{orders.map((order) => (
<tr key={order.order_id}>
<td>{order.symbol}</td>
<td>{order.side}</td>
<td>{order.price}</td>
<td>{order.order_qty}</td>
<td>{order.filled_qty}</td>
<td>{order.status}</td>
<td>
<button onClick={() => cancelOrder(order.order_id)}>
Cancel
</button>
</td>
</tr>
))}
</tbody>
</table>
);
}
算法订单(止损、止盈/止损)
有关止盈和止损订单,请参阅 orderly-positions-tpsl 技能。
// Basic algo order structure
POST /v1/algo/order
Body: {
symbol: 'PERP_ETH_USDC',
type: 'CLOSE_POSITION',
algoType: 'TAKE_PROFIT',
trigger_price: '3500',
quantity: '0.1',
}
速率限制
| 端点 | 速率限制 |
|---|---|
| POST /v1/order | 10 req/sec |
| DELETE /v1/order | 10 req/sec |
| PUT /v1/order | 10 req/sec |
| POST /v1/batch-order | 1 req/sec |
| DELETE /v1/batch-order | 10 req/sec |
订单状态流转
NEW → PARTIAL_FILLED → FILLED
↘ CANCELLED
↘ REJECTED (invalid orders)
↘ EXPIRED (GTD orders)
常见问题
“保证金不足”错误
- 检查可用抵押品:
GET /v1/client/holding - 减少订单规模或增加抵押品
“价格超出范围”错误
- 订单价格必须在标记价格的
price_range范围内 - 对于 BUY:价格 ≤ mark_price × (1 + price_range)
- 对于 SELL:价格 ≥ mark_price × (1 - price_range)
“无效的最小价格变动单位”错误
- 价格必须是
quote_tick的倍数 - 数量必须是
base_tick的倍数
订单立即被拒绝
- 检查
GET /v1/public/info/{symbol}以获取订单规则 - 验证 min_notional、价格范围和规模限制
相关技能
- orderly-api-authentication - 如何签署请求
- orderly-positions-tpsl - 管理仓位和 TP/SL
- orderly-websocket-streaming - 实时订单更新
- orderly-sdk-react-hooks - SDK 完整参考
评论
支持 Markdown