利用OKX API打造个性化加密货币价格变动警报系统
在波澜壮阔的加密货币市场中,价格波动如同家常便饭。对于投资者而言,时刻关注目标币种的价格动态至关重要,以便抓住交易机会、规避潜在风险。传统的人工盯盘方式耗时费力,效率低下。借助OKX API,我们可以构建一套自动化、个性化的价格变动警报系统,解放双手,专注策略。
1. API密钥的获取与准备
要利用OKX API进行程序化交互,第一步是在OKX交易所注册并完成必要的身份验证流程,包括但不限于KYC(了解你的客户)认证,这对于确保账户安全和合规性至关重要。完成注册和验证后,登录您的OKX账户,导航至“API”管理或类似命名的页面。在这里,您可以创建新的API密钥对。创建API密钥时,系统会提示您选择该密钥对所拥有的权限范围。例如,您可以授予密钥“交易”权限,允许程序代表您执行交易操作,或者授予“读取”权限,允许程序获取账户信息、市场数据等。对于专门设计的价格变动提醒系统,通常建议仅赋予“读取”权限,这是出于最小权限原则的考虑,最大程度地降低潜在的安全风险。
成功创建API密钥后,您将获得
API Key
(也称为公钥)和
Secret Key
(也称为私钥)。
Passphrase
(密码短语)是可选的,如果设置了,也必须将其与API Key和Secret Key一样安全地存储。
API Key
类似于您的用户名,用于标识您的账户;
Secret Key
类似于密码,用于对您的API请求进行签名,证明请求的真实性;
Passphrase
如果启用,则作为附加的安全层,进一步保护您的账户。这些密钥至关重要,泄露可能会导致账户资金损失或其他安全问题。强烈建议将这些密钥存储在安全的地方,例如使用密码管理器,并且不要将它们共享给任何未经授权的第三方。在生产环境中,应考虑使用硬件安全模块(HSM)或可信执行环境(TEE)等技术来保护这些密钥。
2. 开发环境搭建
为了能够高效且安全地与OKX API进行交互,构建一个完善的开发环境至关重要。 本指南以Python编程语言为例,详细介绍搭建过程,并推荐以下经过实践验证的常用库,这些库将极大地简化与OKX API的集成过程:
-
requests:
requests
库是Python中一个功能强大且易于使用的HTTP客户端库。它允许开发者发送各种类型的HTTP请求(如GET、POST、PUT、DELETE等)到OKX API服务器,并处理服务器返回的响应数据。 使用requests
可以方便地设置请求头、传递参数、处理Cookie以及处理各种HTTP错误。 -
hmac & hashlib:
为了确保API请求的安全性,OKX API要求对请求进行签名验证。
hmac
(Hash-based Message Authentication Code) 和hashlib
模块提供了生成安全哈希签名的功能。hmac
结合密钥和请求数据生成消息认证码,hashlib
则提供了多种哈希算法(如SHA256)用于计算哈希值。 通过这两个库,开发者可以按照OKX API的签名规范,对请求进行签名,防止中间人攻击和数据篡改。 -
:
OKX API使用JSON(JavaScript Object Notation)格式进行数据交换。
-
time:
OKX API 在某些请求中需要使用时间戳,例如在生成签名时。
time
库提供了获取当前时间戳的功能。 使用time.time()
可以获取当前时间距离 Epoch (1970-01-01 00:00:00 UTC) 的秒数, 可以使用time.strftime()
将时间戳格式化为指定的字符串。
您可以使用Python的包管理工具pip来轻松安装这些依赖库:
bash
pip install requests
bash
pip install pyOpenSSL
3. API请求签名机制
OKX API采用严格的签名机制,旨在验证每个API请求的真实性和完整性,防止恶意篡改或伪造请求。 这种安全措施确保只有授权用户才能访问其API接口,从而保护用户的数据和资产安全。每个发送到OKX API的请求都必须附带一个生成的签名,这个签名是基于请求参数、您的API密钥(包括API Key和Secret Key),以及当前时间戳等多重因素计算得出的哈希值。
签名过程通常包含以下几个关键步骤:
- 构建预签名字符串: 你需要按照特定的顺序和格式,将所有必要的请求参数(包括请求的HTTP方法、请求路径、查询参数和请求体,如果适用)组合成一个字符串。参数的顺序和格式由OKX API的文档明确规定,务必严格遵守。
- 添加密钥信息: 将你的API Secret Key添加到预签名字符串的末尾。Secret Key是只有你才知道的私钥,绝不能泄露给任何人。
- 计算哈希值: 使用指定的哈希算法(通常是HMAC-SHA256)对包含参数和Secret Key的字符串进行加密处理,生成哈希值。这个哈希值就是你的请求签名。
- 添加时间戳: 在请求头中包含一个时间戳(timestamp),通常是自Unix纪元(1970年1月1日 00:00:00 UTC)以来的秒数或毫秒数。时间戳用于防止重放攻击。
- 将签名添加到请求头: 将生成的签名和时间戳添加到HTTP请求的头部。OKX API会使用这些信息验证请求的有效性。
例如:
1678888888888GET/api/v5/market/tickers?instId=BTC-USDT
Secret Key
作为密钥,对消息字符串进行HMAC-SHA256加密。Python示例代码:
import hmac import hashlib import base64 import time import
def generatesignature(timestamp, method, requestpath, body, secretkey): message = str(timestamp) + method + requestpath + (body if body else '') mac = hmac.new(secret_key.encode('utf-8'), message.encode('utf-8'), hashlib.sha256) d = mac.digest() return base64.b64encode(d)
4. 获取市场行情数据
获取市场行情数据是构建价格变动提醒系统的基础。通过OKX API,开发者可以实时访问各类加密货币的交易信息。以下介绍几种常用的API接口,并提供代码示例。
- /api/v5/market/tickers: 获取多个币种的最新价格、24小时成交量、开盘价、最高价和最低价等信息。此接口适用于需要批量获取多种加密货币实时行情的场景。
- /api/v5/market/ticker: 获取单个币种的最新价格、24小时成交量、开盘价、最高价和最低价等信息。此接口提供更为详细的单个币种信息,包括买一价、卖一价等深度数据。
- /api/v5/market/candles: 获取指定时间周期的K线数据,例如1分钟、5分钟、1小时、1天等。K线数据包含开盘价、收盘价、最高价、最低价和成交量,适用于技术分析和趋势判断。
- /api/v5/market/index-tickers: 获取指数行情数据,反映市场整体表现,例如BTC指数、ETH指数等。
- /api/v5/market/books: 获取指定币种的深度数据,包括买单和卖单的价格和数量,有助于了解市场的买卖力量分布。
下面是如何使用Python和
requests
库获取BTC-USDT最新价格的示例代码。此示例演示了如何向OKX API发送请求,并解析返回的JSON数据以获取所需的价格信息。
import requests
def get_btc_usdt_price():
"""获取BTC-USDT的最新价格."""
url = "https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT"
try:
response = requests.get(url)
response.raise_for_status() # 检查HTTP错误
data = response.()
if data["code"] == "0":
price = data["data"][0]["last"]
return float(price)
else:
print(f"API Error: {data['msg']}")
return None
except requests.exceptions.RequestException as e:
print(f"Request Error: {e}")
return None
if __name__ == "__main__":
btc_price = get_btc_usdt_price()
if btc_price:
print(f"BTC-USDT 最新价格: {btc_price}")
使用此代码,开发者可以定期获取BTC-USDT的最新价格,并根据预设的阈值触发价格变动提醒。 实际应用中,应考虑添加错误处理机制,例如重试机制和日志记录,以提高程序的健壮性。
import requests
API Endpoint
base_url = "https://www.okx.com"
# OKX API v5 基础 URL,所有API请求都以此URL作为起始点。确保使用HTTPS以保证数据传输的安全性。
instrument_id = "BTC-USDT"
# 交易对ID,指定交易的市场。 例如,"BTC-USDT" 表示比特币兑换USDT的市场。 OKX使用标准化的交易对命名规则。务必使用正确的交易对ID,否则API将返回错误。不同的交易所可能使用不同的ID格式。
endpoint = f"/api/v5/market/ticker?instId={instrument_id}"
# API端点,用于获取指定交易对的最新交易信息。
/api/v5/market/ticker
是OKX API v5中获取ticker信息的接口。
instId
是一个查询参数,用于指定要查询的交易对,其值由
instrument_id
变量提供。完整的端点包含了API版本号(v5),资源路径(/market/ticker)以及查询参数。
api_url = base_url + endpoint
# 完整的API URL,通过将基础URL和API端点连接起来构成。 这个URL可以直接用于发送HTTP请求,以获取OKX交易平台上的BTC-USDT交易对的实时ticker数据,例如最新价格、交易量等。不同的编程语言和库 (例如 Python 的 requests 库) 都可以用来发送请求并处理返回的JSON数据。
API Key and Secret
在进行加密货币交易或数据访问时,API 密钥和密钥是至关重要的安全凭证。API 密钥用于标识您的账户,而密钥则用于验证您的身份,确保只有授权用户才能访问您的账户和执行操作。务必妥善保管这些信息,切勿泄露给他人。
以下展示了如何设置您的 API 密钥、密钥和密码短语(如果适用):
api_key = "YOUR_API_KEY"
secret_key = "YOUR_SECRET_KEY"
passphrase = "YOUR_PASSPHRASE" # 如果有的话
重要提示:
-
YOUR_API_KEY
:替换为您交易所或服务提供商提供的实际 API 密钥。API 密钥通常由一串字母和数字组成。 -
YOUR_SECRET_KEY
:替换为您交易所或服务提供商提供的实际密钥。密钥应视为高度机密的信息,类似于密码。 -
YOUR_PASSPHRASE
:如果您的交易所或服务需要密码短语,请将其替换为您设置的密码短语。并非所有交易所都需要密码短语,但如果需要,则必须提供。密码短语通常用于额外的安全层。
请注意,不同的交易所或服务提供商可能具有不同的 API 密钥生成和管理流程。请务必查阅其官方文档以获取详细说明。务必启用所有可用的安全措施,例如双因素身份验证(2FA),以进一步保护您的账户。
一旦您获得了 API 密钥、密钥和密码短语(如果适用),就可以使用它们来通过编程方式访问您的账户并执行交易。使用 API 密钥时,请确保您遵循交易所或服务提供商的使用条款和API速率限制,防止被限制访问权限。
时间戳 (Time Stamp)
定义: 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。在区块链和加密货币领域,时间戳常被用于记录交易发生的时间,确保交易的有序性和可追溯性。
生成方式: 在编程中,可以使用各种编程语言的内置函数来获取当前时间戳。以下代码片段展示了如何通过 Python 获取精确到毫秒的时间戳:
import time
timestamp = str(int(time.time() * 1000))
print(timestamp)
代码解释:
-
time.time()
: 此函数返回自 epoch(1970年1月1日 00:00:00 UTC)以来的秒数,类型为浮点数。 -
* 1000
: 将秒数乘以 1000,将时间精度转换为毫秒。 -
int()
: 将浮点数转换为整数,去除小数点后的部分。 -
str()
: 将整数类型的时间戳转换为字符串类型,便于后续处理和存储。
应用场景: 时间戳在区块链技术中扮演着至关重要的角色。以下是一些常见的应用场景:
- 交易排序: 在区块链网络中,时间戳用于确定交易发生的先后顺序,防止双花攻击等恶意行为。
- 区块生成: 每个新的区块都会包含一个时间戳,表明该区块被创建的时间。时间戳有助于维护区块链的整体时间线。
- 数据溯源: 通过时间戳,可以追踪数字资产的转移历史,提高透明度和可审计性。
- 智能合约: 智能合约可以利用时间戳来触发特定的操作或事件,例如,在特定时间自动执行交易。
注意事项:
- 时钟同步: 为了保证时间戳的准确性,区块链网络中的各个节点需要进行时钟同步。常用的时钟同步协议包括网络时间协议(NTP)。
- 时间偏差: 即使进行了时钟同步,仍然可能存在微小的时间偏差。在对时间戳进行比较时,需要考虑这些偏差带来的影响。
Request Headers
请求方法 (method) = "GET"。在本次请求中,采用的是 "GET" 方法,用于从服务器获取指定资源。
请求体 (body) = '' (空)。由于使用的是 GET 方法,因此请求体为空,不包含任何需要发送给服务器的数据。
签名 (signature) =
generate_signature(timestamp, method, endpoint, body, secret_key)
。签名通过将时间戳 (timestamp)、请求方法 (method)、请求端点 (endpoint)、请求体 (body) 以及您的密钥 (secret_key) 作为输入,经过哈希算法处理生成。该签名用于验证请求的合法性和完整性,防止恶意篡改。
请求头 (headers) 包含以下字段:
-
OK-ACCESS-KEY
: 您的 API 密钥 (api_key),用于标识您的身份。 -
OK-ACCESS-SIGN
: 使用您的密钥生成的签名 (signature),并且已经使用 UTF-8 进行了编码。服务器会使用此签名来验证请求的有效性。 -
OK-ACCESS-TIMESTAMP
: 发起请求时的时间戳 (timestamp),通常为 Unix 时间戳,用于防止重放攻击。 -
OK-ACCESS-PASSPHRASE
: 如果您的账户设置了 passphrase,则需要包含此字段。Passphrase 是一种额外的安全措施,用于保护您的 API 密钥。如果未设置,则无需包含此字段。 -
Content-Type
: 内容类型设置为 "application/",表明本次请求发送的数据格式为 JSON。这是一种常用的数据交换格式,易于解析和处理。
发送请求
在与加密货币相关的API交互中,发送请求是获取数据或执行操作的关键步骤。通常,我们会使用编程语言(例如Python)及其相关的库(如
requests
)来构建和发送这些请求。
以下代码片段展示了如何使用Python的
requests
库发送一个GET请求到指定的API URL,并包含必要的头部信息:
response = requests.get(api_url, headers=headers)
代码详解:
-
requests.get(api_url, headers=headers)
: 这是requests
库中用于发送GET请求的函数。GET请求通常用于从服务器检索数据,例如加密货币的价格、交易历史或其他相关信息。 -
api_url
: 这是一个字符串变量,包含了目标API的完整URL。例如,api_url
可能设置为"https://api.example.com/v1/ticker?symbol=BTCUSDT"
,用于请求比特币(BTC)兑美元(USDT)的交易数据。 -
headers
: 这是一个字典(dictionary),包含了HTTP请求头信息。请求头可以包含各种信息,例如API密钥(用于身份验证)、内容类型(例如"Content-Type": "application/"
,表明请求正文是JSON格式)以及用户代理(用于标识客户端)。正确设置请求头对于成功与API交互至关重要,特别是当API需要身份验证或对请求格式有特定要求时。 -
response
: 这是requests.get()
函数返回的对象。它包含了服务器的响应,包括状态码(例如200表示成功,400表示客户端错误,500表示服务器错误)、响应头以及响应内容。
重要提示:
-
在实际应用中,请确保替换
api_url
为真实的API端点,并根据API的要求设置正确的headers
。 -
务必检查
response
对象的状态码,以确认请求是否成功。可以使用response.status_code
属性获取状态码。 -
通过
response.()
方法可以将JSON格式的响应内容解析为Python字典,方便进一步处理。对于非JSON格式的响应,可以使用response.text
属性获取原始文本内容。 - 需要注意的是,不同的加密货币API可能需要不同的认证方式,例如API密钥、OAuth 2.0等。请务必仔细阅读API文档,并按照要求进行配置。
Process Response
在处理API响应时,状态码至关重要。
response.status_code == 200
意味着请求已成功执行,服务器返回了预期的结果。当状态码为200时,程序将进一步处理返回的数据。
data = response.()
这行代码将服务器返回的JSON格式的响应体解析为Python字典,便于后续的数据提取和处理。务必确保服务器返回的是有效的JSON数据,否则可能会导致解析错误。
print(data)
这用于调试,将解析后的数据打印到控制台,方便开发者检查数据的结构和内容。在生产环境中,通常需要移除或替换为更合适的日志记录方式。
if data['code'] == '0':
这是一个条件判断,检查返回的数据中是否存在一个名为
'code'
的键,并且其对应的值是否为
'0'
。这通常用于表示API请求是否成功。不同的API可能有不同的成功标识符,需要根据具体API文档进行调整。
last_price = data['data'][0]['last']
这行代码从解析后的数据中提取最新的BTC-USDT交易价格。假设返回的数据结构是:
{'code': '0', 'data': [{'last': '42000'}]}
。代码首先访问
'data'
键对应的值,这是一个列表;然后访问列表的第一个元素(索引为0),这是一个字典;最后访问字典中
'last'
键对应的值,即最新的交易价格。务必确保返回的数据结构与代码的预期一致,否则可能会导致
KeyError
或
IndexError
。
print(f"BTC-USDT Last Price: {last_price}")
这行代码使用格式化字符串(f-string)将最新的BTC-USDT交易价格打印到控制台。这可以方便用户查看最新的价格信息。
else: print(f"Error: {data['msg']}")
如果
data['code']
的值不等于
'0'
,则表示API请求失败。这行代码将错误信息打印到控制台,方便开发者诊断问题。通常,API会返回一个
'msg'
键,其中包含详细的错误描述。
else: print(f"Request failed with status code: {response.status_code}")
如果
response.status_code
不等于
200
,则表示HTTP请求本身失败。这行代码将HTTP状态码打印到控制台,方便开发者诊断网络问题。常见的HTTP状态码包括400(Bad Request)、401(Unauthorized)、403(Forbidden)、404(Not Found)、500(Internal Server Error)等。
5. 设置价格变动阈值与提醒机制
在获取实时市场行情数据后,至关重要的是要设定价格变动的敏感阈值,并相应地配置有效的提醒机制。这些阈值可以基于绝对价格的变化、百分比的波动,或者将二者结合起来,以适应不同的交易策略和风险承受能力。
例如,以下是一些实用的阈值设置示例:
- 当BTC-USDT的价格在短时间内(例如5分钟或1小时内)上涨或下跌超过预设的百分比(比如1%或2%)时,立即发送警报。
- 当BTC-USDT的价格突破特定的关键价格点位,例如达到45000 USDT或跌破40000 USDT时,触发提醒。这些点位通常代表重要的支撑位或阻力位。
- 可以设定多重阈值,例如,当价格变动达到较小的阈值时发送一般提醒,而当达到较大的阈值时发送紧急提醒。
提醒机制的选择多种多样,应根据个人的偏好和平台的可用性进行选择。以下是一些常见的提醒方式:
-
邮件提醒:
通过SMTP(简单邮件传输协议)协议,使用Python的
smtplib
库等工具发送电子邮件。需要配置SMTP服务器地址、端口、发件人邮箱和密码。 - 短信提醒: 通过第三方短信服务提供商的API接口发送短信。例如阿里云、腾讯云等都提供短信服务。需要注册账号、购买短信套餐,并调用API发送短信。
- 即时通讯软件提醒: 通过企业微信、钉钉、Telegram等平台的API发送消息。这种方式通常需要创建应用或机器人,并获取相应的API密钥。
- 移动应用推送通知: 如果开发了自己的移动应用,可以使用Firebase Cloud Messaging (FCM) 或 Apple Push Notification service (APNs) 等服务发送推送通知。
- Webhooks: 将价格变动信息实时推送到指定的URL,方便与其他系统集成。
以下是一个使用Python发送邮件提醒的简单示例,展示了如何利用
smtplib
库连接SMTP服务器并发送邮件:
import smtplib
from email.mime.text import MIMEText
def send_email(subject, body, sender_email, sender_password, receiver_email):
message = MIMEText(body, 'plain', 'utf-8') # 设置邮件内容为UTF-8编码,避免乱码
message['Subject'] = subject
message['From'] = sender_email
message['To'] = receiver_email
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server: # 使用Gmail SMTP服务器,465端口是SSL加密的常用端口
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {e}")
代码解释:
这段代码演示了如何使用Gmail的SMTP服务器发送邮件。
smtplib.SMTP_SSL
创建一个安全连接。
server.login
使用发件人的邮箱和密码登录服务器。
server.sendmail
发送邮件。 请务必妥善保管邮箱密码,避免泄露。
安全提示: 强烈建议使用专门的应用程序密码,而不是主邮箱密码,以提高安全性。许多邮件服务提供商都允许创建应用程序密码。 另外,可以使用环境变量来存储敏感信息,避免硬编码到代码中。
示例用法
注意:这里使用的是Gmail,你需要开启Gmail的“允许不太安全的应用访问”功能。
或者配置其他SMTP服务器,并依照其特定规范调整代码配置。
sender_email = "[email protected]"
发件人邮箱地址,替换为你的真实Gmail邮箱或其他邮件服务提供商的有效邮箱地址。务必使用可正常收发邮件的地址,否则邮件发送可能失败。
sender_password = "your_email_password"
发件人邮箱密码或应用专用密码。对于启用了两步验证的Gmail账户,强烈建议使用应用专用密码,而非直接使用邮箱登录密码,以提高安全性。应用专用密码可以在Google账户的安全设置中生成。对于其他邮件服务商,请参考其官方文档获取相应的授权方式。
receiver_email = "[email protected]"
收件人邮箱地址,即你希望接收邮件的目标邮箱。可以设置为单个邮箱地址,也可以根据需求设置为包含多个收件人的列表。
实际价格变动判断逻辑应该放在获取行情数据之后
BTC价格预警示例
当监控到BTC-USDT的最新价格超过预设阈值时,将触发警报机制。以下代码片段展示了如何实现这一功能:
if float(last_price) > 45000:
subject = "BTC-USDT价格达到预警值"
body = f"BTC-USDT价格已达到 {last_price} USDT,超过预警值 45000 USDT。"
send_email(subject, body, sender_email, sender_password, receiver_email)
这段代码首先将`last_price`(最近一次的BTC-USDT交易价格)转换为浮点数类型,以便进行数值比较。随后,它会判断该价格是否大于预设的阈值45000 USDT。如果价格超过该阈值,程序将构造一封电子邮件,邮件主题为“BTC-USDT价格达到预警值”,邮件正文则包含具体的价格信息,指出BTC-USDT的价格已达到多少USDT,并且超过了预警值45000 USDT。
`send_email`函数负责发送这封警报邮件。该函数需要以下参数:邮件主题(`subject`)、邮件正文(`body`)、发件人邮箱地址(`sender_email`)、发件人邮箱密码(`sender_password`)以及收件人邮箱地址(`receiver_email`)。为了安全起见,发件人邮箱密码不应硬编码在代码中,而应从安全存储的位置(例如环境变量或密钥管理系统)读取。
需要注意的是,实际应用中,`last_price`变量需要从交易所API或其他数据源实时获取。同时,邮件发送功能应使用成熟的邮件库,并注意处理异常情况,例如网络错误或身份验证失败。
6. 循环监控与异常处理
为了实现对加密货币价格变动的持续监控,需要将获取价格数据的代码置于一个无限循环中,并设定合适的循环间隔。循环间隔的选择需要权衡监控的实时性和服务器的负载。过于频繁的请求可能会导致API限流,而间隔过长则可能错过重要的价格波动。同时,为了确保监控系统的稳定性与可靠性,必须妥善处理可能出现的各种异常情况,例如网络连接中断、API调用失败、数据解析错误等。
以下是一个简化的循环监控示例代码,用于演示如何定期获取并分析BTC-USDT的价格,并在价格超过预设阈值时发送邮件通知。该示例包含了基本的异常处理机制,但实际应用中可能需要更完善的错误处理和日志记录。
import time
import requests
import smtplib
from email.mime.text import MIMEText
# 邮箱配置(请替换为您的真实信息)
sender_email = "[email protected]"
sender_password = "your_password" # 建议使用授权码
receiver_email = "[email protected]"
def send_email(subject, body, sender_email, sender_password, receiver_email):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = sender_email
msg['To'] = receiver_email
try:
with smtplib.SMTP_SSL('smtp.example.com', 465) as server: # 替换为您的SMTP服务器地址和端口
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {e}")
api_url = "https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT"
headers = {'Content-Type': 'application/'}
while True:
try:
# 获取市场行情数据
response = requests.get(api_url, headers=headers, timeout=10) # 添加超时设置
response.raise_for_status() # 检查HTTP状态码,抛出异常
data = response.()
if data['code'] == '0':
last_price = data['data'][0]['last']
print(f"BTC-USDT Last Price: {last_price}")
# 价格变动判断逻辑(示例,需要根据实际情况修改)
price_threshold = 45000
if float(last_price) > price_threshold:
subject = "BTC-USDT价格达到预警值"
body = f"BTC-USDT价格已达到 {last_price} USDT,超过预警值 {price_threshold} USDT。"
send_email(subject, body, sender_email, sender_password, receiver_email)
# 计算百分比变动(需要记录上次价格)
# 需要记录上次价格,例如存储在文件中或数据库中
# last_price_previous = get_previous_price()
# percentage_change = ((float(last_price) - last_price_previous) / last_price_previous) * 100
# print(f"价格变动百分比: {percentage_change:.2f}%")
# update_previous_price(float(last_price)) # 保存当前价格以供下次使用
else:
print(f"API Error: {data['msg']}")
except requests.exceptions.HTTPError as e:
print(f"HTTP Error: {e.response.status_code} - {e.response.text}")
except requests.exceptions.ConnectionError as e:
print(f"网络连接错误: {e}")
except requests.exceptions.Timeout as e:
print(f"连接超时: {e}")
except KeyError as e:
print(f"数据解析错误: 缺少键 - {e}") # 捕获键错误
except Exception as e:
print(f"其他错误: {e}")
time.sleep(60) # 每隔60秒监控一次
示例代码中,引入了
smtplib
和
email.mime.text
库用于发送电子邮件通知。 同时增加了更加详细的异常处理,包括对HTTP状态码的检查(
response.raise_for_status()
),连接错误,超时错误和键错误的捕获。 为了防止程序崩溃,使用try-except块捕获各种潜在的异常,并在控制台输出错误信息。建议在实际部署时,将错误信息写入日志文件,以便后续分析和排查。
通过结合OKX API的强大功能,可以构建更复杂和个性化的警报规则,例如基于相对强弱指标(RSI)、移动平均线(MA)等技术指标的警报,或者基于成交量异动的警报。 还可以将监控数据存储到数据库中,进行更深入的分析和挖掘,为投资决策提供更有力的支持。 建议使用多线程或异步编程来优化代码的执行效率,特别是在需要同时监控多个交易对的情况下。