技术图文:进一步完善自动化交易系统 - 01

it2022-05-05  147

背景

最初,我们介绍了 如何利用网格交易法对数字资产进行交易。只要价格存在波动,通过这种方法就能赚取利润。

接着,我们介绍了 如何通过三角套利来交易数字资产。只要三种数字资产,两两存在交易对,就可以建立套利的路径,满足条件的情况下进行套利。

可是,在今天回测的时候,却发现有极个别订单在未全部成交的情况下就被取消了。

具体情况如下:

BigOne 存在 ONE-USDT、EOS-USDT、ONE-EOS 交易对。

我运行了 “USDT -> ONE,ONE -> EOS,EOS -> USDT” 买入->卖出->卖出 以及 “ONE -> USDT,USDT -> EOS,EOS -> ONE” 卖出->买入->买入 两条三角套利的路径。

我还运行了 “ONE-EOS” 的网格,在网格成交之后会撤销 “ONE-EOS” 的全部订单,然后以当前成交价为基准,重新挂入买单和卖单。

故,以上Bug存在的原因可能是:在网格交易 撤销 “ONE-EOS” 订单的时候,正好有 三角套利的 “ONE-EOS”订单挂入,所以在没有完全成交的情况下,被撤销了。

我把日志中的订单号拿出来,写程序验证后,发现自己的猜测是正确的。


技术分析

找到原因之后,我完善了自动化交易的代码。

在套利策略执行之后,随即执行以下三个步骤:

Step1:读取被取消订单的记录文件,该文件存储了被取消订单的id。Step2:依据被取消订单的信息重新生成订单。Step3:重新检查订单状态,把被取消订单的id写入到记录文件中。

注:通过 _lstOrderData 变量记录当前运行环境中的所有订单。

private static List<OrderResponseData> _lstOrderData = new List<OrderResponseData>();

代码实现

读取被取消订单的记录文件

static void ReadOrderData(string fileName) { LSGOTextFileControlFacade pTextFile = new LSGOTextFileControlFacade(); if (pTextFile.FileExist(fileName) == false) return; string[] btcRecord = pTextFile.FileRead(fileName); for (int i = 0; i < btcRecord.Length; i++) { string id = btcRecord[i].Trim(); if (string.IsNullOrEmpty(id) == false) { OrderResponseData item = _bigOneUtility.GetOrder(id); if (item.state == "CANCELED") _lstOrderData.Add(item); } } }

依据被取消订单的信息重新生成订单

static void CreateOrderData() { List<OrderResponseData> lstNewOrder = new List<OrderResponseData>(); _lstOrderData.RemoveAll(a => a.state == "FILLED"); for (int i = 0; i < _lstOrderData.Count; i++) { _lstOrderData[i] = _bigOneUtility.GetOrder(_lstOrderData[i].id); if (_lstOrderData[i].state == "CANCELED") { double price = Convert.ToDouble(_lstOrderData[i].price); double amount = Convert.ToDouble(_lstOrderData[i].amount); string marketId = _lstOrderData[i].market_id; string side = _lstOrderData[i].side; List<Order> order = new List<Order> { new Order(price, amount) }; List<OrderResponse> lst = side == "ASK" ? _bigOneUtility.CreateAskOrders(order, marketId) : _bigOneUtility.CreateBidOrders(order, marketId); OrderResponseData data = _bigOneUtility.GetOrder(lst[0].data.id); lstNewOrder.Add(data); } } lstNewOrder.RemoveAll(a => a.state == "FILLED"); _lstOrderData.RemoveAll(a => a.state == "CANCELED"); _lstOrderData.AddRange(lstNewOrder); }

把被取消订单的id写入到文件。

static void WriteOrderData(string fileName) { _lstOrderData.RemoveAll(a => a.state == "FILLED"); LSGOTextFileControlFacade pTextFile = new LSGOTextFileControlFacade(); string log = string.Empty; for (int i = 0; i < _lstOrderData.Count; i++) { _lstOrderData[i] = _bigOneUtility.GetOrder(_lstOrderData[i].id); if (_lstOrderData[i].state == "CANCELED") { log += _lstOrderData[i].id + Environment.NewLine; } } if (string.IsNullOrEmpty(log)) { pTextFile.FileDelete(fileName); } else { pTextFile.FileWrite(fileName, log, Encoding.Default, false); } }

总结

做一套生产环境运行的软件系统还是很难的。不仅需要考虑自身软件对数据状态的改变,还要考虑如果数据状态被外部软件修改,我们要如何应对。慢慢来啊,做任何事情都需要一个过程,先有个原型跑起来再说!后面,再来重构自己的代码。今天就到这里吧!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# + Python 破解猫眼电影的反爬虫机制?如何进行代码的重构?以封装 BigOne API 为例如何利用BigOne的API制作自动化交易系统 – 身份验证如何利用BigOne的API制作自动化交易系统 – 获取账户资产如何利用BigOne的API制作自动化交易系统 – 订单系统如何利用BigOne的API制作自动化交易系统–网格交易法 老马的程序人生 认证博客专家 终身学习者 我是终身学习者“老马”,一个长期践行“结伴式学习”理念的中年大叔。我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。愿我们一起学习,一起进步,相互陪伴,共同成长。

最新回复(0)