okxv5 1.8.9__tar.gz → 1.8.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. {okxv5-1.8.9 → okxv5-1.8.11}/PKG-INFO +5 -2
  2. {okxv5-1.8.9 → okxv5-1.8.11}/README.md +22 -1
  3. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/client.py +29 -16
  4. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/utils.py +7 -1
  5. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5.egg-info/PKG-INFO +5 -2
  6. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5.egg-info/requires.txt +1 -0
  7. {okxv5-1.8.9 → okxv5-1.8.11}/setup.py +5 -4
  8. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Account_api.py +0 -0
  9. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Affiliate_api.py +0 -0
  10. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Broker_api.py +0 -0
  11. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Convert_api.py +0 -0
  12. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Copytrading_api.py +0 -0
  13. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/FDBroker_api.py +0 -0
  14. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Finance_api.py +0 -0
  15. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Funding_api.py +0 -0
  16. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Market_api.py +0 -0
  17. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Public_api.py +0 -0
  18. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Recurring_api.py +0 -0
  19. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Rfq_api.py +0 -0
  20. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Singal_api.py +0 -0
  21. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/SprdApi_api.py +0 -0
  22. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/Trade_api.py +0 -0
  23. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/TradingBot_api.py +0 -0
  24. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/TradingData_api.py +0 -0
  25. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/__init__.py +0 -0
  26. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/consts.py +0 -0
  27. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/exceptions.py +0 -0
  28. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/hunyuan_client.py +0 -0
  29. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/status_api.py +0 -0
  30. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5/subAccount_api.py +0 -0
  31. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5.egg-info/SOURCES.txt +0 -0
  32. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5.egg-info/dependency_links.txt +0 -0
  33. {okxv5-1.8.9 → okxv5-1.8.11}/okxv5.egg-info/top_level.txt +0 -0
  34. {okxv5-1.8.9 → okxv5-1.8.11}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: okxv5
3
- Version: 1.8.9
4
- Summary: 自己随便上传使用的,精力有限没有整理调用方法,不知道怎么调用的可以查看源码发给AI
3
+ Version: 1.8.11
4
+ Summary: 自己个人上传使用,精力有限没有整理调用方法,不知道怎么调用的可以查看源码发给AI,有疑问联系QQ:935233452
5
5
  Home-page:
6
6
  Author:
7
7
  Author-email:
@@ -10,6 +10,7 @@ Keywords: okxv5
10
10
  Requires-Dist: numpy>=2.2.6
11
11
  Requires-Dist: pandas>=2.3.3
12
12
  Requires-Dist: requests>=2.32.5
13
+ Requires-Dist: PyYAML>=6.0.3
13
14
 
14
15
  ├── client.py # 核心 API 客户端,处理请求、响应、认证
15
16
  ├── consts.py # 项目常量定义,如 API 地址、错误码等
@@ -54,3 +55,5 @@ print("客户端已成功实例化,发送认证请求。")
54
55
 
55
56
  其他调用方法一致,调用相应的API文件里想要的相应的功能
56
57
 
58
+ 此处实盘为1,模拟盘为0,实盘为1,与官方文档相反,具体用法参考官方文档https://www.okx.com/docs-v5/zh/?language=python#overview
59
+
@@ -21,4 +21,25 @@
21
21
  ├── subAccount_api.py # 子账户管理相关 API
22
22
  ├── Trade_api.py # 核心交易 API (下单、撤单、查订单等)
23
23
  ├── TradingBot_api.py # 交易机器人相关 API/功能
24
- └── TradingData_api.py # 交易历史数据相关 API
24
+ └── TradingData_api.py # 交易历史数据相关 API
25
+
26
+
27
+ 调用客户端示例:
28
+
29
+ 完整导入:
30
+ from okxv5.client import Client
31
+
32
+ # 替换为你的真实API凭证
33
+ api_key = "你的API_KEY"
34
+ api_secret_key = "你的API_SECRET_KEY"
35
+ passphrase = "你的PASSPHRASE" # API的交易密码
36
+
37
+ # 实例化客户端,建议使用服务器时间
38
+ client = Client(api_key, api_secret_key, passphrase, use_server_time=True)
39
+
40
+ print("客户端已成功实例化,发送认证请求。")
41
+
42
+
43
+ 其他调用方法一致,调用相应的API文件里想要的相应的功能
44
+
45
+ 此处实盘为1,模拟盘为0,与官方文档相反
@@ -1,5 +1,7 @@
1
1
  import requests # 导入requests库,用于发送HTTP请求
2
2
  import json # 导入json库,用于处理JSON数据
3
+ import datetime # 导入datetime库,用于时间戳处理
4
+ import time # 导入time库,用于获取本地时间戳
3
5
  from . import consts as c, utils, exceptions # 从当前包导入consts模块(别名为c)、utils模块和exceptions模块
4
6
 
5
7
  class Client(object):
@@ -7,14 +9,14 @@ class Client(object):
7
9
  API客户端类,用于与API进行交互
8
10
  """
9
11
 
10
- def __init__(self, api_key, api_secret_key, passphrase, use_server_time=False, flag='1'):
12
+ def __init__(self, api_key, api_secret_key, passphrase, use_server_time=False, flag='0'): # 1为实盘,0为模拟盘
11
13
  """
12
14
  构造函数,初始化客户端
13
15
  :param api_key: API密钥
14
16
  :param api_secret_key: API私钥
15
17
  :param passphrase: 交易密码
16
18
  :param use_server_time: 是否使用服务器时间,默认为False
17
- :param flag: 请求标记,默认为'1'
19
+ :param flag: 请求标记,默认为'0'
18
20
  """
19
21
  self.API_KEY = api_key # 设置API密钥
20
22
  self.API_SECRET_KEY = api_secret_key # 设置API私钥
@@ -37,21 +39,35 @@ class Client(object):
37
39
  # 拼接完整的URL
38
40
  url = c.API_URL + request_path
39
41
 
40
- # 获取时间戳
41
- timestamp = utils.get_timestamp()
42
+ # 确定最终用于请求头和签名的 ISO 8601 格式时间戳
43
+ final_iso8601_timestamp = ""
42
44
 
43
- # 签名和请求头
44
45
  if self.use_server_time:
45
- # 如果使用服务器时间,则重新获取服务器时间戳
46
- timestamp = self._get_timestamp()
46
+ # 获取服务器时间(返回 Unix 毫秒字符串)
47
+ server_ts_ms_str = self._get_timestamp()
48
+ if server_ts_ms_str:
49
+ try:
50
+ ms = int(server_ts_ms_str)
51
+ dt_object = datetime.datetime.fromtimestamp(ms / 1000, tz=datetime.timezone.utc)
52
+ final_iso8601_timestamp = dt_object.isoformat(timespec='milliseconds').replace('+00:00', 'Z')
53
+ except ValueError:
54
+ print(f"Error: Could not convert server timestamp '{server_ts_ms_str}' to ISO 8601. Using raw for signing/header.")
55
+ final_iso8601_timestamp = server_ts_ms_str # 转换失败时,回退使用原始值
56
+ else:
57
+ # 如果获取服务器时间失败,则回退到本地 UTC 时间
58
+ print("Warning: Failed to get server time. Falling back to local UTC time for timestamp.")
59
+ final_iso8601_timestamp = utils.get_timestamp() # utils.get_timestamp() 已经返回 ISO 8601 格式
60
+ else:
61
+ # 使用本地时间(utils.get_timestamp() 已经返回 ISO 8601 格式)
62
+ final_iso8601_timestamp = utils.get_timestamp()
47
63
 
48
64
  # 根据请求方法决定请求体
49
65
  body = json.dumps(params) if method == c.POST else ""
50
66
 
51
- # 生成签名
52
- sign = utils.sign(utils.pre_hash(timestamp, method, request_path, str(body)), self.API_SECRET_KEY)
53
- # 获取请求头
54
- header = utils.get_header(self.API_KEY, sign, timestamp, self.PASSPHRASE, self.flag)
67
+ # 生成签名,使用ISO 8601格式的时间戳
68
+ sign = utils.sign(utils.pre_hash(final_iso8601_timestamp, method, request_path, str(body)), self.API_SECRET_KEY)
69
+ # 获取请求头,使用ISO 8601格式的时间戳
70
+ header = utils.get_header(self.API_KEY, sign, final_iso8601_timestamp, self.PASSPHRASE, self.flag)
55
71
 
56
72
  # 发送请求
57
73
  response = None
@@ -63,9 +79,6 @@ class Client(object):
63
79
  # 发送POST请求
64
80
  response = requests.post(url, data=body, headers=header)
65
81
 
66
- # 异常处理
67
- # print(response.headers) # 调试用,打印响应头
68
-
69
82
  if not str(response.status_code).startswith('2'):
70
83
  # 如果响应状态码不是2xx,则抛出API异常
71
84
  raise exceptions.OkxAPIException(response)
@@ -95,7 +108,7 @@ class Client(object):
95
108
  def _get_timestamp(self):
96
109
  """
97
110
  私有方法,获取服务器时间戳
98
- :return: 服务器时间戳字符串
111
+ :return: 服务器时间戳字符串 (Unix毫秒)
99
112
  """
100
113
  url = c.API_URL + c.SERVER_TIMESTAMP_URL # 拼接获取服务器时间戳的URL
101
114
  response = requests.get(url) # 发送GET请求获取服务器时间
@@ -104,4 +117,4 @@ class Client(object):
104
117
  return response.json()['data'][0]['ts']
105
118
  else:
106
119
  # 如果请求失败,返回空字符串
107
- return ""
120
+ return ""
@@ -47,7 +47,13 @@ def get_header(api_key, sign, timestamp, passphrase, flag):
47
47
  header[c.OK_ACCESS_SIGN] = sign # 设置签名
48
48
  header[c.OK_ACCESS_TIMESTAMP] = str(timestamp) # 设置时间戳
49
49
  header[c.OK_ACCESS_PASSPHRASE] = passphrase # 设置密码
50
- header['x-simulated-trading'] = flag # 设置模拟交易标志
50
+
51
+ # OKX API: 'x-simulated-trading': '1' for simulated, '0' for real
52
+ # Our 'flag' parameter: '1' for real, '0' for simulated
53
+ # 所以,如果我们的 flag 是 '0' (模拟盘),x-simulated-trading 设置为 '1'。
54
+ # 如果我们的 flag 是 '1' (实盘),x-simulated-trading 设置为 '0'。
55
+ header['x-simulated-trading'] = '1' if flag == '0' else '0'
56
+
51
57
  return header
52
58
 
53
59
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: okxv5
3
- Version: 1.8.9
4
- Summary: 自己随便上传使用的,精力有限没有整理调用方法,不知道怎么调用的可以查看源码发给AI
3
+ Version: 1.8.11
4
+ Summary: 自己个人上传使用,精力有限没有整理调用方法,不知道怎么调用的可以查看源码发给AI,有疑问联系QQ:935233452
5
5
  Home-page:
6
6
  Author:
7
7
  Author-email:
@@ -10,6 +10,7 @@ Keywords: okxv5
10
10
  Requires-Dist: numpy>=2.2.6
11
11
  Requires-Dist: pandas>=2.3.3
12
12
  Requires-Dist: requests>=2.32.5
13
+ Requires-Dist: PyYAML>=6.0.3
13
14
 
14
15
  ├── client.py # 核心 API 客户端,处理请求、响应、认证
15
16
  ├── consts.py # 项目常量定义,如 API 地址、错误码等
@@ -54,3 +55,5 @@ print("客户端已成功实例化,发送认证请求。")
54
55
 
55
56
  其他调用方法一致,调用相应的API文件里想要的相应的功能
56
57
 
58
+ 此处实盘为1,模拟盘为0,实盘为1,与官方文档相反,具体用法参考官方文档https://www.okx.com/docs-v5/zh/?language=python#overview
59
+
@@ -1,3 +1,4 @@
1
1
  numpy>=2.2.6
2
2
  pandas>=2.3.3
3
3
  requests>=2.32.5
4
+ PyYAML>=6.0.3
@@ -1,9 +1,9 @@
1
1
  from setuptools import setup,find_packages
2
2
  setup(name='okxv5',
3
- version='1.8.9',
3
+ version='1.8.11',
4
4
  author='',
5
5
  author_email='',
6
- description=f'自己随便上传使用的,精力有限没有整理调用方法,不知道怎么调用的可以查看源码发给AI ',
6
+ description=f'自己个人上传使用,精力有限没有整理调用方法,不知道怎么调用的可以查看源码发给AI,有疑问联系QQ:935233452 ',
7
7
  long_description=open('说明', 'r', encoding='utf-8').read(),
8
8
  long_description_content_type='',
9
9
  url='',
@@ -11,7 +11,7 @@ setup(name='okxv5',
11
11
  license='Apache-2.0',
12
12
  keywords=['okxv5'],
13
13
  install_requires=[
14
- 'numpy>=2.2.6','pandas>=2.3.3','requests>=2.32.5']
14
+ 'numpy>=2.2.6','pandas>=2.3.3','requests>=2.32.5','PyYAML>=6.0.3']
15
15
  )
16
16
  #name:用户使用pip命令安装时你的库的名字,文件夹是的名字是用户在代码调用你的库的名字
17
17
  #version:package的版本号
@@ -23,4 +23,5 @@ setup(name='okxv5',
23
23
  #packages:使用find_packages()函数即可。
24
24
  #license:我这里选择的是Apache-2.0
25
25
  #keywords:关键字
26
- #install_requires:你的项目中用到的别人的库,全部以List[str]的形式写在这里,这里推荐使用库名>=版本号的格式
26
+ #install_requires:你的项目中用到的别人的库,全部以List[str]的形式写在这里,这里推荐使用库名>=版本号的格式
27
+ # 使用命令上传:python setup.py sdist bdist_wheel twine upload dist/*
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes