技术图文:如何利用BigOne的API制作自动化交易系统 -- 订单系统

背景

前面几天,我们一起封装了 BigONE 提供的身份验证与资产账户部分的 API

现在,离搭建咱们的自动化交易系统更近一步了。

本次,大家一起来封装有关订单的 API


技术分析

BigOne 的订单系统包括:<u>创建订单、取消指定订单、取消所有订单、获取指定订单、获取全部订单等</u>,对应的 API 说明如下:

创建订单的 API:

create order

取消指定订单的 API:

cancle order

取消所有订单的 API:

cancle all orders

获取指定订单的 API:

get one order

获取全部订单的 API:

get all order
get all order

代码实现

Step1 对创建订单 API 的封装

<u>构造创建订单的参数结构 OrderCreate</u>。

public class OrderCreate
{
    /// <summary>
    /// market id,EOS-BTC
    /// </summary>
    public string market_id { get; set; }
    /// <summary>
    /// order side  one of "ASK"/"BID"
    /// </summary>
    public string side { get; set; }
    /// <summary>
    /// order price string
    /// </summary>
    public string price { get; set; }
    /// <summary>
    /// order amount    string, must larger than 0
    /// </summary>
    public string amount { get; set; }
}

<u>构造接收“创建订单”返回的数据结构 OrderResponse</u>。

order
public class OrderResponseData
{
    public string updated_at { get; set; }

    /// <summary>
    /// one of "FILLED"/"PENDING"/"CANCLED"
    /// </summary>
    public string state { get; set; }
    /// <summary>
    /// one of ASK/BID
    /// </summary>
    public string side { get; set; }
    /// <summary>
    /// order price 
    /// </summary>
    public string price { get; set; }
    public string market_uuid { get; set; }
    /// <summary>
    /// id of market
    /// </summary>
    public string market_id { get; set; }
    public string inserted_at { get; set; }
    /// <summary>
    /// id of order
    /// </summary>
    public string id { get; set; }
    /// <summary>
    /// already filled amount
    /// </summary>
    public string filled_amount { get; set; }
    /// <summary>
    /// average price of the deal
    /// </summary>
    public string avg_deal_price { get; set; }
    /// <summary>
    /// order amount
    /// </summary>
    public string amount { get; set; }

    /// <summary>
    /// 格式化输出
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        DateTime dt1 = DateTime.Parse(inserted_at);
        DateTime dt2 = DateTime.Parse(updated_at);
        string result =
            "inserted_at:" + LSGOComFun.TranslateToStdDateTime(dt1) + ","
            + "updated_at:" + LSGOComFun.TranslateToStdDateTime(dt2) + ","
            + "market_id:" + market_id + ","
            + "id:" + id + ","
            + "state:" + state + ","
            + "side:" + side + ","
            + "price:" + price + ","
            + "amount:" + amount;
        return result;
    }
}

public class OrderResponse
{
    //{"errors":[{"message":"invalid token","code":10018}],"data":null}
    public OrderResponseData data { get; set; }
    public List<Errors> errors { get; set; }
}

side属性:

  • Ask:卖家喊出来的价(卖价)
  • Bid:买家愿意出的最高价(买价)

<u>创建订单的方法 CreatOrders</u>。

public static List<OrderResponse> CreatOrders(List<OrderCreate> lst)
{
    if (lst == null)
        throw new ArgumentNullException();

    List<OrderResponse> result = new List<OrderResponse>();
    string url = ApiEntryPoint + "viewer/orders";
            
    for (int i = 0, len = lst.Count; i < len; i++)
    {
        string token = "Bearer " + GetToken();
        RestClient client = new RestClient(url);
        RestRequest request = new RestRequest(Method.POST);
        request.AddHeader("cache-control", "no-cache");
        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("authorization", token);
        string json = JsonConvert.SerializeObject(lst[i]);
        request.AddParameter("application/json", json,
                ParameterType.RequestBody);
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        IRestResponse response = client.Execute(request);
        string str = response.Content;
        StringReader sr = new StringReader(str);
        JsonTextReader jsonReader = new JsonTextReader(sr);
        JsonSerializer serializer = new JsonSerializer();
        OrderResponse order = serializer.Deserialize<OrderResponse>(jsonReader);
        if (order!=null)
            result.Add(order);
    }
    return result;
}

Step2 对取消指定订单 API 的封装

<u>构造取消订单的参数结构 OrderCancel</u>。

public class OrderCancel
{
    /// <summary>
    /// id of the order
    /// </summary>
    public string order_id { get; set; }
}

<u>取消给定订单的方法 CancelOrder</u>。

public static List<OrderResponse> CancelOrder(List<OrderCancel> lst)
{
    if (lst == null)
        throw new ArgumentNullException();

    List<OrderResponse> result = new List<OrderResponse>();
    for (int i = 0, len = lst.Count; i < len; i++)
    {
        string token = "Bearer " + GetToken();
        string url = ApiEntryPoint + "viewer/orders/" 
                    + lst[i].order_id + "/cancel";
        RestClient client = new RestClient(url);
        RestRequest request = new RestRequest(Method.POST);
        request.AddHeader("cache-control", "no-cache");
        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("authorization", token);
        string json = JsonConvert.SerializeObject(lst[i]);
        request.AddParameter("application/json", json,
                ParameterType.RequestBody);
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        IRestResponse response = client.Execute(request);
        string str = response.Content;
        StringReader sr = new StringReader(str);
        JsonTextReader jsonReader = new JsonTextReader(sr);
        JsonSerializer serializer = new JsonSerializer();
        OrderResponse order = serializer.Deserialize<OrderResponse>(jsonReader);
        if (order != null)
            result.Add(order);
    }
    return result;
}

Step3 对取消所有订单 API 的封装

<u>构造取消所有订单的参数结构 OrderAllCancel</u>。

public class OrderAllCancel
{
    public string market_id { get; set; }
}

<u>取消所有订单的方法 CancelAllOrder</u>。

public static bool CancelAllOrder(List<OrderAllCancel> lst)
{
    if (lst == null)
        throw new ArgumentNullException();

    for (int i = 0, len = lst.Count; i < len; i++)
    {
        string token = "Bearer " + GetToken();
        string url = ApiEntryPoint + "viewer/orders/cancel_all";
        RestClient client = new RestClient(url);
        RestRequest request = new RestRequest(Method.POST);
        request.AddHeader("cache-control", "no-cache");
        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("authorization", token);
        string json = JsonConvert.SerializeObject(lst[i]);
        request.AddParameter("application/json", json,
                ParameterType.RequestBody);
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        IRestResponse response = client.Execute(request);
                
        if (response.StatusCode != HttpStatusCode.OK)
        {
            return false;
        }
    }
    return true;
}

Step4 对获取指定订单 API 的封装

<u>构造获取指定订单的参数结构 OrderGet</u>。

public class OrderGet
{
    /// <summary>
    /// id of the order
    /// </summary>
    public string order_id { get; set; }
}

<u>获取指定订单的方法 GetOrder</u>。

public static List<OrderResponse> GetOrder(List<OrderGet> lst)
{
    if (lst == null)
        throw new ArgumentNullException();

    List<OrderResponse> result = new List<OrderResponse>();

    for (int i = 0, len = lst.Count; i < len; i++)
    {
        string token = "Bearer " + GetToken();
        string url = ApiEntryPoint + "viewer/orders/" 
            + lst[i].order_id;
        RestClient client = new RestClient(url);
        RestRequest request = new RestRequest(Method.GET);
        request.AddHeader("cache-control", "no-cache");
        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("authorization", token);
        string json = JsonConvert.SerializeObject(lst[i]);
        request.AddParameter("application/json", json,
                ParameterType.RequestBody);
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        IRestResponse response = client.Execute(request);
        string str = response.Content;
        StringReader sr = new StringReader(str);
        JsonTextReader jsonReader = new JsonTextReader(sr);
        JsonSerializer serializer = new JsonSerializer();
        OrderResponse order = serializer.Deserialize<OrderResponse>(jsonReader);
        if (order != null)
            result.Add(order);
    }
    return result;
}

Step5 对获取全部订单 API 的封装

<u>构造获取全部订单的参数结构 orderAllGet</u>。

public class OrderAllGet
{
    public string market_id { get; set; }
}

<u>构造接收“获取全部订单”返回的数据结构 GetOrderAllJson</u>。

internal class GetOrderAllJasonDataNode
{
    public OrderResponseData node;
}

internal class GetOrderAllJsonData
{
    public List<GetOrderAllJasonDataNode> edges;
}

internal class GetOrderAllJson
{
    public GetOrderAllJsonData data;
}

<u>获取全部订单的方法 GetAllOrder</u>。

public static List<OrderResponseData> GetAllOrder(OrderAllGet orderAllGet)
{
    string token = "Bearer " + GetToken();
    string url = ApiEntryPoint + "viewer/orders";
    RestClient client = new RestClient(url);
    RestRequest request = new RestRequest(Method.GET);
    request.AddHeader("cache-control", "no-cache");
    request.AddHeader("Content-Type", "application/json");
    request.AddHeader("authorization", token);
    string json = JsonConvert.SerializeObject(orderAllGet);
    request.AddParameter("application/json", json, ParameterType.RequestBody);
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    IRestResponse response = client.Execute(request);
    string str = response.Content;
    StringReader sr = new StringReader(str);
    JsonTextReader jsonReader = new JsonTextReader(sr);
    JsonSerializer serializer = new JsonSerializer();
    GetOrderAllJson order = serializer.Deserialize<GetOrderAllJson>(jsonReader);

    List<OrderResponseData> result = new List<OrderResponseData>();
    if (order.data.edges != null)
    {
        for (int i = 0; i < order.data.edges.Count; i++)
            result.Add(order.data.edges[i].node);
    }
    return result;
}

总结

至此,有关订单的 API 就全部封装完毕了。

下篇图文大家一起“基于网格交易法”来做一个简单的自动化交易系统。今天就到这里吧!See You!


相关图文

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容