技术图文:如何利用BigOne的API制作自动化交易系统 -- 订单系统
背景
前面几天,我们一起封装了 BigONE 提供的“身份验证”与“资产账户”部分的 API。
- 如何利用BigOne的API制作自动化交易系统 – 身份验证
- 如何利用BigOne的API制作自动化交易系统 – 获取账户资产
现在,离搭建咱们的自动化交易系统更近一步了。
本次,大家一起来封装有关“订单”的 API。
技术分析
BigOne 的订单系统包括:创建订单、取消指定订单、取消所有订单、获取指定订单、获取全部订单等,对应的 API 说明如下:
创建订单的 API:
取消指定订单的 API:
取消所有订单的 API:
获取指定订单的 API:
获取全部订单的 API:
代码实现
Step1 对创建订单 API 的封装。
构造创建订单的参数结构 OrderCreate
。
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; }
}
构造接收“创建订单”返回的数据结构 OrderResponse
。
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:买家愿意出的最高价(买价)
创建订单的方法 CreatOrders
。
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 的封装。
构造取消订单的参数结构 OrderCancel
。
public class OrderCancel
{/// <summary>/// id of the order/// </summary>public string order_id { get; set; }
}
取消给定订单的方法 CancelOrder
。
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 的封装。
构造取消所有订单的参数结构 OrderAllCancel
。
public class OrderAllCancel
{public string market_id { get; set; }
}
取消所有订单的方法 CancelAllOrder
。
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 的封装。
构造获取指定订单的参数结构 OrderGet
。
public class OrderGet
{/// <summary>/// id of the order/// </summary>public string order_id { get; set; }
}
获取指定订单的方法 GetOrder
。
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 的封装。
构造获取全部订单的参数结构 orderAllGet
。
public class OrderAllGet
{public string market_id { get; set; }
}
构造接收“获取全部订单”返回的数据结构 GetOrderAllJson
。
internal class GetOrderAllJasonDataNode
{public OrderResponseData node;
}internal class GetOrderAllJsonData
{public List<GetOrderAllJasonDataNode> edges;
}internal class GetOrderAllJson
{public GetOrderAllJsonData data;
}
获取全部订单的方法 GetAllOrder
。
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!
相关图文:
- 如何利用 C# 实现 K 最邻近算法?
- 如何利用 C# 实现 K-D Tree 结构?
- 如何利用 C# + KDTree 实现 K 最邻近算法?
- 如何利用 C# 对神经网络模型进行抽象?
- 如何利用 C# 实现神经网络的感知器模型?
- 如何利用 C# 实现 Delta 学习规则?
- 如何利用 C# 爬取带 Token 验证的网站数据?
- 如何利用 C# 向 Access 数据库插入大量数据?
- 如何利用 C# 开发「桌面版百度翻译」软件!
- 如何利用 C# 开发「股票数据分析软件」(上)
- 如何利用 C# 开发「股票数据分析软件」(中)
- 如何利用 C# 开发「股票数据分析软件」(下)
- 如何利用 C# 爬取「财报说」中的股票数据?
- 如何利用 C# 爬取 One 持有者返利数据!
- 如何利用 C# 爬取Gate.io交易所的公告!
- 如何利用 C# 爬取BigOne交易所的公告!
- 如何利用 C# 爬取 ONE 的交易数据?
- 如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!
- 如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!
- 如何利用 C# 爬取「互动出版网 - 计算机图书销量榜」!
- 如何利用 C# 爬取「中国图书网 - 计算机与互联网图书销量榜」!
- 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
- 如何利用 C# 爬取「猫眼电影专业版:票房」数据!
- 如何利用 C# 爬取「猫眼电影:最受期待榜」及对应影片信息!
- 如何利用 C# 爬取「猫眼电影:国内票房榜」及对应影片信息!
- 如何利用 C# + Python 破解猫眼电影的反爬虫机制?
- 如何利用BigOne的API制作自动化交易系统 – 身份验证
- 如何利用BigOne的API制作自动化交易系统 – 获取账户资产
相关文章:

[解决]eclipse中android自动补全/提示卡机或假死
这是Eclipse3.6版本的特有问题,想彻底解决此问题的话,还是建议换为3.5/3.4; 在保持版本不变的前提下,可以按如下方法优化下: 解决办法:1. 找到你的JDK安装目录下的src.zip文件;2. 打开eclipse: …

17.SpringMVC核心技术-拦截器
SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定 的用户请求, 并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提 交的请求映射出了所要执行的处理器类, 并且也找到了要执行该处理器类…

Python培训讲解二叉树的三种深度
python代码实现了二叉树,这次将会实现二叉树的几种遍历方法,来更好的解析二叉树的结构特点。分别是一种广度遍历,和三种深度遍历方法:先序遍历,中序遍历,后序遍历。下面是代码实现: 1、先序遍历…

Ajax弹出漂亮可拖动的提示层(窗)效果
<html><head><meta http-equiv"Content-Type" content"text/html; charsetgb2312" /><title>Ajax提示框</title><style type"text/css">a{ color:#000; font-size:12px;text-decoration:none}a:hover{ colo…

技术图文:如何解决 DAO 抛出的 80040154 错误?
背景 前几天,咱们一起解决了向 Access 数据库插入大量数据效率底下的问题。通过实验表明:利用 DAO 的方式可以极大的提升数据插入速度。 如何利用 C# 向 Access 数据库插入大量数据? 可是,给电力局升级了软件产品之后ÿ…

路由器配置实践 教你如何在Linux中三台主机两个网段互相通信
大家好我是你们的齐天大圣又到了齐天大圣给大家讲解的时间了今天我带你们做一个 大大项目 你们信不信如果把你不小心打开这个文档 希望你能看完 这个博文花费了我两天的时间所以请尊重我的劳动 假装看完好吗 齐天大圣在此谢过各位看官首先欢迎大家观看操作步骤我们正式开始题目…

Web前端学习有哪些技巧?
想要学好web前端技术,在学习过程中找到合适的方法和技巧,那么在实际学习过程中会更加的容易和快速掌握知识重点,尤其是对于初学者尤为关键,下面小编就为大家详细的介绍一下Web前端学习有哪些技巧?希望能够对学习有所帮助。 Web前…

技术图文:如何利用C# + Echarts 绘制 Bar Simple?
背景 Echarts 是百度推出的一个使用 JavaScript 实现的开源可视化库。 该库提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图&…

Moss/Sharepoint 一些很重要的API备忘
1.根据用户名获取用户 SPUser user web.EnsureUser((new SPFieldLookupValue(item["Mitarbeiter"].ToString())).LookupValue); 2.根据guid获取Feature对象 SPFeature listDisplaySettingFeature site.Features[newGuid("88E9E47A-BA92-47ab-A253-8AA472CCC76B…
vue从创建到完整的饿了么(5)v-for,v-bind与计算属性
说明 1.上一章--Home.vue及vue-resource使用2.cangdu大神的项目源码地址--Github地址3.接口地址--Github地址4.UI框架用的是--Mint UI5.下一章--登录注册页面及密码的暗明文转换 开始 1.先看看Home.vue代码 <template><div><mt-header fixed><span slot&q…

python查询mysql中文乱码问题
相信很多在工作中的Python小伙伴,经常会遇到一些工作上的问题,例如查询mysql中文乱码问题,Python连接mysql数据库时,读取数据库中的中文出现乱码,所有中文都显示为问号了,那么该如何解决这个问题呢?解决问…

技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?
背景 前几天,我们介绍了 如何利用C# Echarts 绘制 Bar Simple?,原以为把 Echarts 封装到这种程度就可以完成当前任务了。 可是,把软件原型提交给对方时,发现对方更希望“可视化设备发生缺陷的具体数据”。也即利用 堆…

Javascript原型链
这是关于原型链的一系列的现象与原理的解释以及例子 【转载请注明出处与地址】 分成4个部分阐述: 1.如何创建一个对象 2.使用原型链prototype实现对象的继承. 3.原型链上属性和方法的联系与规则 4.深入剖析原型链。 一、如何创建一个对象: 1.使用关键字n…

springbatch apache-activemq 整合(往mq中put数据,从mq中take数据)
简单测试如下:1:收下下载apache-activemq-5.14.4 解压apache-activemq-5.14.4\bin\win64,运行activemq.bat启动本地MQ服务器。通过浏览器可以查看本地MQ服务器的信息。http://127.0.0.1:8161/admin/index.jsp 2: 先往mq中put数据配置如下&…

什么是安全测试?哪些阶段需要安全测试?
安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程,可以说,安全测试贯穿于软件的整个生命周期。下面通过一张图描述软件生命周期各个阶段的安…

技术图文:如何利用C#爬取CSDN的博客文章?
背景 大家有没有这样的体验,在 CSDN 上发现某个博主有很多干货文章,我们就想拿到这个博主以往文章的列表,在需要的时候进行查询和浏览。 如果从 CSDN 网站上用复制粘贴的方式来建立这个列表,一个是工作量很大,另一个…

SAP BADI应用
SAP BADI应用 1.定义BADI 1) T-Code: SE18 Business Add-In Define. 2) 输入要创建的BADI的名字,点击"Create"。 3) 输入BADI的描述性文本,在"Interface"选项卡上输入接口的名字,也可以采用SAP建议的接口的…

为什么多 TCP 连接比单 TCP 连接传输快
转自: 我观察到,客户端机器从单一服务器使用 HTTP 下载一个文件:1. 单连接下载,速度没有达到客户端网络的最大带宽;2. 多连接同时下载,传输速度有极大的提高,带宽被占满。假设如下前提ÿ…

学Python的好处有哪些?
Python是一种比较简单的编程语言技术,想要快速进入到IT行业,Python是非常好的选择,为什么这么说呢?下面小编就为大家详细的介绍一下学Python的好处有哪些? 学Python的好处有哪些? 1.如果你是一名新媒体相关人员,学习Pyth…

技术图文:如何利用C# 实现 Kruskal 最小生成树算法?
背景 以前我写过一些图文来介绍有关数据结构与算法的知识: 8大排序算法之:直接插入排序(Straight Insertion Sort)8大排序算法之:希尔插入排序(Shell Insertion Sort)8大排序算法之࿱…

又偷懒了4个月,督促自己
又偷懒了4个月 每天浑浑噩噩,做着无聊简单的体力活,我不应该是这个追求撒!~~ 爸爸说的对,无论怎么样自己都要独立,要学习,爸爸希望我还去继续学习会计,我看下半年吧,各种学习都要&am…

java.lang.NoSuchMethodError: org.springframework.web.context.support.XmlWebApplicationContext.getEnv
转自:https://blog.csdn.net/u012941811/article/details/16960493 ava.lang.NoSuchMethodError: org.springframework.web.context.support.XmlWebApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment; at 缺 org.springf…

零基础可以学好UI设计吗
随着UI设计行业的不断扩大发展,很多人都想要学习UI设计技术,但有很多同学都是零基础,想知道零基础可以学好UI设计吗?我们来看看下面的详细介绍就知道了。 零基础可以学好UI设计吗? 如果零基础自己学习UI设计着实有点吃力,毕竟对…

技术图文:如何利用C# 实现 Prim 最小生成树算法?
背景 我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法?,Kruskal 算法通过寻找边最优的方式来构造最小生成树,本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法,Prim 算法通过寻找顶点最优的方式来构造最小生成树…

去除iphone图标的半弧高亮效果
只需要在info.plist里面添加一条记录UIPrerenderedIcon 新版的XCODE 会自动识别为Icon already includes gloss effects 打上勾就OK了 如果没有识别的右边栏写上YES就可以。转载于:https://www.cnblogs.com/jiewong/archive/2011/01/14/1935718.html

【短视频SDK - 参数解析】对焦模式、裁剪模式、视频质量、分辨率、视频比例、帧率、关键帧间隔等参数解析...
1.参数简析 参数名称简介影响裁剪模式分为填充模式和裁剪模式影响图像画面的展示细节视频质量是指生成的视频的输出参数,是一组参数决定的数值视频清晰度和文件大小分辨率图像分辨率则是单位英寸中所包含的像素点数,分辨率影响图像大小,与图像…

21年最新Python面试题及答案汇总详解(上)
错过三月找工作的机会,还要错过四月的好时期吗?Python面试你做准备了吗?下面小编整理了一套2021年最新Python常见面试题目,及Python面试题目答案汇总。希望能够帮助到大家。 21年最新Python面试题及答案汇总详解(上) 1、列表(list)和元组(tuple)有什么…

sina微博api源码阅读之函数
1. array_map将类的静态成员函数作为回调函数用在指定的单元上,可以递归调用 public static function urlencode_rfc3986($input) { if (is_array($input)) { return array_map(array(OAuthUtil, urlencode_rfc3986), $input); } else …

LeetCode实战:将有序数组转换为二叉搜索树
题目英文 Given an array where elements are sorted in ascending order, convert it to a height balanced BST. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by mo…

Spring、Spring Boot和TestNG测试指南 - @ActiveProfiles
Github地址 ActiveProfiles可以用来在测试的时候启用某些Profile的Bean。本章节的测试代码使用了下面的这个配置: Configuration public class Config {BeanProfile("dev")public Foo fooDev() {return new Foo("dev");}BeanProfile("prod…