Upbit API 自动化交易指南:从入门到实战
准备工作:密钥申请与API接口详解
在涉足 Upbit 自动化交易之前,务必准备好两组至关重要的身份凭证:API 访问密钥(Access Key)和安全密钥(Secret Key)。Upbit 提供了功能完善的应用程序编程接口(API),允许开发者通过编写代码的方式安全访问账户信息、执行交易指令以及实时获取市场动态。为了获取这些密钥,请按照以下步骤操作:
-
登录 Upbit 账户: 确保已经完成 Upbit 账户的注册流程,并且能够成功登录你的个人账户。这是进行后续操作的基础。
-
访问 API 密钥管理页面: 登录 Upbit 网站后,导航至“我的页面”、“账户设置”或类似的入口。在此页面中,寻找与“API 密钥管理”、“开放 API 设置”或类似名称的选项。这个选项将引导你进入 API 密钥的管理界面。
-
创建新的 API 密钥: 在 API 密钥管理页面,点击“创建 API 密钥”、“添加新密钥”或类似的按钮。系统将提示你为新创建的 API 密钥添加描述信息,以便于区分和管理,例如“自动化交易机器人专用密钥”或“量化交易系统”。
-
精细化权限设置: 权限设置是保障账户安全的关键环节。Upbit 允许你对 API 密钥的权限进行精细化控制。对于自动化交易程序,必须赋予“交易”权限,允许程序执行买卖操作;同时,为了获取市场数据,还需要赋予“行情”或“市场数据查询”权限。 务必严格限制 API 密钥的权限,切勿 授予“提币”权限,以防止因密钥泄露导致的资金损失风险。只赋予交易和行情权限,可以有效降低潜在的安全风险。
-
安全保存 API 密钥: 成功创建 API 密钥后,系统将生成两个唯一的字符串: Access Key (访问密钥) 和 Secret Key (安全密钥) 。 务必将这两个密钥以高度安全的方式存储,切勿以任何形式泄露给任何第三方。 它们是访问你的 Upbit 账户并执行操作的唯一凭证,类似于银行账户的用户名和密码。请使用密码管理器或其他安全措施来保护这些密钥。
-
IP 白名单配置 (强烈推荐): 为了进一步增强安全性,强烈建议配置 IP 白名单。IP 白名单允许你指定可以访问你的 API 密钥的特定 IP 地址。只有来自这些 IP 地址的请求才会被允许,其他 IP 地址的请求将被拒绝。这可以有效防止密钥泄露后被恶意利用,即使密钥泄露,攻击者也无法通过未经授权的 IP 地址访问你的账户。在 Upbit 的 API 密钥管理界面,你可以找到设置 IP 白名单的选项。输入允许访问 API 密钥的服务器或设备的 IP 地址即可。
成功获取 API 密钥后,需要深入了解 Upbit API 的基本架构和使用方法。Upbit API 遵循 RESTful 架构风格,这意味着你可以通过发送标准的 HTTP 请求与 Upbit 服务器进行交互。常用的 HTTP 请求方法包括:
- GET: 用于从 Upbit 服务器获取数据,例如查询账户余额、获取实时的市场行情数据(如价格、成交量等)。GET 请求通常用于只读操作,不会对服务器上的数据进行修改。
- POST: 用于在 Upbit 服务器上创建新的资源或执行操作,例如提交新的买单或卖单,取消现有的订单等。POST 请求通常用于修改服务器上的数据。
- DELETE: 用于从 Upbit 服务器删除资源,例如取消尚未成交的订单。DELETE 请求用于删除服务器上的数据。
Upbit 官方提供了详细的 API 文档,其中包含了所有可用接口的完整描述、每个接口所需的请求参数、以及服务器返回的响应数据的格式说明。建议仔细阅读并理解这些文档,以便正确使用 Upbit API 进行自动化交易开发。文档通常会包含示例代码,帮助你快速上手。
Python 编程环境搭建:库安装与配置
自动化交易系统通常采用 Python 语言开发,其原因在于 Python 具备丰富的第三方库支持以及简洁易懂的语法结构,极大地降低了开发门槛并提高了开发效率。为了构建一个高效的自动化交易程序,你需要安装并配置以下关键 Python 库:
-
requests:
此库用于发送各种类型的 HTTP 请求,包括 GET、POST、PUT、DELETE 等,是与交易所 API 进行数据交互的核心工具。通过
requests
,你可以获取市场数据、提交订单、查询账户信息等。 - uuid: 该库用于生成全局唯一标识符 (UUID)。在与某些交易所 API 交互时,可能需要 UUID 来标识唯一的请求或消息,以此确保数据传输的完整性和可靠性。UUID 能够有效地避免命名冲突,保证系统的稳定性。
-
jwt:
jwt
库用于生成 JSON Web Token (JWT),一种行业标准的身份验证机制。许多交易所采用 JWT 来验证用户的身份,并授权其访问 API 接口。通过jwt
库,你可以创建包含用户身份信息的 JWT,并将其附加到 API 请求头中,以便交易所验证你的身份。 -
hashlib:
此库提供了多种哈希算法(如 SHA256、MD5 等),用于计算数据的哈希值。在与某些交易所 API 交互时,可能需要使用哈希算法对请求参数进行签名,以防止数据被篡改。
hashlib
库可以确保数据传输的安全性,提高系统的可靠性。
你可以通过 Python 的包管理器
pip
来便捷地安装这些库。
pip
会自动处理依赖关系,并从 Python Package Index (PyPI) 下载并安装所需的库及其依赖项。
使用以下命令安装:
pip install requests uuid pyjwt hashlib
安装完成后,为了开始编写你的自动化交易程序,你需要创建一个 Python 文件,例如命名为
upbit_bot.py
。在该文件中,你需要导入所有必要的库,以便在程序中使用它们的功能。同时,也导入
urllib.parse
和
os
这两个标准库以方便进行URL编码和读取环境变量。
示例代码:
import requests
import uuid
import jwt
import hashlib
from urllib.parse import urlencode
import os
替换为你的 Access Key 和 Secret Key
access_key = os.environ['UPBIT_OPEN_API_ACCESS_KEY']
secret_key = os.environ['UPBIT_OPEN_API_SECRET_KEY']
为了保障账户安全,强烈建议将 Upbit API 的 Access Key 和 Secret Key 存储在操作系统的环境变量中。避免直接在代码中硬编码这些敏感信息,可以有效防止密钥泄露的风险。
环境变量是一种在操作系统中存储配置信息的安全方式。通过设置环境变量,你的程序可以在运行时动态地获取 Access Key 和 Secret Key,而无需将它们直接写入代码。这不仅提高了代码的安全性,也使得在不同环境(例如开发、测试、生产)中部署和管理你的 Upbit 应用程序变得更加便捷。
设置环境变量的方法取决于你使用的操作系统。例如,在 Linux 或 macOS 系统中,你可以在
.bashrc
或
.zshrc
文件中添加以下行:
export UPBIT_OPEN_API_ACCESS_KEY="你的 Access Key"
export UPBIT_OPEN_API_SECRET_KEY="你的 Secret Key"
然后在终端中运行
source ~/.bashrc
或
source ~/.zshrc
命令,使环境变量生效。在 Windows 系统中,你可以通过系统属性对话框设置环境变量。
使用环境变量读取 Access Key 和 Secret Key 后,即使你的代码被意外泄露,攻击者也无法直接获取你的密钥信息,从而降低了账户被盗用的风险。请务必妥善保管你的 Access Key 和 Secret Key,避免泄露给他人。
账户信息查询:获取余额与持仓
获取账户信息是自动化交易的核心组成部分,它为策略执行提供必要的数据支持。通过 Upbit API 的
/accounts
接口,可以实时查询账户的可用余额和持仓详情,为决策提供依据。
以下 Python 代码展示了如何调用 Upbit API 的
/accounts
接口,获取账户信息。这段代码使用
requests
库发送 HTTP GET 请求,并通过 JWT (JSON Web Token) 进行身份验证。
def get_accounts():
"""
从 Upbit API 获取账户信息。
Returns:
list: 包含账户信息的 JSON 数组,如果请求失败则返回 None。
"""
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # 使用 UUID 生成唯一 nonce
}
try:
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
res = requests.get('https://api.upbit.com/v1/accounts', headers=headers)
res.raise_for_status() # 检查 HTTP 状态码,如果不是 200 则抛出异常
return res.()
except requests.exceptions.RequestException as e:
print(f"请求错误: {e}")
return None
except jwt.exceptions.JWTError as e:
print(f"JWT 编码错误: {e}")
return None
在获取账户信息后,可以遍历返回的 JSON 数组,提取所需的币种、可用余额和锁定余额等信息。锁定余额通常表示挂单或其他交易占用的资产。
accounts = get_accounts()
if accounts:
for account in accounts:
currency = account['currency'] # 币种代码 (如: KRW, BTC, ETH)
balance = account['balance'] # 可用余额,字符串类型
locked = account['locked'] # 锁定余额,字符串类型
avg_buy_price = account.get('avg_buy_price', '0') #平均买入价格,字符串类型,可能不存在
print(f"币种: {currency}, 可用余额: {balance}, 锁定余额: {locked}, 平均买入价格: {avg_buy_price}")
else:
print("获取账户信息失败")
代码详解:通过 Access Key 和随机生成的 nonce 构建一个 payload。nonce (随机数) 的作用是防止重放攻击,保证每次请求的唯一性。然后,使用 Secret Key 对 payload 进行签名,生成 JWT (JSON Web Token)。JWT 是一种行业标准的身份验证方法,用于安全地将信息作为 JSON 对象在各方之间传输。生成的 JWT 令牌被添加到 Authorization header 中,作为身份验证凭据。
请求发送到
/accounts
接口后,Upbit 服务器会对 JWT 进行验证。验证通过后,服务器会返回一个 JSON 数组,其中包含了用户所有币种的详细信息,包括币种代码、可用余额、锁定余额以及其他相关数据。
avg_buy_price
字段存储了该币种的平均买入价格。需要注意的是,balance 和 locked 字段返回的是字符串类型,在进行计算时需要转换为数值类型。建议添加错误处理机制,例如使用 try-except 块来捕获潜在的请求错误或 JWT 编码错误。
市场行情获取:实时价格与交易量
自动化交易系统依赖于对市场行情的实时掌握。为了实现这一点,可以利用交易所提供的应用程序编程接口 (API)。Upbit API 提供了一个名为
/ticker
的接口,专门用于获取指定交易对(币种)的当前市场价格、成交量以及其他相关市场指标。
通过调用
/ticker
接口,可以获得包括但不限于以下关键数据:
-
当前价格 (
trade_price
): 最近一笔成交的价格。 -
最高价 (
high_price
): 当日(UTC 0时开始)的最高成交价格。 -
最低价 (
low_price
): 当日(UTC 0时开始)的最低成交价格。 -
交易量 (
trade_volume
): 最近成交的交易量。 -
累积交易量 (
acc_trade_volume
): 当日(UTC 0时开始)的累积成交量。 -
累积交易额 (
acc_trade_price
): 当日(UTC 0时开始)的累积成交额。 -
时间戳 (
trade_timestamp
): 最近成交的时间戳,通常以 Unix 时间(秒)表示。
以下是一个使用 Python 和
requests
库从 Upbit API 获取行情数据的示例代码:
import requests
def get_ticker(markets):
"""
从 Upbit API 获取指定交易对的行情数据。
Args:
markets (str): 以逗号分隔的交易对代码,例如 "KRW-BTC,KRW-ETH"。
Returns:
list: 包含行情数据的 JSON 列表,每个元素对应一个交易对。如果请求失败,则返回 None。
"""
url = "https://api.upbit.com/v1/ticker"
querystring = {"markets": markets}
try:
res = requests.get(url, params=querystring)
res.raise_for_status() # 检查 HTTP 状态码,如果不是 200,则抛出异常
return res.()
except requests.exceptions.RequestException as e:
print(f"获取行情数据失败: {e}")
return None
代码解释:
-
导入
requests
库: 用于发送 HTTP 请求。 -
定义
get_ticker
函数: 接收一个包含交易对代码的字符串作为参数。交易对代码需要以逗号分隔,例如 "KRW-BTC,KRW-ETH"。 - 构造 URL 和查询字符串: 将 API 的基本 URL 和包含交易对代码的查询字符串组合成完整的请求 URL。
-
发送 GET 请求:
使用
requests.get()
方法向 Upbit API 发送 GET 请求。 -
处理响应:
-
使用
res.raise_for_status()
检查 HTTP 状态码。如果状态码不是 200 OK,则抛出一个异常,表明请求失败。 -
如果请求成功,使用
res.()
方法将响应内容解析为 JSON 格式的 Python 列表。
-
使用
-
错误处理:
使用
try...except
块捕获可能发生的requests.exceptions.RequestException
异常(例如网络错误、连接超时等),并在控制台打印错误信息。如果发生错误,函数返回None
。
使用示例:
# 获取 BTC 和 ETH 的行情数据
markets = "KRW-BTC,KRW-ETH"
ticker_data = get_ticker(markets)
if ticker_data:
for data in ticker_data:
print(f"交易对: {data['market']}")
print(f"当前价格: {data['trade_price']}")
print(f"交易量: {data['trade_volume']}")
print("-" * 20)
else:
print("未能获取到行情数据。")
注意事项:
- 请务必遵守 Upbit API 的使用条款和速率限制,避免对服务器造成过大的负担。
- 建议使用 API 密钥进行身份验证,以提高请求的可靠性和安全性。
- 在实际的自动化交易系统中,需要对获取到的行情数据进行清洗、验证和处理,以确保数据的准确性和可靠性。
- 需要根据具体的交易策略,选择合适的行情数据和指标,并进行相应的计算和分析。
获取 BTC/KRW 实时行情
通过 Upbit 交易所 API 获取韩元 (KRW) 计价的比特币 (BTC) 实时行情数据。
ticker = get_ticker("KRW-BTC")
该行代码调用
get_ticker
函数,传入 "KRW-BTC" 作为参数。 "KRW-BTC" 代表以韩元计价的比特币交易对。此函数向 Upbit API 发送请求,检索该交易对的最新市场信息。返回值
ticker
是一个包含交易信息的列表。
print(f"当前价格: {ticker[0]['trade_price']}")
print(f"24 小时交易量: {ticker[0]['acc_trade_volume_24h']}")
这两行代码从
ticker
列表中提取并打印关键行情数据。
ticker[0]['trade_price']
访问列表中第一个元素(通常是最新行情)的 'trade_price' 键对应的值,即当前交易价格。
ticker[0]['acc_trade_volume_24h']
访问 'acc_trade_volume_24h' 键对应的值,表示 24 小时内的累计交易量。
这段代码示例展示了如何通过 GET 请求访问 Upbit API 的
/ticker
接口。请求中,
markets
参数被设置为 "KRW-BTC",用于指定需要查询的交易对。API 响应返回一个 JSON 数组,其中包含了指定交易对的详细实时行情数据,如最新成交价格 (
trade_price
)、最高价 (
high_price
)、最低价 (
low_price
)、累计交易量 (
acc_trade_volume
)、24 小时累计交易量 (
acc_trade_volume_24h
)、以及时间戳等信息。开发者可以根据需求解析 JSON 数据,提取所需的行情指标进行分析和应用。
下单交易:买入与卖出
下单交易是自动化交易系统的核心环节。通过 Upbit API 提供的
/orders
接口,你可以实现创建、查询以及取消订单等关键操作。这些功能为构建高效的自动化交易策略提供了基础。
以下是一个使用 Python 编写的示例函数,展示了如何调用 Upbit API 的
/orders
接口进行下单操作。该函数接受多个参数,包括交易市场、买卖方向、交易数量、指定价格和订单类型。函数内部会对请求参数进行编码和签名,确保交易请求的安全性。
def place_order(market, side, volume, price, order_type):
参数说明:
-
market
: 交易市场代码,例如 "KRW-BTC"。 -
side
: 买卖方向,'bid'
表示买入,'ask'
表示卖出。 -
volume
: 交易数量,即买入或卖出的数量。 -
price
: 交易价格,仅在指定价格下单时有效。 -
order_type
: 订单类型,'limit'
表示指定价格下单,'price'
表示市价买入,'market'
表示市价卖出。 市价卖出时 price 字段可以设置为 None。
query = {
'market': market,
'side': side, # 'bid' 买入, 'ask' 卖出
'volume': volume,
'price': price,
'ord_type': order_type, # 'limit' 指定价格下单, 'price' 市价买入, 'market' 市价卖出
}
为了保证API请求的安全性,需要对请求参数进行签名。以下代码展示了如何使用 SHA512 算法对请求参数进行哈希,并生成 JWT 令牌,用于身份验证。
query_string = urlencode(query).encode()
m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()),
'query_hash': query_hash,
'query_hash_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
使用
requests
库发送 POST 请求到 Upbit API 的
/orders
接口,并返回响应结果。请确保已安装
requests
库:
pip install requests
。
res = requests.post('https://api.upbit.com/v1/orders', params=query, headers=headers)
return res.()
以指定价格买入 BTC
使用Upbit API以指定价格买入比特币的示例代码如下所示。这段代码展示了如何通过编程方式提交一个限价买单。
order = place_order("KRW-BTC", "bid", "0.0001", "50000000", "limit")
上述代码中,
place_order
函数负责构建并发送订单请求。参数的具体含义如下:
-
"KRW-BTC"
:指定交易市场为韩元 (KRW) 交易比特币 (BTC)。 -
"bid"
:指定订单类型为买单(bid)。 -
"0.0001"
:指定买入的比特币数量为 0.0001 BTC。 -
"50000000"
:指定买入的价格为 50,000,000 韩元。 -
"limit"
:指定订单类型为限价单(limit order)。限价单只有在市场价格达到或低于指定价格时才会成交。
print(f"订单 ID: {order['uuid']}")
成功提交订单后,API会返回包含订单详细信息的响应。 上述代码可以提取并打印订单的唯一标识符 (UUID),方便后续查询订单状态或取消订单。 订单 ID 是一个重要的参考值,务必妥善保存。
代码示例展示了构建订单请求、进行安全认证以及处理API响应的步骤。构造一个包含订单信息的查询 (query), query 包括交易市场、订单类型、数量和价格等必要参数。 为保证安全性,需要对 query 进行 SHA512 哈希处理,并将哈希值置于 payload 中。随后,使用预先获得的密钥对 payload 进行签名,生成 JSON Web Token (JWT)。 将生成的 JWT 作为身份验证凭据,通过 POST 请求发送到
/orders
接口。
/orders
接口是 Upbit API 中用于提交订单的端点。 通过向该接口发送带有 JWT 认证的 POST 请求,可以安全地提交买入或卖出订单。
API 的响应结果包含了订单的详细信息。 例如,
uuid
字段表示订单 ID,
state
字段表示订单状态(如
wait
,
done
,
cancel
),
market
字段指示交易市场,
price
字段表示订单的指定价格,
volume
字段表明订单的数量,
remaining_volume
表示剩余未成交的数量,
reserved_fee
是预计的手续费。 通过分析响应结果,可以了解订单是否成功提交,以及订单的执行情况。
订单状态查询与取消
Upbit API 提供了便捷的订单管理功能。 你可以使用
/order
接口精确查询特定订单的当前状态, 包括订单类型、下单时间、成交数量、剩余数量等详细信息。 对于尚未完全成交或处于待处理状态的订单,你可以通过
/orders/{uuid}
接口发起取消请求。
以下 Python 代码展示了如何使用 Upbit API 查询订单状态:
def get_order(uuid):
"""
通过 UUID 查询 Upbit 订单状态。
Args:
uuid (str): 订单的唯一标识符 UUID。
Returns:
requests.Response: 包含订单信息的 HTTP 响应对象。
"""
url = f"https://api.upbit.com/v1/order?uuid={uuid}"
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # 确保 nonce 的唯一性
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
res = requests.get(url, headers=headers)
res.raise_for_status() # 检查 HTTP 状态码,抛出异常如果不是 200
return res.() # 返回 JSON 格式的响应数据
此代码段中,
get_order
函数接收订单 UUID 作为参数,构建请求 URL,并使用 JWT (JSON Web Token) 进行身份验证。 JWT 包含你的 Access Key、一个唯一 nonce 值以及加密算法信息。 服务器返回的 JSON 响应包含了订单的详细状态信息,例如订单类型 (bid/ask)、市场代码 (market)、订单状态 (wait/watch/done/cancel)、下单时间 (created_at) 等。 成功调用后,请务必处理响应状态码,确保请求成功。
以下 Python 代码展示了如何使用 Upbit API 取消订单:
def cancel_order(uuid):
"""
通过 UUID 取消 Upbit 订单。
Args:
uuid (str): 待取消订单的唯一标识符 UUID。
Returns:
requests.Response: 包含取消结果的 HTTP 响应对象。
"""
url = f"https://api.upbit.com/v1/order?uuid={uuid}"
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # 确保 nonce 的唯一性
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorize_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorize_token}
res = requests.delete(url, headers=headers)
res.raise_for_status() # 检查 HTTP 状态码,抛出异常如果不是 200
return res.() # 返回 JSON 格式的响应数据
与订单查询类似,
cancel_order
函数也需要订单 UUID 和经过 JWT 身份验证的请求头。 不同之处在于,这里使用
requests.delete()
方法发送 DELETE 请求,指示服务器取消指定的订单。 如果取消成功,服务器会返回一个包含取消结果的 JSON 响应。注意,只有状态为 "wait" (待成交) 或 "watch" (预定单) 的订单才能被取消。 已经成交或部分成交的订单无法直接取消,需要进行反向操作(例如,卖出已买入的资产)。
获取订单信息
要获取特定订单的详细信息,可以使用
get_order
函数。该函数接受订单的唯一标识符 (UUID) 作为输入,并返回包含订单所有相关数据的字典。
order_info = get_order(order['uuid'])
上述代码片段展示了如何调用
get_order
函数。假设变量
order
是一个包含订单信息的字典,并且其中一个键是
'uuid'
,其对应的值是订单的UUID。这段代码将
order
字典中
'uuid'
键对应的值传递给
get_order
函数,并将返回的订单信息存储在名为
order_info
的变量中。
获取订单信息后,可以访问该字典中的各个键来提取特定的订单属性,例如订单状态。订单状态可以反映订单的当前处理阶段,例如“已创建”、“已支付”、“已发货”或“已完成”。
print(f"订单状态: {order_info['state']}")
这行代码使用 f-string (格式化字符串字面量) 打印订单状态。
order_info['state']
访问
order_info
字典中键为
'state'
的值,该值代表订单的状态。然后,该状态值会被嵌入到字符串 "订单状态: " 之后,并打印到控制台。通过这种方式,开发者可以方便地查看特定订单的当前状态。
取消订单
取消订单操作允许用户停止尚未完全执行的交易。通过API调用,用户可以根据订单的唯一标识符(UUID)发起取消请求。以下代码展示了如何使用
cancel_order
函数取消订单,并打印取消操作的结果状态。
cancel_result = cancel_order(order['uuid'])
上述代码片段中,
order['uuid']
代表需要取消的订单的唯一UUID。UUID是订单在系统中的唯一标识符,用于精确定位目标订单。
cancel_order
函数执行取消订单的API调用,并返回一个包含取消结果信息的字典。这个字典至少包含一个键名为
state
的条目,用于指示取消操作的最终状态。可能的状态值包括 "成功"、"失败"、"部分成功" 等,具体取决于交易所或平台的实现。
print(f"取消结果: {cancel_result['state']}")
这行代码使用f-string格式化字符串,将取消操作的结果状态打印到控制台。用户可以通过查看控制台输出,确认订单是否已成功取消。
在实际应用中,应该对
cancel_result
进行更详细的错误处理和状态检查。例如,检查是否存在异常,并根据不同的状态采取相应的措施,例如重试取消操作或通知用户。
自动化交易策略示例:简单移动平均线(均线)策略
以下是一个基于移动平均线的简单自动化交易策略示例。该策略通过比较当前价格与过去一段时间内的平均价格来产生交易信号。
- 计算移动平均线: 确定时间周期 N,并计算过去 N 个时间段(例如分钟、小时、天)的收盘价格的平均值。这将作为移动平均线的值。常用的移动平均线包括简单移动平均线 (SMA) 和指数移动平均线 (EMA),后者对最近的价格赋予更高的权重。
-
生成交易信号:
- 买入信号: 如果当前价格高于移动平均线,则产生买入信号。这表明市场可能处于上升趋势。
- 卖出信号: 如果当前价格低于移动平均线,则产生卖出信号。这表明市场可能处于下降趋势。
- 执行交易: 根据生成的交易信号,自动执行买入或卖出操作。交易执行需要连接到交易所的API,并设置相应的订单参数,例如交易数量和价格。
以下是使用 Python 和 Upbit API 实现简单移动平均线策略的示例代码片段:
import requests
def calculate_moving_average(market, count):
"""
计算指定交易对在过去 count 分钟内的简单移动平均价格。
Args:
market (str): 交易对,例如 "KRW-BTC"。
count (int): 用于计算移动平均线的时间段数量。
Returns:
float: 移动平均价格。
"""
url = f"https://api.upbit.com/v1/candles/minutes/1?market={market}&count={count}"
res = requests.get(url)
res.raise_for_status() # 检查请求是否成功
candles = res.()
total = 0
for candle in candles:
total += candle['trade_price']
return total / count
def get_ticker(market):
"""
获取指定交易对的当前价格信息。
Args:
market (str): 交易对,例如 "KRW-BTC"。
Returns:
list: 包含当前价格信息的列表。
"""
url = f"https://api.upbit.com/v1/ticker?markets={market}"
res = requests.get(url)
res.raise_for_status() # 检查请求是否成功
return res.()
N = 20 # 计算过去 20 分钟的移动平均价格
MARKET = "KRW-BTC" # 设置交易对
moving_average = calculate_moving_average(MARKET, N)
current_price = get_ticker(MARKET)[0]['trade_price']
if current_price > moving_average:
print("当前价格高于平均价格,买入")
# place_order(MARKET, "bid", "0.0001", str(current_price), "limit") # 需要实现 place_order 函数
elif current_price < moving_average:
print("当前价格低于平均价格,卖出")
# place_order(MARKET, "ask", "0.0001", str(current_price), "limit") # 需要实现 place_order 函数
else:
print("价格与平均价格相近,观望")
代码解释:
-
calculate_moving_average(market, count)
函数从 Upbit API 获取指定交易对过去 `count` 分钟的 K 线数据,并计算简单移动平均价格。 -
get_ticker(market)
函数从 Upbit API 获取指定交易对的当前价格。 - 代码比较当前价格与移动平均价格,并根据比较结果打印相应的交易信号。
-
注释掉的
place_order
函数代表实际的下单操作,需要根据具体的交易所 API 进行实现。
重要提示:
- 风险管理: 自动化交易存在风险,请务必设置止损和止盈点,控制单笔交易的风险。
- 策略优化: 移动平均线策略有多种变体,例如使用不同时间周期的移动平均线、结合其他技术指标等。您可以根据自己的交易风格和市场情况进行优化。
- 回测: 在实际交易之前,务必使用历史数据对策略进行回测,评估策略的有效性。
- 参数调整: 策略的参数(例如移动平均线的周期 N)需要根据市场情况进行调整。
请注意: 这只是一个演示性的简单示例,实际的自动化交易策略需要更加复杂和精细的考量,包括风险管理、资金管理、交易手续费等因素。你应该根据自己的风险承受能力和投资目标,制定合适的策略,并进行充分的测试。
在使用自动化交易机器人之前,务必进行充分的模拟交易测试和风险评估。 使用模拟账户进行测试,确保你的策略和代码能够正常运行,并且能够产生预期的结果。 密切监控交易机器人的运行状况,并定期检查交易记录,以便及时发现和解决问题。
加密货币市场波动剧烈,密切关注市场变化,及时调整你的策略和参数,以应对不同的市场环境。 了解市场新闻、基本面分析和技术指标,可以帮助你更好地判断市场走势。