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”。