如何使用 Jupyter Notebook 进行衍生品交易?
欧易提供三种衍生品交易类型:交割、永续和期权。本教程将以永续交易为例,介绍如何使用 python-okx 库进行交易。
常见问题
1. 如何获取市场数据?
您可以通过以下代码获取市场数据,并可将 instType
替换为 "FUTURES"
或 "OPTION"
以获取相应信息。
import okx.MarketData as MarketData
flag = "1" # live trading: 0, demo trading: 1
marketDataAPI = MarketData.MarketAPI(flag = flag)
result = marketDataAPI.get_tickers(instType = "SWAP")
print(result)
2. 如何获取可交易的交易对?
以同样的方式,选择 instType
获取对应类型的交易对信息。
import okx.PublicData as PublicData
if __name__ == '__main__':
flag = "1" # live trading: 0, demo trading: 1
publicDataAPI = PublicData.PublicAPI(flag = flag)
result = publicDataAPI.get_instruments(instType = "SWAP")
print(result)
2.1 使用合约ctVal
和ctMult 计算衍生品合约的名义价值
要计算衍生合约(即交割、永续和期权)的名义价值,您需要从工具参数中获得ctVal
(合约价值)和ctMult
(合约乘数)。
衍生品合约的名义价值可以计算为ctVal
*ctMult
(单位:ctValCcy
);
例如,从下面显示的合约参数,我们可以计算 LTCUSD 永续合约的名义价值为:ctVal
*ctMult
(单位:ctValccy
)= 10*1 USD = 10 USD
"instType":"SWAP",
"instId":"LTC-USD-SWAP",
"instFamily":"LTC-USD",
"uly":"LTC-USD",
"settleCcy":"LTC",
"ctVal":"10",
"ctMult":"1",
"ctValCcy":"USD"
3. 如何查询账户余额?
import okx.Account as Account
flag = "1" # live trading:0, demo trading: 1
accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)
result = accountAPI.get_account_balance()
print(result)
4. 什么是账户模式和保证金 / 交易模式?
欧易账户一共有四种模式:
现货模式
现货和合约模式
跨币种保证金模式
组合保证金模式
其中,除了现货模式,其他三个保证金模式都可用于衍生品交易。您可以参考《统一交易账户介绍》了解不同模式的区别及切换方式。
4.1 从获取账户配置中的acctLv
参数获取当前账户配置
确保您处于正确的账户模式以交易衍生品。
import okx.Account as Account
flag = "1" # live trading: 0, demo trading: 1
accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)
result = accountAPI.get_account_config()
print(result)
if result['code'] == "0":
acctLv = result["data"][0]["acctLv"]
if acctLv == "1":
print("Simple mode")
elif acctLv == "2":
print("Single-currency margin mode")
elif acctLv == "3":
print("Multi-currency margin mode")
elif acctLv == "4":
print("Portfolio margin mode")
5. 如何设置杠杆?
杠杆可放大收益或亏损,平台最高支持 125 倍杠杆。您可以阅读 仓位档位详情,了解更多详情。

这是上面显示的词汇表的含义:
最大杠杆倍数:指交易者可通过借入资金放大投资回报的最高倍数。
初始保证金率(IMR):开仓时需要的最低保证金比例。
维持保证金率(MMR):维持持仓所需的最低保证金比例。当账户权益低于此比例时将触发强制平仓。
例如,当您想交易 3000 ETHUSDT 永续合约时,您最大可用杠杆是 75 倍。IMR = 1/75 = 1.3%,您必须保持 ≥ 0.8% 保证金比例以避免强制平仓。通过欧易开放 API 设置杠杆共有9种不同场景,具体请参考这里。关于永续合约的杠杆设置,主要分为以下三种情况:
全仓交易模式下,针对永续合约设置杠杆(合约层级)
逐仓交易模式且采用买卖持仓模式下,针对永续合约设置杠杆(合约层级)
逐仓交易模式且采用多空持仓模式下,针对永续合约及持仓方向分别设置杠杆(合约及持仓方向层级)
以下示例将展示如何针对单个永续合约品种及其持仓方向设置杠杆(与针对某标的物下所有永续合约统一设置杠杆的操作进行对比)。
# Set leverage to be 5x for all cross-margin BTC-USDT SWAP positions,
# by providing the SWAP instId
result = accountAPI.set_leverage(
instId = "BTC-USDT-SWAP",
lever = "5",
mgnMode = "cross"
)
print(result)
# In buy/sell position mode, set leverage to be 5x
# for all isolated-margin BTC-USDT SWAP positions
# by providing the SWAP instId
result = accountAPI.set_leverage(
instId = "BTC-USDT-SWAP",
lever = "5",
mgnMode = "isolated"
)
print(result)
# In long/short position mode, set leverage to be 5x
# for an isolated-margin BTC-USDT-SWAP long position;
# This does NOT affect the leverage of the BTC-USDT-SWAP
# short positions
result = accountAPI.set_leverage(
instId = "BTC-USDT-SWAP",
lever = "5",
posSide = "long",
mgnMode = "isolated"
)
print(result)
请注意,posSide 请求参数仅在保证金模式为逐仓且持仓模式为多空(Long/Short)时适用于交割合约和永续合约的下单操作
(具体应用请参见设置杠杆场景中的场景6和9)。
6. 如何在不同的持仓模式下下单?
在进行交割和永续合约交易时,有两种持仓模式:
1. 多空(Long/Short)模式
2. 买卖(Buy/Sell)模式
持仓模式:多头/空头和买入/卖出(净额)。
您可以通过 API 切换持仓模式:
result = accountAPI.set_position_mode(
posMode = "long_short_mode"
)
print(result)
或者,您可以通过 Web 端上的设置来调整:

在买/卖(净持仓模式)下,某合约的持仓为买入和卖出交易的净数量:
通过Place order下单时,
posSide
参数不是必填项。若填写
posSide
,唯一有效值为net
。
在多空(独立持仓模式)下,同一合约的多头和空头持仓相互独立,需分别平仓:
通过
Place order
下单时,posSide
参数为必填项。可选值:
long
(多方向)或short
(空方向)。
以下为不同下单场景下的 side
(交易方向)和 posSide
(持仓方向)参数:
买入并开/增加多头持仓:
side = buy
,posSide = long
卖出并开/增加空头持仓:
side = sell
,posSide = short
卖出并平/减少多头持仓:
side = sell
,posSide = long
买入并平/减少空头持仓:
side = buy
,posSide = short
6.1 限价委托单下单
以下示例展示如何以 19,000 USDT 价格买入 100 张 BTC-USDT 永续合约:
# limit order
result = tradeAPI.place_order(
instId = "BTC-USDT-SWAP",
tdMode = "isolated",
side = "buy",
posSide = "net",
ordType = "limit",
px = "19000",
sz = "100"
)
print(result)
if result["code"] == "0":
print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])
6.2 市价委托下单
以下示例展示如何以市价买入100 张 BTC-USDT 永续合约:
# market order
result = tradeAPI.place_order(
instId = "BTC-USDT-SWAP",
tdMode = "isolated",
side = "buy",
posSide = "net",
ordType = "market",
sz = "100"
)
print(result)
if result["code"] == "0":
print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])
7. 如何查询特定订单的详情或状态?(可参考这里)
除了ordId
,您还可以使用 clOrdId
来查询订单详情。
result = tradeAPI.get_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)
8. 如何取消订单?
除了ordId
,您可以使用clOrdId
。
You also use __clOrdId__ in place of __ordId__
result = tradeAPI.cancel_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)
9. 如何修改订单?
同样,您可以使用 clOrdId
替代 ordId
。以下示例展示了修改订单的 newSz
(新委托数量)。
result = tradeAPI.amend_order(
instId = "BTC-USDT-SWAP",
ordId = "505073046126960640",
newSz = "80"
)
print(result)
10. 如何获取当前委托列表?
result = tradeAPI.get_order_list()
print(result)
11. 如何查询历史订单?(过去 7 天的历史订单)和((过去 3 个月的历史订单)
# Get order history (last 7 days)
result = tradeAPI.get_orders_history(
instType = "SWAP"
)
print(result)
# Get order history (last 3 months)
result = tradeAPI.get_orders_history_archive(
instType = "SWAP"
)
print(result)
12. 如何查询交易明细通过获取交易详情(过去3天)和 获取交易详情(过去3个月)?
# Get transaction details (last 3 days)
result = tradeAPI.get_fills()
print(result)
# Get transaction details (last 3 months)
result = tradeAPI.get_fills_history(
instType = "SWAP"
)
print(result)
13. 如何查询持仓信息?
当您的账户处于单向持仓模式时,将显示每份合约的单向持仓;当您的账户处于双向持仓模式时,每份合约的做多或做空持仓将分别显示。
result = accountAPI.get_positions()
print(result)
单向持仓模式 (net mode):每个合约的净持仓量将被显示。
双向持仓模式 (long/short mode):做多和做空持仓将分别显示。
例如,您可以通过返回参数upl
追踪未实现盈亏(Unrealized P&L)。
备注事项:
更多示例,请下载完整的 Jupyter Notebook 如果您对我们的 API 有任何疑问,欢迎加入我们的 API 社群交流讨论。