okx量化 - python操作现货交易 - 开源代码

本文介绍一下用python代码结合okx如何获取行情,并且操作现货交易,代码开源,点个赞哦~

上篇文章写了怎么操作合约,okx量化 - python操作合约交易示例2-开源代码-CSDN博客,今天来说怎么操作现货。

源代码:https://github.com/JizhiXiang/Quant-Strategy/blob/main/okx_spot_inst_demo.py

1.获取现货行情

import time
import okx.Trade as Trade
import okx.Account as Account
import okx.MarketData as MarketData

# okx现货买卖操作
# OKX spot trading operation

# 注意主账号和子账号是分开的,模拟交易也是分开的
#Note that the main account and sub account are separate, and the simulated trading is also separate
# API 初始化 #API initialization
apikey = "YOUR_API_KEY"
secretkey = "YOUR_SECRET_KEY"
passphrase = "YOUR_PASSPHRASE"
# from my_key import *  # 可忽略此行 #This line can be ignored

# 获取现货行情
# Obtain contract market information
# 实盘:0 , 模拟盘:1
#Real: 0, simulation: 1
flag = '1'  
marketDataAPI =  MarketData.MarketAPI(flag=flag)
result = marketDataAPI.get_ticker(instId='BTC-USDT')
print('获取现货行情(BTC-USDT):')
print(result)
print()

请求参数

参数名 类型 是否必须 描述
instId String 产品ID,如 BTC-USD-SWAP

返回参数

参数名 类型 描述
instType String 产品类型
instId String 产品ID
last String 最新成交价
lastSz String 最新成交的数量,0 代表没有成交量
askPx String 卖一价
askSz String 卖一价对应的数量
bidPx String 买一价
bidSz String 买一价对应的数量
open24h String 24小时开盘价
high24h String 24小时最高价
low24h String 24小时最低价
volCcy24h String 24小时成交量,以为单位
如果是衍生品合约,数值为交易货币的数量。
如果是币币/币币杠杆,数值为计价货币的数量。
vol24h String 24小时成交量,以为单位
如果是衍生品合约,数值为合约的张数。
如果是币币/币币杠杆,数值为交易货币的数量。
sodUtc0 String UTC+0 时开盘价
sodUtc8 String UTC+8 时开盘价
ts String ticker数据产生时间,Unix时间戳的毫秒数格式,如 1597026383085

2.获取指数K线数据


# 获取指数K线数据
# Obtain index K-line data
# 注意:不要使用"获取指数历史K线数据"接口,否则获取不到当前数据
#Attention: Do not use the "Get Index Historical K-Line Data" interface, otherwise the current data cannot be obtained
result = marketDataAPI.get_index_candlesticks(
    instId="BTC-USDT",
    limit=10
)
# ['ts', 'o', 'h', 'l', 'c', 'confirm']
print('获取指数K线数据(BTC-USDT):')
print(result)
print()

请求参数

参数名 类型 是否必须 描述
instId String 现货指数,如 BTC-USD
after String 请求此时间戳之前(更旧的数据)的分页内容,传的值为对应接口的ts
before String 请求此时间戳之后(更新的数据)的分页内容,传的值为对应接口的ts, 单独使用时,会返回最新的数据。
bar String 时间粒度,默认值1m
如 [1m/3m/5m/15m/30m/1H/2H/4H]
香港时间开盘价k线:[6H/12H/1D/1W/1M/3M]
UTC时间开盘价k线:[6Hutc/12Hutc/1Dutc/1Wutc/1Mutc/3Mutc]
limit String 分页返回的结果集数量,最大为100,不填默认返回100

返回参数

参数名 类型 描述
ts String 开始时间,Unix时间戳的毫秒数格式,如 1597026383085
o String 开盘价格
h String 最高价格
l String 最低价格
c String 收盘价格
confirm String K线状态
0 代表 K 线未完结,1 代表 K 线已完结。

 返回的第一条K线数据可能不是完整周期k线,返回值数组顺序分别为是:[ts,o,h,l,c,confirm]

3.查看账户余额


# 查看账户余额
# View account balance
accountAPI = Account.AccountAPI(apikey, secretkey, passphrase, False, flag)
result = accountAPI.get_account_balance()
print('查看账户余额:')
print(result)
print()

请求参数

参数名 类型 是否必须 描述
ccy String 币种,如 BTC
支持多币种查询(不超过20个),币种之间半角逗号分隔

返回参数

参数名 类型 描述
uTime String 账户信息的更新时间,Unix时间戳的毫秒数格式,如 1597026383085
totalEq String 美金层面权益
isoEq String 美金层面逐仓仓位权益
适用于现货和合约模式/跨币种保证金模式/组合保证金模式
adjEq String 美金层面有效保证金
适用于现货模式/跨币种保证金模式/组合保证金模式
ordFroz String 美金层面全仓挂单占用保证金
仅适用于现货模式/跨币种保证金模式/组合保证金模式
imr String 美金层面占用保证金
适用于现货模式/跨币种保证金模式/组合保证金模式
mmr String 美金层面维持保证金
适用于现货模式/跨币种保证金模式/组合保证金模式
borrowFroz String 账户美金层面潜在借币占用保证金
仅适用于现货模式/跨币种保证金模式/组合保证金模式。在其他账户模式下为""。
mgnRatio String 美金层面保证金率
适用于现货模式/跨币种保证金模式/组合保证金模式
notionalUsd String 以美金价值为单位的持仓数量,即仓位美金价值
适用于现货模式/跨币种保证金模式/组合保证金模式
notionalUsdForBorrow String 借币金额(美元价值)
适用于现货模式/跨币种保证金模式/组合保证金模式
notionalUsdForSwap String 永续合约持仓美元价值
适用于跨币种保证金模式/组合保证金模式
notionalUsdForFutures String 交割合约持仓美元价值
适用于跨币种保证金模式/组合保证金模式
notionalUsdForOption String 期权持仓美元价值
适用于现货模式/跨币种保证金模式/组合保证金模式
upl String 账户层面全仓未实现盈亏(美元单位)
适用于跨币种保证金模式/组合保证金模式
details Array of objects 各币种资产详细信息
> ccy String 币种
> eq String 币种总权益
> cashBal String 币种余额
> uTime String 币种余额信息的更新时间,Unix时间戳的毫秒数格式,如 1597026383085
> isoEq String 币种逐仓仓位权益
适用于现货和合约模式/跨币种保证金模式/组合保证金模式
> availEq String 可用保证金
适用于现货和合约模式/跨币种保证金模式/组合保证金模式
> disEq String 美金层面币种折算权益
适用于现货模式(开通了借币功能)/跨币种保证金模式/组合保证金模式
> fixedBal String 抄底宝、逃顶宝功能的币种冻结金额
> availBal String 可用余额
> frozenBal String 币种占用金额
> ordFrozen String 挂单冻结数量
适用于现货模式/现货和合约模式/跨币种保证金模式
> liab String 币种负债额
值为正数,如 "21625.64"
适用于现货模式/跨币种保证金模式/组合保证金模式
> upl String 未实现盈亏
适用于现货和合约模式/跨币种保证金模式/组合保证金模式
> uplLiab String 由于仓位未实现亏损导致的负债
适用于跨币种保证金模式/组合保证金模式
> crossLiab String 币种全仓负债额
适用于现货模式/跨币种保证金模式/组合保证金模式
> isoLiab String 币种逐仓负债额
适用于跨币种保证金模式/组合保证金模式
> rewardBal String 体验金余额
> mgnRatio String 币种全仓保证金率,衡量账户内某项资产风险的指标
适用于现货和合约模式且有全仓仓位时
> imr String 币种维度全仓占用保证金
适用于现货和合约模式且有全仓仓位时
> mmr String 币种维度全仓维持保证金
适用于现货和合约模式且有全仓仓位时
> interest String 计息,应扣未扣利息
值为正数,如 9.01
适用于现货模式/跨币种保证金模式/组合保证金模式
> twap String 当前负债币种触发系统自动换币的风险
0、1、2、3、4、5其中之一,数字越大代表您的负债币种触发自动换币概率越高
适用于现货模式/跨币种保证金模式/组合保证金模式
> maxLoan String 币种最大可借
适用于现货模式/跨币种保证金模式/组合保证金模式 的全仓
> eqUsd String 币种权益美金价值
> borrowFroz String 币种美金层面潜在借币占用保证金
仅适用于现货模式/跨币种保证金模式/组合保证金模式。在其他账户模式下为""。
> notionalLever String 币种杠杆倍数
适用于现货和合约模式
> stgyEq String 策略权益
> isoUpl String 逐仓未实现盈亏
适用于现货和合约模式/跨币种保证金模式/组合保证金模式
> spotInUseAmt String 现货对冲占用数量
适用于组合保证金模式
> clSpotInUseAmt String 用户自定义现货占用数量
适用于组合保证金模式
> maxSpotInUse String 系统计算得到的最大可能现货占用数量
适用于组合保证金模式
> spotIsoBal String 现货逐仓余额
仅适用于现货带单/跟单
适用于现货模式/现货和合约模式
> smtSyncEq String 合约智能跟单权益
默认为0,仅适用于跟单人。
> spotCopyTradingEq String 现货智能跟单权益
默认为0,仅适用于跟单人。
> spotBal String 现货余额 ,单位为 币种,比如 BTC。详情
> openAvgPx String 现货开仓成本价 单位 USD。 详情
> accAvgPx String 现货累计成本价 单位 USD。 详情
> spotUpl String 现货未实现收益,单位 USD。 详情
> spotUplRatio String 现货未实现收益率。详情
> totalPnl String 现货累计收益,单位 USD。 详情
> totalPnlRatio String 现货累计收益率。详情
> totalPnlRatio String 现货累计收益率。详情
> collateralEnabled Boolean true:质押币
false:非质押币
适用于跨币种保证金模式
详情

4.买入现货

注意:买卖现货时单位一定要看清楚了


# 买入现货  buy spot
tradeAPI = Trade.TradeAPI(apikey, secretkey, passphrase, False, flag)
result = tradeAPI.place_order(
    instId='BTC-USDT',
    tdMode='cash',
    side='buy',
    ordType='market',
    sz="9000"   # 单位是USDT #The unit is USDT
)
print('买入BTC:')
print(result)
print()

请求参数

参数名 类型 是否必须 描述
instId String 产品ID,如 BTC-USDT
tdMode String 交易模式
保证金模式:isolated:逐仓 ;cross:全仓
非保证金模式:cash:非保证金
spot_isolated:现货逐仓(仅适用于现货带单) ,现货带单时,tdMode 的值需要指定为spot_isolated
ccy String 保证金币种,适用于逐仓杠杆现货和合约模式下的全仓杠杆订单
clOrdId String 客户自定义订单ID
字母(区分大小写)与数字的组合,可以是纯字母、纯数字且长度要在1-32位之间。
tag String 订单标签
字母(区分大小写)与数字的组合,可以是纯字母、纯数字,且长度在1-16位之间。
side String 订单方向
buy:买, sell:卖
posSide String 可选 持仓方向
在开平仓模式下必填,且仅可选择 long 或 short。 仅适用交割、永续。
ordType String 订单类型
market:市价单
limit:限价单
post_only:只做maker单
fok:全部成交或立即取消
ioc:立即成交并取消剩余
optimal_limit_ioc:市价委托立即成交并取消剩余(仅适用交割、永续)
mmp:做市商保护(仅适用于组合保证金账户模式下的期权订单)
mmp_and_post_only:做市商保护且只做maker单(仅适用于组合保证金账户模式下的期权订单)
sz String 委托数量
px String 可选 委托价格,仅适用于limitpost_onlyfokiocmmpmmp_and_post_only类型的订单
期权下单时,px/pxUsd/pxVol 只能填一个
pxUsd String 可选 以USD价格进行期权下单
仅适用于期权
期权下单时 px/pxUsd/pxVol 必填一个,且只能填一个
pxVol String 可选 以隐含波动率进行期权下单,例如 1 代表 100%
仅适用于期权
期权下单时 px/pxUsd/pxVol 必填一个,且只能填一个
reduceOnly Boolean 是否只减仓,true 或 false,默认false
仅适用于币币杠杆,以及买卖模式下的交割/永续
仅适用于现货和合约模式跨币种保证金模式
tgtCcy String 市价单委托数量sz的单位,仅适用于币币市价订单
base_ccy: 交易货币 ;quote_ccy:计价货币
买单默认quote_ccy, 卖单默认base_ccy
banAmend Boolean 是否禁止币币市价改单,true 或 false,默认false
为true时,余额不足时,系统不会改单,下单会失败,仅适用于币币市价单
quickMgnType String 一键借币类型,仅适用于杠杆逐仓的一键借币模式:
manual:手动,auto_borrow:自动借币,auto_repay:自动还币
默认是manual:手动(已弃用)
stpId String 自成交保护ID。来自同一个母账户配着同一个ID的订单不能自成交
用户自定义1<=x<=999999999的整数(已弃用)
stpMode String 自成交保护模式
默认为 cancel maker
cancel_maker,cancel_takercancel_both
Cancel both不支持FOK
attachAlgoOrds Array of object 下单附带止盈止损信息
> attachAlgoClOrdId String 下单附带止盈止损时,客户自定义的策略订单ID
字母(区分大小写)与数字的组合,可以是纯字母、纯数字且长度要在1-32位之间。
订单完全成交,下止盈止损委托单时,该值会传给algoClOrdId
> tpTriggerPx String 可选 止盈触发价
对于条件止盈单,如果填写此参数,必须填写 止盈委托价
> tpOrdPx String 可选 止盈委托价
对于条件止盈单,如果填写此参数,必须填写 止盈触发价
对于限价止盈单,需填写此参数,不需要填写止盈触发价
委托价格为-1时,执行市价止盈
> tpOrdKind String 止盈订单类型
condition: 条件单
limit: 限价单
默认为condition
> slTriggerPx String 可选 止损触发价,如果填写此参数,必须填写 止损委托价
> slOrdPx String 可选 止损委托价,如果填写此参数,必须填写 止损触发价
委托价格为-1时,执行市价止损
> tpTriggerPxType String 止盈触发价类型
last:最新价格
index:指数价格
mark:标记价格
默认为last
> slTriggerPxType String 止损触发价类型
last:最新价格
index:指数价格
mark:标记价格
默认为last
> sz String 可选 数量。仅适用于“多笔止盈”的止盈订单,且对于“多笔止盈”的止盈订单必填
> amendPxOnTriggerType String 是否启用开仓价止损,仅适用于分批止盈的止损订单,第一笔止盈触发时,止损触发价格是否移动到开仓均价止损
0:不开启,默认值
1:开启,且止损触发价不能为空

返回参数

参数名 类型 描述
code String 结果代码,0表示成功
msg String 错误信息,代码为0时,该字段为空
data Array of objects 包含结果的对象数组
> ordId String 订单ID
> clOrdId String 客户自定义订单ID
> tag String 订单标签
> ts String 系统完成订单请求处理的时间戳,Unix时间戳的毫秒数格式,如 1597026383085
> sCode String 事件执行结果的code,0代表成功
> sMsg String 事件执行失败或成功时的msg
inTime String REST网关接收请求时的时间戳,Unix时间戳的微秒数格式,如 1597026383085123
返回的时间是请求验证后的时间。
outTime String REST网关发送响应时的时间戳,Unix时间戳的微秒数格式,如 1597026383085123

 tdMode
交易模式,下单时需要指定
现货模式:
- 币币和期权买方:cash
现货和合约模式:
- 逐仓杠杆:isolated
- 全仓杠杆:cross
- 币币:cash
- 全仓交割/永续/期权:cross
- 逐仓交割/永续/期权:isolated
跨币种保证金模式:
- 逐仓杠杆:isolated
- 全仓币币:cross
- 全仓交割/永续/期权:cross
- 逐仓交割/永续/期权:isolated
组合保证金模式:
- 逐仓杠杆:isolated
- 全仓币币:cross
- 全仓交割/永续/期权:cross
- 逐仓交割/永续/期权:isolated

 clOrdId
clOrdId是用户自定义的唯一ID用来识别订单。如果在请求参数中传入了,那它一定会在返回参数内,并且可以用于查询订单,撤销订单,修改订单等接口。 clOrdId不能与当前所有的挂单的clOrdId重复

 posSide
持仓方向,买卖模式下此参数非必填,如果填写仅可以选择net;在开平仓模式下必填,且仅可选择 long 或 short。
开平仓模式下,side和posSide需要进行组合
开多:买入开多(side 填写 buy; posSide 填写 long )
开空:卖出开空(side 填写 sell; posSide 填写 short )
平多:卖出平多(side 填写 sell;posSide 填写 long )
平空:买入平空(side 填写 buy; posSide 填写 short )
组合保证金模式:交割和永续仅支持买卖模式

 ordType
订单类型,创建新订单时必须指定,您指定的订单类型将影响需要哪些订单参数和撮合系统如何执行您的订单,以下是有效的ordType:
普通委托:
limit:限价单,要求指定sz 和 px
market:市价单,币币和币币杠杆,是市价委托吃单;交割合约和永续合约,是自动以最高买/最低卖价格委托,遵循限价机制;期权合约不支持市价委托;由于市价委托无法确定成交价格,为确保有足够的资产买入设定数量的交易币种,会多冻结5%的计价币资产
高级委托:
post_only:限价委托,在下单那一刻只做maker,如果该笔订单的任何部分会吃掉当前挂单深度,则该订单将被全部撤销。
fok:限价委托,全部成交或立即取消,如果无法全部成交该笔订单,则该订单将被全部撤销。
ioc:限价委托,立即成交并取消剩余,立即按照委托价格撮合成交,并取消该订单剩余未完成数量,不会在深度列表上展示委托数量。
optimal_limit_ioc:市价委托,立即成交并取消剩余,仅适用于交割合约和永续合约。

 sz
交易数量,表示要购买或者出售的数量。
当币币/币币杠杆以限价买入和卖出时,指交易货币数量。
当币币杠杆以市价买入时,指计价货币的数量。
当币币杠杆以市价卖出时,指交易货币的数量。
对于币币市价单,单位由 tgtCcy 决定
当交割、永续、期权买入和卖出时,指合约张数。

 reduceOnly
只减仓,下单时,此参数设置为 true 时,表示此笔订单具有减仓属性,只会减少持仓数量,不会增加新的持仓仓位
对于同一杠杆产品,所有反方向挂单的币数加上当前只减仓下单数量,不能超过仓位资产;负债还完后,如果还有剩余的委托数量,不会反向开仓,而是会进行币币交易。
对于同一交割/永续产品,当前只减仓下单张数,加上价格时间优先于当前只减仓下单的只减仓挂单张数总和,不能超过持仓数量
仅适用于`现货和合约模式`和`跨币种保证金模式`
仅适用于`币币杠杆`,以及买卖模式下的`交割/永续`
注意:交割和永续合约在开平仓模式下,所有的平仓单都有只减仓逻辑,不受该字段传值的影响。

 tgtCcy
市价单委托数量`sz`的单位:仅适用于币币市价下单交易。
交易货币:base_ccy
计价货币:quote_ccy
您在使用交易货币买入或者计价货币卖出时,请知晓:
1.如果您输入的数量大于当前可买或者可卖的数量,系统将按照您的最大可买或者可卖数量帮您完成交易,如果您希望按照指定数量成交,那您可以尝试使用限价单,等待市场价格波动到锁定的余额可以买入或卖出您指定的数量。
2.如果您输入的数量不大于当前可买或者可卖的数量,那当市场价格波动过大时,锁定的余额可能没办法买入您输入的交易货币数量或卖出您输入的计价货币数量,为保证您的交易体验,我们基于【能买多少买多少】或者【能卖多少卖多少】的原则,更改下单的数量帮您完成交易。此外,我们将尽量多锁定一点余额来规避更改下单数量的情况。
2.1 交易币买入例子:
以市价下单 买入 10个LTC为例,用户可买为11个,此时 10 < 11,挂单成功。当LTC-USDT的市价为200,用户被锁定余额为3,000 USDT,200*10 < 3,000,最终成交10个LTC; 若市场波动过大,LTC-USDT的市价为400,此时400*10 > 3,000,当用户被锁定的余额不够买入下单指定的交易货币数量时,系統使用用户被锁定的最大余额3,000 USDT下单买入,最终成交 3,000/400 = 7.5个 LTC。
2.2 计价币卖出例子:
以市价下单 卖出 1,000USDT为例,用户可卖为1,200USDT,1,000 < 1,200,挂单成功。LTC-USDT的市价为200,用户被锁定的余额为6个LTC,最终成交5个LTC; 若市场波动过大,LTC-USDT的市价为100,100*6 < 1,000,当用户被锁定的余额不够卖出下单指定的计价货币数量时,系統使用用户被锁定的最大余额6个LTC下单,最终成交 6 * 100 = 600 USDT。

 px
期权下单时,委托价格需为 tickSz 的整数倍。
当不为整数倍时,取值规则以tickSz取 0.0005 为例:
当委托价格对0.0005的余数大于0.00025或者委托价格小于0.0005时,向上取;
当委托价格对0.0005的余数小于等于0.00025,且委托价格大于0.0005时,向下取。

 对于下单附带止盈止损:
1. 只有当该订单完全成交时,才会生成止盈止损策略订单,否则不会生成止盈止损策略订单。

2. tgtCcy 为 base_ccy 时的市价买单和 tgtCcy 为 quote_ccy 时的市价卖单,均不支持附带止盈止损
3. tpOrdKind 为 limit,且只有一笔单边止盈时,attachAlgoClOrdId 可以作为 clOrdId 在获取订单信息接口查询。
4. 对于“分批止盈”,包含限价止盈和触发止盈:
* 分批止盈的每笔止盈止损订单仅支持单向止盈止损,slTriggerPx&slOrdPx 与 tpTriggerPx&tpOrdPx 只能填写一组,否则 报错 51076
* 同一笔订单上附带分批止盈的止盈触发价类型 (tpTriggerPxType) 必须保持一致,否则报错 51080
* 同一笔订单上附带分批止盈的止盈触发价 (tpTriggerPx) 不能相等,否则报错 51081
* 在附带分批止盈时,止盈订单的数量不能为空,否则报错 51089
* 同一笔订单上分批止盈的止盈数量之和,需要等于订单的委托数量,否则报错 51083
* 同一笔订单上分批止盈的止盈委托不能超过 10 笔,否则报错 51079
* 币币/杠杆不支持开启'开仓价止损',否则报错 51077
* 同一笔订单上附带分批止盈的止损委托单不能超过 1 笔,否则报错 51084
* 附带止盈止损开启'开仓价止损'时 (amendPxOnTriggerType 设置为 1),该笔订单上的止盈委托单必须大于等于 2 笔,否则报错 51085
* 同一笔订单上附带分批止盈的止盈类型必须保持一致,否则报错 51091
* 同一笔订单上附带分批止盈的止盈委托价不能相等,否则报错 51092
* 同一笔订单上附带分批止盈,其中限价止盈的止盈委托价 (tpOrdPx) 不能为 -1 (市价),否则报错 51093
* 币币、杠杆和期权交易不支持限价止盈,否则报错 51094

 强制自成交保护
交易系统会以母账户维度实施强制自成交保护,同一母账户下所有账户,包括母账户本身和所有子账户,都无法进行自成交。订单的默认STP模式为`Cancel Maker`,用户亦可以通过下单接口的stpMode参数指定订单的STP模式。
强制自成交保护不会导致延迟。
有三种STP模式。STP模式始终基于taker订单中的配置。
1.Cancel Maker:这是默认的STP模式,系统撤Maker订单以防止自成交。然后,taker订单会基于深度继续和下一个订单成交。
2.Cancel Taker:撤Taker订单以防止自成交。如果用户的Maker订单不是深度里第一个订单,Taker订单会被部分成交,然后撤单。FOK订单会确保完全成交和自成交保护。
3.Cancel Both:撤Taker和Maker订单以防止自成交。如果用户的Maker订单不是深度里第一个订单,Taker订单会被部分成交,然后Taker订单的剩余数量和第一个自我Maker订单被取消。此模式不支持FOK订单。

5.卖出现货


# 卖出现货 sell spot
time.sleep(60)
result = tradeAPI.place_order(
    instId='BTC-USDT',
    tdMode='cash',
    side='sell',
    ordType='market',
    sz="0.1"   # 单位是BTC #The unit is BTC
)
print('卖出BTC:')
print(result)
print()

接口同上4,只是使用方法不同 

6.买卖记录查询