Gemini REST API 开发指南:专家教你轻松玩转 Gemini 交易平台!
Gemini REST API 文档解读
Gemini 是一家备受信赖的加密货币交易所,提供强大的 REST API 供开发者访问市场数据、管理账户和执行交易。本文将深入解读 Gemini REST API 文档,帮助开发者快速上手并充分利用其功能。
1. 概述
Gemini REST API 提供了一套完整的接口,允许开发者和交易者通过标准的 HTTP 请求与 Gemini 数字资产交易所进行交互。 这意味着你可以使用任何支持 HTTP 协议的编程语言或工具来访问 Gemini 交易所的功能,例如获取市场数据、下单、管理账户资金等。
该 API 采用 REST (Representational State Transfer) 架构风格,这意味着它基于资源的概念,并通过标准的 HTTP 方法(如 GET、POST、PUT、DELETE)来操作这些资源。 GET 方法用于检索信息,POST 方法用于创建新的资源或执行操作,PUT 方法用于更新已存在的资源,而 DELETE 方法用于删除资源。
数据交换格式主要采用 JSON (JavaScript Object Notation)。 JSON 是一种轻量级的数据交换格式,易于阅读和解析,已被广泛应用于 Web API 开发中。 Gemini REST API 返回的所有数据都以 JSON 格式呈现,并且你需要以 JSON 格式发送请求数据。
主要功能包括:
- 市场数据: 获取实时加密货币市场行情,包括但不限于当前价格、24小时价格变动、成交量、最高价、最低价等关键指标。提供详细的交易历史数据,用户可以分析过往的价格波动趋势,辅助决策。支持访问深度订单簿信息,了解市场买卖力量分布情况,为更精准的交易提供依据。
- 账户管理: 便捷地查询账户余额,涵盖各种加密货币资产的持有情况。全面展示交易历史记录,包括买入、卖出、充值、提现等所有操作明细。允许用户创建和管理API密钥,方便通过程序化方式进行交易和数据分析,同时支持密钥权限控制,保障账户安全。
- 交易: 提供完善的交易功能,支持限价单、市价单等多种订单类型,满足不同交易策略的需求。允许用户随时取消未成交的订单,灵活调整交易计划。实时查询订单状态,包括已提交、部分成交、完全成交、已取消等状态信息,确保用户随时掌握交易进度。
2. 认证
访问 Gemini API 必须通过 API 密钥进行身份验证。 API 密钥由两部分组成:API 公钥 (API Key) 和 API 私钥 (API Secret)。
API 公钥用于标识您的应用程序或账户,可以公开分享,但 API 私钥必须严格保密。 私钥的作用类似于密码,用于签署您的 API 请求,确保请求的真实性和完整性。 泄露私钥会导致未经授权的访问和潜在的安全风险。
在使用 API 密钥之前,您需要在 Gemini 交易所平台上创建并激活密钥。 创建密钥时,您可以设置相应的权限,例如交易、提现或查询账户信息,以控制密钥可以执行的操作范围。 建议根据实际需求授予最小权限,降低安全风险。
请务必妥善保管您的 API 密钥。 不要将密钥硬编码到您的应用程序中,也不要将其存储在版本控制系统中。 推荐使用环境变量或专门的密钥管理工具来安全地存储和访问您的 API 密钥。
为了进一步提高安全性, Gemini API 还支持 IP 地址白名单功能。 您可以限制 API 密钥只能从特定的 IP 地址访问,从而防止未经授权的访问。
如何获取 Gemini API 密钥:
- 登录 Gemini 账户。 前往 Gemini 官方网站,使用您的用户名和密码安全地登录您的账户。如果尚未拥有账户,您需要先注册并完成身份验证流程。
- 进入 API 设置页面。 登录成功后,在账户设置或个人资料区域寻找 "API" 或 "API 密钥" 相关的选项。通常,这会在一个开发者专区或安全设置页面中。
- 创建新的 API 密钥。 点击 "创建新密钥" 或类似按钮开始生成新的 API 密钥对。您可能需要验证您的身份,例如通过双重验证 (2FA) 或电子邮件确认。
- 设置 API 密钥的权限。 为您的 API 密钥配置适当的权限是至关重要的。Gemini 允许您精细控制密钥可以执行的操作。根据您的需求,选择 "仅读取" (只允许获取市场数据)、"交易" (允许下单和管理订单)、"提款" (允许提款资金) 等权限。请注意,授予过高的权限可能会带来安全风险,因此请务必谨慎选择。 强烈建议遵循最小权限原则,仅授予密钥完成任务所需的最低权限。
- 安全地存储 API 公钥和 API 私钥。 成功创建 API 密钥后,您将获得一个 API 公钥和一个 API 私钥。 务必将私钥安全地存储起来,就像对待您的密码一样。 切勿将私钥泄露给任何人,也不要将其存储在不安全的地方,例如公共代码库或未加密的文本文件中。 使用密码管理器或硬件钱包等安全工具来保护您的私钥。公钥可以公开使用,但仍然要谨慎对待。 如果您的私钥泄露,请立即撤销该密钥并生成新的密钥对。
请求签名:
为了确保通过 API 接口发送的请求的安全性与完整性,防止恶意篡改,所有请求都需要进行签名。签名过程旨在验证请求的来源并确保数据在传输过程中未被更改。以下是详细的签名步骤:
-
构建请求参数 JSON 对象:
你需要创建一个包含所有请求参数的 JSON (JavaScript Object Notation) 对象。确保所有参数都以键值对的形式正确地包含在这个 JSON 对象中。参数的顺序并不重要,但键名的大小写必须与 API 文档中指定的完全一致。例如:
这个 JSON 对象将成为后续签名过程的数据基础。{ "symbol": "BTCUSD", "limit_order": "true", "amount": "0.01", "price": "50000" }
-
Base64 编码:
接下来,对上一步创建的 JSON 对象进行 Base64 编码。Base64 是一种常用的编码方式,用于将任意二进制数据转换为 ASCII 字符串。许多编程语言都提供了 Base64 编码的库或函数。编码后的字符串将只包含 ASCII 字符,方便在 HTTP 请求头中传输。确保使用标准 Base64 编码,避免使用 URL 安全的 Base64 变体。
// 示例 (实际编码结果会更长) {"symbol":"BTCUSD","limit_order":"true","amount":"0.01","price":"50000"} -> eyAiU3ltYm9sIjogIkJUQ1VTRCIsICJsaW1pdF9vcmRlciI6ICJ0cnVlIiwgImFtb3VudCI6ICIwLjAxIiwgInByaWNlIjogIjUwMDAwIn0=
-
HMAC-SHA384 加密:
使用你的 API 私钥 (Secret Key) 对 Base64 编码后的字符串进行 HMAC-SHA384 加密。HMAC (Hash-based Message Authentication Code) 是一种使用密码散列函数构造消息认证码的方法,可以有效防止数据篡改。SHA384 是一种安全散列算法,用于生成消息的哈希值。使用你的私钥作为密钥,Base64 编码后的 JSON 字符串作为消息,进行 HMAC-SHA384 加密。不同的编程语言有不同的库可以实现 HMAC-SHA384 加密。务必确保私钥的安全,不要泄露给任何人。
// 示例 (实际加密结果会更长,且与私钥有关) HMAC-SHA384(secret_key, eyAiU3ltYm9sIjogIkJUQ1VTRCIsICJsaW1pdF9vcmRlciI6ICJ0cnVlIiwgImFtb3VudCI6ICIwLjAxIiwgInByaWNlIjogIjUwMDAwIn0=) -> aBcDeFgHiJkLmNoPqRsTuVwXyZ...
-
发送签名:
将加密后的结果作为请求头
X-GEMINI-SIGNATURE
的值发送到 API 服务器。确保请求头名称正确,且加密后的签名值没有经过任何修改。API 服务器会使用你的公钥和接收到的签名来验证请求的有效性。如果签名验证失败,服务器将拒绝该请求。X-GEMINI-SIGNATURE: aBcDeFgHiJkLmNoPqRsTuVwXyZ...
请求头:
为了保证 API 请求的安全性与正确性,除了
X-GEMINI-SIGNATURE
签名头之外,以下必需的 HTTP 请求头必须包含在您的请求中:
-
X-GEMINI-APIKEY
: 您的 Gemini API 公钥。 这用于标识发起请求的用户。 请确保妥善保管您的私钥,避免泄露。 公钥通常与对应的私钥一同生成,用于验证签名的合法性。 -
X-GEMINI-PAYLOAD
: 经过 Base64 编码后的 JSON 对象。 这个 JSON 对象包含了请求体的内容,例如交易参数,订单信息等。 编码确保了二进制数据能够安全地通过 HTTP 协议传输,并且可以被服务器正确解析。 在发送请求之前,需要将JSON对象序列化为字符串,然后进行Base64编码。 -
Content-Type
: 指定请求体的 MIME 类型,对于 Gemini API 来说,必须设置为application/
。 这告知服务器请求体中的数据是 JSON 格式,以便服务器能够正确解析请求体。 错误的 Content-Type 可能导致服务器无法正确处理请求,导致API调用失败。
3. 市场数据 API
Gemini 提供全面的市场数据 API,旨在帮助开发者和交易者获取实时、历史及聚合的市场信息,以便进行策略开发、风险管理和市场分析。这些 API 涵盖了多个维度的数据,并允许用户以不同的频率和粒度访问信息。
主要功能包括:
- 实时报价 (Real-time Ticker): 获取特定交易对的最新价格、成交量、最高价和最低价等关键指标,为高频交易和实时监控提供数据支持。
- 历史数据 (Historical Data): 下载特定时间范围内的交易数据,包括K线图数据 (OHLCV - 开盘价、最高价、最低价、收盘价、成交量),用于回溯测试、算法优化和趋势分析。支持不同的时间周期,例如1分钟、5分钟、1小时、1天等。
- 订单簿 (Order Book): 实时访问买单和卖单的深度信息,了解市场供需情况和流动性分布。订单簿数据对于执行大额交易和评估市场冲击至关重要。
- 交易历史 (Trade History): 获取已执行的交易记录,包括交易时间、价格和数量,用于市场微观结构分析和交易行为研究。
- 蜡烛图数据 (Candlestick Data / OHLCV): 获取指定时间间隔内的开盘价、最高价、最低价、收盘价和成交量数据。 这些数据通常用于技术分析,以识别价格模式和潜在的交易机会。
- 指数价格 (Index Prices): 获取 Gemini 提供的加密货币指数的价格信息,用于衡量市场整体表现和构建多元化投资组合。
Gemini 的市场数据 API 遵循 RESTful 架构,易于集成和使用。开发者可以使用各种编程语言 (如 Python, Java, JavaScript) 通过 HTTP 请求访问 API。为了确保数据安全和防止滥用,API 访问可能需要身份验证和速率限制。
常用 API 端点:
-
/v1/pubticker/{symbol}
: 获取指定交易对的实时行情数据,包括但不限于最新成交价格、成交量、最高价、最低价、24小时价格变动等关键交易指标。此端点是了解市场动态的快速入口。
-
symbol
: 交易对标识符,指定要查询的交易市场。例如,btcusd
代表比特币与美元的交易对,ethbtc
代表以太坊与比特币的交易对。支持的交易对取决于交易所。
-
- /v1/symbols : 获取交易所支持的所有可交易交易对的详细列表,包括交易对的名称、基础货币、报价货币以及其他相关的交易规则和限制信息。是程序化交易和数据分析的基础。
-
/v1/trades/{symbol}
: 获取特定交易对的交易历史数据,提供历史成交记录,可用于分析市场趋势、计算移动平均线等技术指标。
-
symbol
: 交易对标识符,指定要查询交易历史的交易市场。例如,btcusd
。 -
可选参数:
limit_trades
(整数): 限制返回的交易记录数量,允许用户自定义每次请求返回的最大交易笔数。该参数可以控制API响应的数据量,避免一次性返回过多数据。 -
可选参数:
timestamp
(Unix 时间戳): 返回指定时间戳之后的交易记录,用于增量式地获取交易数据,避免重复拉取已有的数据。时间戳通常以秒为单位。
-
-
/v1/orderbook/{symbol}
: 获取特定交易对的实时订单簿信息,展示当前市场上买单(bid)和卖单(ask)的挂单价格和数量。订单簿的深度对于评估市场流动性和预测价格波动至关重要。
-
symbol
: 交易对标识符,指定要查询订单簿的交易市场。例如,btcusd
。 -
可选参数:
limit_bids
(整数): 限制返回的买单数量,控制订单簿中买单的深度。 -
可选参数:
limit_asks
(整数): 限制返回的卖单数量,控制订单簿中卖单的深度。
-
-
/v1/auction/{symbol}
: 获取特定交易对的拍卖相关信息,适用于采用拍卖机制进行交易的交易所。 提供有关当前拍卖状态、价格和剩余时间等信息。
-
symbol
: 交易对标识符,指定要查询拍卖信息的交易市场。例如,btcusd
。
-
-
/v1/auction/{symbol}/history
: 获取特定交易对的拍卖历史记录,包括历史拍卖的价格、成交量和时间等数据。 通过分析历史拍卖数据,可以了解市场的价格发现机制和参与者行为。
-
symbol
: 交易对标识符,指定要查询拍卖历史的交易市场。例如,btcusd
。
-
示例:
以下是一个使用
curl
命令行工具从 Gemini 交易所获取 BTCUSD (比特币/美元) 交易对最新交易信息的示例。 Gemini API 提供公开市场数据,允许开发者无需身份验证即可获取实时价格信息。
命令详解:
-
curl
: 一个强大的命令行工具,用于向服务器发送 HTTP 请求。在本例中,它用于从 Gemini 的 API 端点请求数据。 -
https://api.gemini.com/v1/pubticker/btcusd
: Gemini 交易所提供的公开 API 端点,专门用于获取 BTCUSD 交易对的最新 ticker 信息。/v1/pubticker/
部分表示 API 的版本和请求的资源类型,btcusd
指定了交易对。
执行命令:
curl https://api.gemini.com/v1/pubticker/btcusd
预期响应:
执行上述命令后,您将收到一个 JSON 格式的响应,其中包含 BTCUSD 交易对的最新信息,例如:
{
"ask": "27000.00",
"bid": "26999.50",
"last": "26999.75",
"volume": {
"BTC": "120.5",
"USD": "3253350.00"
},
"timestamp": 1678886400
}
响应字段说明:
-
ask
: 卖方报价 (即,您可以购买 BTC 的最低价格)。 -
bid
: 买方报价 (即,您可以出售 BTC 的最高价格)。 -
last
: 最近一次成交的价格。 -
volume
: 交易量,包括 BTC 和 USD 的交易量。 -
timestamp
: 数据的时间戳 (Unix 时间戳)。
注意:
- Gemini API 的具体参数和响应格式可能会发生变化,请务必参考 Gemini 官方 API 文档获取最新信息。
- 此示例仅用于演示如何获取公开市场数据。 涉及交易操作时,请务必使用 Gemini 提供的安全 API,并妥善保管您的 API 密钥。
4. 账户管理 API
账户管理 API 提供了一系列接口,允许开发者安全有效地查询用户账户的关键信息,包括但不限于账户余额、可用余额、冻结金额等。通过这些接口,开发者可以深入了解用户的资产状况,从而构建更加完善的应用和服务。
该 API 还支持获取详细的交易历史记录。开发者可以根据需要,筛选特定时间段内的交易数据,例如充值记录、提现记录、交易明细等。这些交易历史数据对于用户行为分析、风险控制以及合规性审查至关重要。每笔交易记录通常包含交易时间、交易类型、交易金额、交易状态、交易哈希等详细信息,方便开发者进行追溯和分析。
为了确保账户安全,账户管理 API 通常会采用严格的身份验证和授权机制,例如 API 密钥、OAuth 2.0 等。开发者需要正确配置和使用这些安全机制,以防止未经授权的访问和数据泄露。API 还会提供速率限制和并发控制等功能,以防止恶意攻击和滥用。
开发者在使用账户管理 API 时,应充分了解平台的 API 文档和使用规范,并根据实际需求选择合适的接口和参数。同时,应注意保护用户的隐私数据,避免将敏感信息泄露给第三方。 合规性也是需要考虑的重要因素,开发者需要确保其应用符合相关法律法规的要求,例如 KYC/AML 等。
常用 API 端点:
- /v1/balances : 获取账户余额。该接口允许用户查询其账户中各种加密货币的余额信息,包括可用余额、冻结余额等。返回数据通常包含币种类型 (例如 BTC, ETH, USDT) 和对应的余额数值。
- /v1/orders : 获取所有活跃订单。通过此接口,用户可以查看当前挂单状态,例如挂单价格、数量、订单类型(限价单、市价单)以及订单创建时间等。这有助于用户监控其交易策略的执行情况。
-
/v1/order/status
: 获取特定订单的状态。
-
order_id
: 订单 ID。这是必选参数,用于指定要查询的订单。返回信息包括订单状态 (例如 pending, open, filled, canceled, rejected)、已成交数量、平均成交价格以及手续费等详细信息。
-
-
/v1/mytrades
: 获取账户的交易历史。此接口提供账户的成交记录,方便用户进行交易分析和税务计算。
-
symbol
: 交易对,例如btcusd
。指定要查询的交易对,例如比特币/美元。 -
可选参数:
limit_trades
(最多返回的交易数量)。用于限制返回的交易记录数量,默认为平台设定的最大值。 -
可选参数:
timestamp
(返回此时间戳之后的交易)。用于筛选指定时间戳之后的交易记录,便于用户按时间范围查询。
-
- /v1/transfers : 获取账户的转账记录。该接口提供账户的充值和提现记录,包括转账金额、币种类型、交易哈希、转账状态(例如 pending, completed, failed)以及转账时间等。
示例: 获取 Gemini 账户余额 (Python)
以下示例展示了如何使用 Python 编程语言,通过 Gemini API 获取账户余额。 这涉及生成认证签名、构造请求头以及处理 API 响应。
确保您已安装必要的 Python 库:
requests
用于发送 HTTP 请求,
hashlib
、
hmac
用于生成安全签名,
base64
用于编码数据,以及
用于处理 JSON 数据。
import requests
import hashlib
import hmac
import base64
import
import time
# 请务必替换为您的真实 API 密钥和密钥
API_KEY = "YOUR_API_KEY"
API_SECRET = "YOUR_API_SECRET"
以上代码段导入所需的 Python 库,并定义了两个重要的常量:
API_KEY
和
API_SECRET
。 务必将这些占位符替换为您从 Gemini 交易所获得的真实 API 密钥和密钥。
接下来,定义一个名为
get_balances()
的函数,该函数负责与 Gemini API 交互并检索账户余额信息。
def get_balances():
# API 端点
endpoint = "/v1/balances"
url = "https://api.gemini.com" + endpoint
# 生成 nonce (时间戳)
t = time.time()
payload_object = {
"request": endpoint,
"nonce": str(int(t*1000)) # 毫秒级时间戳
}
# 将 payload 对象转换为 JSON 字符串并进行 base64 编码
payload_string = .dumps(payload_object)
payload_encoded = base64.b64encode(payload_string.encode())
# 使用 API 密钥和编码后的 payload 生成 HMAC-SHA384 签名
signature = hmac.new(API_SECRET.encode(), payload_encoded, hashlib.sha384).hexdigest()
# 构建 HTTP 请求头
headers = {
'Content-Type': "application/",
'X-GEMINI-APIKEY': API_KEY,
'X-GEMINI-PAYLOAD': payload_encoded.decode(), # payload必须是字符串
'X-GEMINI-SIGNATURE': signature
}
# 发送 POST 请求到 Gemini API
r = requests.post(url, headers=headers)
# 检查响应状态码
if r.status_code == 200:
# 返回 JSON 响应
return r.()
else:
# 处理错误情况
print(f"API 请求失败,状态码: {r.status_code}")
print(r.text) # 打印错误信息
return None
该函数首先定义 API 端点和完整的 API URL。 然后,它创建一个包含 API 端点和 nonce (时间戳) 的 payload 对象。 nonce 用于防止重放攻击。 payload 对象被序列化为 JSON 字符串,然后进行 base64 编码。 接下来,使用 API 密钥和编码后的 payload 生成 HMAC-SHA384 签名。 此签名用于验证请求的真实性。 构建包含 API 密钥、编码后的 payload 和签名的 HTTP 请求头。 使用
requests.post()
函数将 POST 请求发送到 Gemini API。 函数会检查响应状态码,如果状态码为 200 (OK),则返回 JSON 响应。 否则,它会打印错误消息并返回
None
。
调用
get_balances()
函数并打印结果。
balances = get_balances()
if balances:
print(balances)
这段代码调用
get_balances()
函数,如果成功获取到余额信息,则打印到控制台。 如果
get_balances()
返回
None
(表示 API 请求失败),则不会打印任何内容。
安全提示: 请务必安全地存储您的 API 密钥和密钥。 不要将它们提交到版本控制系统或与他人共享。
注意: 请将YOUR_API_KEY
和 YOUR_API_SECRET
替换为您的实际 API 密钥。
5. 交易 API
交易 API 是连接您的应用程序与加密货币交易所的核心桥梁,它允许开发者执行一系列关键交易操作。通过此 API,您可以实现自动化的加密货币交易策略,并无缝集成到您的应用程序中。
主要功能包括:
- 下单: 提交限价单、市价单等不同类型的订单,指定交易对、数量、价格等参数。
- 取消订单: 撤销尚未成交的订单,以便根据市场变化调整交易策略。
- 查询订单状态: 实时监控订单的执行情况,获取订单状态(例如:待成交、部分成交、完全成交、已取消)以及成交明细。
- 获取账户余额: 查询账户中各种加密货币的可用余额和冻结余额,为交易决策提供数据支持。
- 批量操作: 一些交易所的 API 支持批量下单、取消订单等操作,提高交易效率。
使用交易 API 需要注意安全性和风控,务必采取必要的安全措施,例如:API 密钥管理、IP 地址白名单、交易额度限制等,以防止未经授权的访问和潜在的风险。
不同的交易所可能提供不同的交易 API 接口和参数,开发者需要仔细阅读交易所的 API 文档,并进行充分的测试,确保交易逻辑的正确性和稳定性。
常用 API 端点:
-
/v1/order/new
: 创建新订单。此端点允许用户提交买入或卖出指令,并在交易所挂单或立即成交。
-
symbol
: 交易对,指定进行交易的资产对,例如btcusd
(比特币/美元)。这是进行交易的关键参数,必须准确指定。 -
amount
: 交易数量,表示您希望买入或卖出的资产数量。数量的单位取决于交易对,例如,在btcusd
交易对中,数量通常以比特币 (BTC) 为单位。 -
price
: 订单价格,只有在限价订单 (limit
或exchange limit
) 中才需要指定。此价格表示您愿意买入或卖出的最高或最低价格。对于市价订单,此参数将被忽略。 -
side
: 买入或卖出方向(buy
或sell
)。buy
表示您希望买入指定的资产,sell
表示您希望卖出已持有的资产。 -
type
: 订单类型,支持以下几种类型:-
exchange limit
: 交易所限价单,订单会在交易所挂单,只有当市场价格达到指定价格时才会成交。订单会进入交易所的订单簿。 -
exchange market
: 交易所市价单,订单会立即以市场上最优价格成交。可能会产生滑点。 -
limit
: 限价单,与exchange limit
类似,但可能由特定的做市商或交易平台处理。 -
market
: 市价单,与exchange market
类似,会立即以市场上最优价格成交。
-
-
可选参数:
client_order_id
(客户端自定义订单 ID)。允许用户为订单指定一个唯一的 ID,方便在客户端进行订单管理和跟踪。此 ID 不会影响订单的执行,仅用于客户端识别。
-
-
/v1/order/cancel
: 取消指定订单。允许用户取消尚未成交的订单。
-
order_id
: 要取消的订单的唯一标识符。必须提供有效的订单 ID 才能成功取消订单。
-
- /v1/order/cancel/session : 取消当前会话的所有未成交订单。此端点允许用户一次性取消所有通过当前 API 会话提交的订单。适用于快速撤销所有未成交订单的场景。
- /v1/order/cancel/all : 取消所有未成交订单,无论订单通过哪个 API 会话提交。这是一个全局取消订单的端点,会取消用户账户下的所有未成交订单。使用时需谨慎,确保理解其影响。
示例: 使用 Python 进行交易下单
以下代码示例展示了如何使用 Python 通过 Gemini 交易所的 API 进行交易下单。 请注意,此示例仅供参考,实际应用中需要进行错误处理、参数验证以及更完善的安全措施。
需要安装必要的 Python 库:
requests
用于发送 HTTP 请求,
hashlib
和
hmac
用于生成 API 签名,以及
用于处理 JSON 数据。
pip install requests
代码如下:
import requests
import hashlib
import hmac
import base64
import
import time
# 替换为你的 API 密钥和私钥
API_KEY = "YOUR_API_KEY"
API_SECRET = "YOUR_API_SECRET"
def new_order(symbol, amount, price, side, order_type):
"""
向 Gemini 交易所提交新的订单。
参数:
symbol (str): 交易对,例如 "btcusd"。
amount (str): 订单数量,例如 "0.001"。
price (str): 订单价格,例如 "30000"。
side (str): 订单方向,"buy" 或 "sell"。
order_type (str): 订单类型,例如 "exchange limit" 或 "exchange market"。
返回值:
dict: Gemini API 返回的 JSON 响应。
"""
endpoint = "/v1/order/new"
url = "https://api.gemini.com" + endpoint
nonce = str(int(time.time() * 1000)) # 使用毫秒级时间戳作为 nonce
payload_object = {
"request": endpoint,
"nonce": nonce,
"symbol": symbol,
"amount": amount,
"price": price,
"side": side,
"type": order_type
}
payload_string = .dumps(payload_object)
payload_encoded = base64.b64encode(payload_string.encode('utf-8')) # 确保使用 UTF-8 编码
signature = hmac.new(API_SECRET.encode('utf-8'), payload_encoded, hashlib.sha384).hexdigest() # 确保使用 UTF-8 编码
headers = {
'Content-Type': "application/",
'X-GEMINI-APIKEY': API_KEY,
'X-GEMINI-PAYLOAD': payload_encoded.decode('utf-8'), # 确保 payload 是字符串类型
'X-GEMINI-SIGNATURE': signature
}
try:
r = requests.post(url, headers=headers)
r.raise_for_status() # 检查 HTTP 状态码,如果不是 200 则抛出异常
return r.()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
except .JSONDecodeError as e:
print(f"JSON 解析失败: {e}")
print(f"响应内容: {r.text}") # 打印原始响应内容进行调试
return None
# 示例调用
order = new_order("btcusd", "0.001", "30000", "buy", "exchange limit")
if order:
print(order)
else:
print("下单失败")
重要安全提示:
-
请务必将
API_KEY
和API_SECRET
替换为你自己的实际密钥。 - 切勿将你的 API 密钥和私钥泄露给他人。
- 建议使用环境变量或配置文件安全地存储你的 API 密钥和私钥。
- 在生产环境中,请添加适当的错误处理和日志记录机制。
- 注意交易所的 API 使用限制,避免过于频繁的请求。
代码解释:
-
API 密钥和私钥:
API_KEY
和API_SECRET
是你在 Gemini 交易所获得的用于身份验证的凭证。 -
nonce:
nonce
是一个唯一的随机数,用于防止重放攻击。 在此示例中,我们使用毫秒级的时间戳作为nonce
。 -
payload:
payload
是包含订单信息的 JSON 对象。 它需要进行 Base64 编码。 -
签名:
signature
是使用你的私钥对编码后的payload
进行 HMAC-SHA384 哈希计算生成的。 它用于验证请求的完整性和真实性。 -
headers:
headers
包含请求的元数据,包括 API 密钥、编码后的payload
和签名。 -
requests.post:
requests.post
函数用于向 Gemini API 发送 POST 请求。 - 错误处理: 代码中包含了基本的错误处理,可以捕获请求失败和 JSON 解析失败等异常。
请参考 Gemini 交易所的官方 API 文档获取更详细的信息,并根据你的实际需求进行修改。
注意: 请将YOUR_API_KEY
和 YOUR_API_SECRET
替换为您的实际 API 密钥,并根据实际情况修改订单参数。
6. 速率限制
Gemini API 采用速率限制机制,旨在防止恶意滥用行为,同时确保整个交易平台的稳定性和可靠性。速率限制主要依据每个API密钥在特定时间段内发出的请求数量进行控制,不同API端点可能拥有不同的速率限制策略。
务必查阅最新的Gemini API官方文档,以便获取最准确、最详细的速率限制信息。 这些信息包括但不限于每个API端点的具体限制、时间窗口大小、以及如何处理超过限制的情况。 请根据文档中的指导,合理设计和调整您的应用程序的请求频率,避免超出限制。
一旦应用程序超过了API的速率限制,后续请求将会被服务器拒绝,并可能返回相应的错误代码(例如429 Too Many Requests)。 为了避免这种情况,开发者应当实现重试机制,并采用指数退避算法,在请求被拒绝后,等待逐渐增加的时间间隔后再次尝试发送请求,从而降低对服务器的压力,并提高应用程序的健壮性。 还可以考虑使用缓存技术,将常用的数据缓存到本地,从而减少对API的请求次数。
7. 错误处理
Gemini API 利用标准的 HTTP 状态码体系,清晰地反映 API 请求的执行结果,便于开发者快速定位问题。下文列举了常见的状态码及其含义,以便进行错误调试和异常处理:
- 200 OK: 请求成功。表示服务器已成功接收、处理并返回了请求的数据。这是最理想的状态,表明一切运行正常。
- 400 Bad Request: 客户端发出的请求格式错误或包含无效参数。这通常意味着请求体中的数据类型不符合API的规范,或者缺少必要的参数。开发者应仔细检查请求参数的拼写、数据类型和取值范围。
- 401 Unauthorized: 客户端尝试访问受保护的资源,但未提供有效的身份验证凭据。这通常表示 API 密钥缺失、无效或已过期。务必确认 API 密钥已正确配置,且账户拥有访问该资源的权限。
- 403 Forbidden: 客户端已通过身份验证,但没有权限访问所请求的资源。这表示即使身份验证成功,账户也可能由于权限限制而无法执行某些操作。请检查 API 密钥是否具备所需的权限,或者联系 Gemini 支持以获取更多授权。
- 429 Too Many Requests: 客户端在单位时间内发送的请求过多,超过了 API 的速率限制。为了保证API的稳定性和可用性,Gemini 对请求频率进行了限制。开发者应实施速率限制策略,例如使用指数退避算法进行重试,以避免触发此错误。
- 500 Internal Server Error: 服务器在处理请求时遇到了未知的内部错误。这通常是服务器端的问题,开发者无法直接解决。建议稍后重试请求,如果问题持续存在,请联系 Gemini 支持团队。
当 API 请求失败时,服务器通常会返回一个包含详细错误信息的 JSON 对象。该对象通常包含
error_code
和
error_message
字段,分别表示错误代码和错误描述。强烈建议您在应用程序中实现完善的错误处理机制,以便能够捕获和解析 API 响应中的错误信息,并根据不同的错误类型采取相应的措施,例如记录错误日志、向用户显示友好的错误提示或自动重试请求。通过有效的错误处理,可以显著提高应用程序的健壮性和用户体验。
8. WebSocket API
除了 REST API 之外,Gemini 还提供了 WebSocket API,以便用户能够近乎实时地接收市场数据更新以及账户信息的变动。相较于REST API,WebSocket API 的优势在于其显著降低的数据延迟,这使得它成为对数据时效性有较高要求的应用程序的理想选择。例如,高频交易机器人、实时行情监控系统以及其他需要快速响应市场变化的自动化交易策略,都可以利用 WebSocket API 实现更高效的运作。
通过 WebSocket API,开发者可以订阅特定的市场行情频道,例如特定交易对的最新成交价、订单簿深度信息以及交易量等数据。当这些数据发生变化时,Gemini 服务器会主动将更新推送给客户端,避免了客户端频繁轮询服务器带来的资源浪费和延迟。账户更新频道则允许用户实时监控账户余额、订单状态和交易历史等信息,从而更好地进行风险控制和账户管理。
WebSocket API 的使用方法相对于 REST API 而言,涉及更多的技术细节和配置。开发者需要建立 WebSocket 连接、进行身份验证、订阅相关频道,并编写代码来处理接收到的数据。因此,建议开发者在使用 WebSocket API 之前,仔细查阅 Gemini 官方文档,深入了解其工作原理、数据格式和使用限制。Gemini 官方文档通常会提供详细的示例代码和 API 参考,帮助开发者快速上手。
开发者还需要考虑 WebSocket 连接的稳定性和容错性。由于网络环境的复杂性,WebSocket 连接可能会出现中断或异常情况。因此,需要在代码中实现自动重连机制,以及对接收到的数据进行校验和错误处理,以确保应用程序的可靠性。 Gemini 官方文档也会提供关于连接管理和错误处理的最佳实践建议。
发布于:2025-03-15,除非注明,否则均为
原创文章,转载请注明出处。