技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证

背景

最近,自己在技术精进方向上有所犹豫,是往"网络渗透"的方向走呢?还是往"量化交易"的方向走?

如果选择精进“网络渗透”,就需要学习各种Web渗透技术、客户端渗透技术、移动环境渗透技术、社会工程学技术等等。随着互联网的深入发展,人们对网络安全的要求也会越来越高,这个领域一定是未来的趋势。况且,学习这些技术也很过瘾,多巴胺分泌旺盛,还能体验电影中黑客的感觉。

可是,对自己来说“网络渗透”属于全新的领域,选择了这个方向就要丢掉以前在机器学习方面的积累。

想来想去,年龄大了,还是走保守的路线吧,选择“量化交易”作为自己今后的技术精进方向。把机器学习中积累的方法应用于量化交易,希望能够在这个领域做出一些东西来啊。

既然选择了“量化交易”方向,就要为运行这些“量化模型”搭建底层框架,于是我封装了 BigOne 交易所为开发者提供的 API


技术分析

BigOne API 的入口如下所示:

技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证

由于篇幅的限制,今天先来介绍“身份验证”部分,后面再来介绍订单系统和资产查询部分。

要想使用 BigOne API 需要到 BigOne 交易所申请 API KeyAPI Secret

  • API Key:是网站提供 API 功能的验证参数。
  • API Secret:是加密通讯数据的**,用于生成验证身份的令牌。

技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证

为了防止别人重复使用请求参数,确保请求的唯一性,在生成身份令牌算法中加入了时间戳 nonce 参数,该 nonce 和当前时间戳之间的间隔不能超过30秒,即这个令牌的有效期为30秒。

技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证

生成身份令牌需要 JSON Web Token,可到 https://jwt.io 上查看详细信息。该网站提供了 .netptythonnode.jsjavajavascriptperlruby等语言的使用案例。

我使用的是.net环境,在 https://github.com/dvsekhvalnov/jose-jwt 上可以下载。

在使用的时候添加以下语句即可。

using Jose;

BigOne 也提供了获取服务器端当前时间戳的API,如下图所示:

技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证


代码实现

Step1:获取身份认证的参数。

构造接收 时间戳 的类型 Ping

public class Ping
{
    public string timestamp;
}

获取时间戳的函数 GetTimestamp

private string ApiEntryPoint = "https://big.one/api/v2/";

private static long GetTimestamp()
{
    string url = ApiEntryPoint + "ping";
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    try
    {
        IHtmlDocument document = new JumonyParser().LoadDocument(url);
        List<IHtmlNode> nos = document.Nodes().ToList();
        string str = nos[0].ToString();
        StringReader sr = new StringReader(str);
        JsonTextReader jsonReader = new JsonTextReader(sr);
        JsonSerializer serializer = new JsonSerializer();
        Ping one = serializer.Deserialize<Ping>(jsonReader);
        return Convert.long(one.timestamp);
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

Step2:获取验证身份的令牌。

private static string GetToken()
{
    Int64 timestamp = GetTimestamp();
    IDictionary<string, object> payload = new Dictionary<string, object>()
    {
        {"type", "OpenAPI"},
        {"sub", ApiKey},
        {"nonce", timestamp}
    };
    
    //这里的 ApiSecret 从 BigOne 申请获取。
    byte[] secretKey = Encoding.Default.GetBytes(ApiSecret);
    string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256);
    return token;
}

Header 中需要 typesubnonce三个参数,subAPI Key,从 Bigone 申请获取,nonce 是服务器的当前UNIX时间戳,可以通过 Step1 来获取。

Step3:获取身份令牌的例子。

我们对 subnonceApiSecret 赋值如下:

string ApiKey = "cee88ab0bc69435784b7db0545e85647";
string ApiSecret = “testsecret”;
long timestamp = 1527665262168391000;

可以得到如下的 token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiT3BlbkFQSSIsInN1YiI6ImNlZTg4YWIwYmM2OTQzNTc4NGI3ZGIwNTQ1ZTg1NjQ3Iiwibm9uY2UiOjE1Mjc2NjUyNjIxNjgzOTEwMDB9.YNpae4v_-OU7h2sknRPa3XPhDcC3p-To1WxbWV4Vpro

Step4:使用身份令牌的方法。

技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证

BigONE Developer API V2 的文档中,我们可以看到在进行网络请求时,header 部分需要加入 Authentication 属性以及对应取值 "Bearer " + token


总结

本篇图文介绍了如何使用 BigONE Developer API V2 来获取身份令牌的方法。一旦获取了身份令牌,我们就可以在网络请求的 header 中加入令牌来获取自己的账户数据,创建买入创建订单、卖出删除订单,查询订单状态等,为自己的自动化交易系统搭建底层基础。

好了今天就到这里吧!如果你对自动化交易感兴趣,我们可以一起来精进技术,完善这个系统。


相关图文