CCXT-08-身份验证
1. 交易身份验证
为了能够访问你的账户,通过市价单和限价单执行量化交易,查询余额、充值与提现等等,你需要从每个你希望操作的交易所获取你的API key以进行身份验证。API key是交易所相关的,任何情况下不同交易所的API key彼此都不能互换。 如果提供了正确的API key,交易所会自动进行身份验证。验证过程通常采用以下模式:
- 生成一个新的nonce。nonce是一个整数,通常是以秒或者毫秒计的unix时间戳。 nonce应当是单调递增的,因此没有两个请求会使用相同的nonce值。默认的nonce 是以秒计的unix时间戳。
- 将公开的api key和nonce追加到其他访问端结点参数之后,然后序列化以便进行签名
- 使用HMAC-SHA256/384/512 或 MD5 哈希序列化参数,然后用私钥签名
- 将16进制或base64编码的签名和nonce添加到HTTP头或请求内容中
不同的交易所上述过程可能有所区别。有些交易所可能要求其他编码格式的签名,有些则使用不同的HTTP头参数名和格式,但是基本都是上述模式。 不要在多个线程、进程中同时运行的一个交易所的多个实例之间共享同一个API密钥对, 这可能会导致不可预料的行为。 ccxt已经为你处理了身份验证逻辑,因此你不需要手工进行任何操作,除非你在实现一个新的交易所类,否则为了进行交易,你唯一需要做的就是提供正确的API密钥对。
2. API Key设置
API身份通常包含以下内容:
- apiKey:你的公开的API Key或Token。这部分不是保密的,它包含在你的请求头或请求内容中用来标识你的请求。apiKey通常是一个16进制或base64编码的字符串,或者是一个UUID。
- secret:这是你的私钥,需要秘密保存,不要告诉任何人。私钥用来在本地签名你的请求,然后发送请求给交易所。私钥不能通过互联网发出去,也不应该发布或通过电子邮件传递。 私钥和nonce一起来生成在密码学上足够强的签名,这个签名和你的API key一起用来识别你的身份。每个请求都有唯一的nonce,因此其签名也是唯一的。
- uid:有些交易所也会生成一个较短的用户ID。它可以是字符串或者数字。如果交易所明确地要求,那么你应该设置这个参数。请参考交易所的文档获取详细信息。
- password:有些交易所也要求你在交易时提供密码。如果交易所明确要求,那么你也应该照办。请参考交易所的文档获取详细信息。
你可以在交易所的网站上创建API key,然后拷贝到你的配置文件中。记得正确设置配置文件的权限,不要让其他任何人读取。 记住要保证apiKey和私钥的安全,避免未授权的使用,不要发送或告诉任何人。私钥泄漏会导致你的财产损失。 要创建可以用于交易的exchange对象,只需将API身份信息赋给已有的交易所实例,或者在创建交易所实例时指定。参考以下示例代码。 JavaScript示例代码:
const ccxt = require ('ccxt')
// any time
let kraken = new ccxt.kraken ()
kraken.apiKey = 'YOUR_KRAKEN_API_KEY'
kraken.secret = 'YOUR_KRAKEN_SECRET_KEY'
// upon instantiation
let okcoinusd = new ccxt.okcoinusd ({
apiKey: 'YOUR_OKCOIN_API_KEY',
secret: 'YOUR_OKCOIN_SECRET_KEY',
})
// from variable id
const exchangeId = 'binance'
, exchangeClass = ccxt[exchangeId]
, exchange = new exchangeClass ({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'timeout': 30000,
'enableRateLimit': true,
})
Python示例代码:
import ccxt
# any time
bitfinex = ccxt.bitfinex ()
bitfinex.apiKey = 'YOUR_BFX_API_KEY'
bitfinex.secret = 'YOUR_BFX_SECRET'
# upon instantiation
hitbtc = ccxt.hitbtc ({
'apiKey': 'YOUR_HITBTC_API_KEY',
'secret': 'YOUR_HITBTC_SECRET_KEY',
})
# from variable id
exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'timeout': 30000,
'enableRateLimit': True,
})
PHP示例代码:
include 'ccxt.php'
// any time
$quoinex = new \ccxt\quoinex ();
$quoinex->apiKey = 'YOUR_QUOINE_API_KEY';
$quoinex->secret = 'YOUR_QUOINE_SECRET_KEY';
// upon instantiation
$zaif = new \ccxt\zaif (array (
'apiKey' => 'YOUR_ZAIF_API_KEY',
'secret' => 'YOUR_ZAIF_SECRET_KEY'
));
// from variable id
$exchange_id = 'binance';
$exchange_class = "\\ccxt\\$exchange_id";
$exchange = new $exchange_class (array (
'apiKey' => 'YOUR_API_KEY',
'secret' => 'YOUR_SECRET',
'timeout' => 30000,
'enableRateLimit' => true,
));
注意,如果在交易之前你没有设置API身份信息,那么你的私有API请求可能会失败而抛出异常或错误。 为了避免字符的转移问题,请使用单引号描述你的身份信息,例如’VERY_GOOD'而不是 “VERY_BAD”。