数字货币自动交易程序(1)
一些题外话和做这个的契机
在开始介绍程序之前,有些事情我觉得有必要先谈一谈。总结起来就一个问题,我为啥要做这个?那么下面我来剖析一下我的内心,谈一谈想法。
(当然了,网络这一块我涉猎不深,这个本地程序,没有参考任何架构,完全是自己拍脑袋想出来的,如果有服务器大佬看到了,想锤就锤,想喷就喷,我都会很乐意交流的)
1.
从我最开始了解交易策略并自己开始尝试着写点东西,差不多是去年的这个时候,5月份。最初是以均线策略为基础,遍历了不同周期的K线和不同长度的均线,获取了一个处于参数平原的均线值,同时做了相应的优化。
其实这就是最初的一些准备工作,我想得很美好,因为当回测数据出来的时候,很是惊人,简单一句话概括当时的感受,“如同在捡钱”,以为这样就可以走上“人生巅峰”,现在回过头来看,too young too naive。
当时策略大致回测数据如下,这里贴的是18年1月1日到19年5月1日和19年1月1日到20年5月1日,大家可以对比一下,同时19年5月1日大家都知道大饼还是处于上涨周期中,所以对于均线策略从这个节骨眼拆开,对收益影响蛮大的。为啥贴这个?只是证明,当时写的策略,在如今看来,依然奏效,如果按着它来操作,啧啧啧。


看到这里的朋友,不要自信的觉得自己可以遵守,就目前群里面观察来看,能完全遵守的,貌似一个都没有,包括我,为什么,后面会解释。
2.
很多人看到这里估计心痒了吧,这简直就是“一棵摇钱树”啊,那么我挣钱了吗?挣了,但是很少,而且和策略没啥关系,都是主观交易挣的钱。
非常的讽刺,如果看了我之前写的流水账的朋友,应该知道,当我策略出来之后,我根本没法遵守它,为什么没法遵守,我可以找一堆理由,比如:
- 币圈是24小时的市场,行情的买卖点,经常出现在晚上12点到早8点这个区间,即使你是用的4小时趋势策略,那么凌晨4点,你也是需要起床看盘的,长期搞下去,钱没挣到,人就先疯了。
- 往往开单的位置是反人性的,我也不说那么绝对了,比如这个均线策略,目前币圈里面的散户朋友,10个有9个在提示开单的位置都开不出来,最近就是个活生生的例子,踏空的韭菜茫茫多,如果你没有踏空,那么也许你能开出来这个多单,如下图。

- 往往在出现盈利的一笔趋势单之前,会损掉很多单,回撤会到10%以上,而且不是一次性的,是一刀一刀的割,然后击毁人们的意志。当然了,肯定有更好的策略,但是趋势策略,遇到震荡行情,是无法避免这种情况的。

- 最后一点,知行合一,我是在交易上才深深的理解到了这个字的含义,要做到如此,太难了。“知”就是你的策略,是你自己对市场的认知,形成的一套交易逻辑,“行”,就是你交易的操作,开多开空平仓止损,“合一”,就是两者合并起来执行,内心没有波动,心如止水。即使你是一个已经能遵守自己策略的交易者,也不能证明你是一个知行合一的交易者,为什么,我的理解如下,某天晚上想到的点东西,记录了下来,与大家分享一下:按照自己提前做的策略开单(或者叫交易计划),开单之后,不是该担心被损,而是跌到止损价就该被损,不已亏损烦恼,有浮盈了,就该拿住,然后按照计划止盈,不已盈利而得意忘形。我现在的情况,已经能按照计划交易了,但是内心依然不能平静(但是比以前好太多了)。
3.
那么在一次次痛定思痛之后,如果是个不逃避问题的人,是会想办法解决的。在酝酿了大半年之后,我祭出了自己的办法,本地化实现一个自动交易软件。为什么这么做?
- 自动化交易程序可以解放我的时间,最最关键的是,晚上可以放心大胆的睡觉!
- 可以严格的执行知行合一,在主观上和客观上达成一致,主观如之前所说,这里就不赘述了,客观是指,程序可以在达到操作条件的一瞬间,帮你执行完策略的操作,不管是从时间精度,还是价格精度,都比手动操作来得更加准确,更别提手动操作会受情绪影响了。
- 自己是个做游戏渲染相关的程序员,做游戏这一块的盲区其实就在网络方面,虽然之前有写过网络同步相关算法,但是都没有机会自己从头开始写一个东西,这也是个锻炼和提升,事实证明的确有很多坑,也学到了很多东西。
- 我对现在市面上的第三方程序自动化对接平台不那么信任,同时可操作性,远低于我自己写代码,我自己在本地虽然要从0开始搭建我的工程,但是到了后期,我想怎么玩就怎么玩。
- 好奇,觉得对接API自动交易很酷。
正文开始
不知不觉瞎扯了这么多,下面进入正文,先从介绍目前我自己实现的一些模块开始吧。
在介绍模块之前,先有一些准备工作是必须要做的,如下(目前我自己只对接了huobi,其它交易所,大同小异)
- 去火币官网上面,申请自己的API Key,这样你才能对你自己账户进行操作。
- 去下载huobi提供的demo工程,这个工程提供了基本的加密方式和一些基础工具类,我是使用的C#,所以是通过这个地址下载的
https://github.com/huobiapi/Futures-CSharp-demo
- 当然了,最后就是去查看对应的API文档了,地址如下huobiapi/Futures-CSharp-demo当然了,最后就是去查看对应的API文档了,地址如下
这里插一句,这个自动化交易软件,我是用unity制作的(unity就是万能,别以为只能做游戏)。
目前我自己实现的模块如下(网络通信相关的都是http访问):
- 交易所API封装相关,比如Request message对象和Response message对象,这种对象有一堆,这是最最基础的东西,可以通过看API文档,找到对应的结构和结构内变量的数量和类型,比如


- 交易所数据更新模块,比如更新仓位信息,更新订单信息,更新K线信息等等,有些更新需要请求才会返回最新数据,有些是只要注册了,程序内部会有一套自动轮询的机制,拿K线更新来举例,如下


当然了,比如huobi并没有提供直接可用的2H周期K线,我自己程序本身,只需要请求1H k线,然后进行个加工,就变成2H k线了。
- 错误处理模块,这个模块是最重要的一部分(其实不仅仅是处理错误,是和对应功能融为一体的),因为你请求服务器数据的时候,是会发生各种意外情况的,比如发送的请求,服务器有没有收到?服务器收到了之后返回的请求,是否丢包?死循环,同时还会出现,服务器返回的数据解析不出来的各种问题,哈哈哈。目前我自己是对所有各种乱七八糟的请求,进行了一个封装,来处理各种意外情况,结构大概如下所示

同时呢,有一个请求对象管理类,来调度所有的请求,包括控制每秒请求个数这种简单的任务

这样的好处是,耦合度非常低,当一个请求生命周期结束,无论失败还是成功,才会传回最初发送请求的这个对象那里去,逻辑就会简单很多。
- 本地策略模块,这恰恰是最简单的部分,但是也是想象力最多的部分。目前来说,这一块,我是尽可能的还原TV上面Pine的逻辑流程,结构分为两部分,一个是策略的配置,可以理解成pine上面策略使用的各种参数,第二部分就是策略本身,本身最终要的一块就是分析数据,根据最新传回的K线数据,进行分析,决定当前K是否开单,大致代码如下

- 策略执行模块,这一块会复杂不少,这一部分就是策略执行的基石,发送开单请求,也是这个模块来执行的。当然了,有可能会有多个策略,不同币种在同时执行,所以肯定需要一个策略执行的管理类来调度所有的策略执行类。

- 当然了,虽然目前也就是自己在用,也要用起舒服才行,对吧,这就体现出了使用unity的好处了,撸一个UI分分钟啊,拼好UI,分装对应UI组件,比如button,toggle,slide等等,在弄一个UI管理类,来管理所有UI模块。目前软件大致就长这个样(这是20天前的样子)。

- 最后,也是非常关键的一块,调试模块,记录关键的程序运行中,与服务器数据请求种的各种信息,这样,能最快的定位出问题出在哪里,程序嘛,怎么都会有各种各样的bug的,下图是调试页面

未完待续
暂时先写到这里,大致理了一下我自己这个软件的一些功能模块,如果感兴趣的朋友比较多,之后会有更详细的介绍,当然了,之后如果业余时间有空,也会不断的对现有程序进行迭代,比如支持huobi的永续合约,支持自动交割合约调仓,集成套利策略,优化开大单逻辑,止损逻辑优化等,感觉还有很长的路要走,哈哈。
最后
放上星球二维码,希望志同道合的朋友的加入,一起成长,互相监督。如果对自己策略有信心,愿意拿出来和我讨论的,来者不拒,哈哈,如果真有那么好,你让我免费内置进去也是完全没问题的,当然了内置进入是有要求的,我不管你是什么策略,只要能满足19年1月1日到20年5月1日,收益超过300%,回撤小于18%,交易笔数不限制,但是请加上万3的手续费0.03%就行,同时,需要同一个标的,比如btc,在不同交易所的表现都差别不大才行,当然了,参数尽量有参数平原,比如一个趋势策略,80日均线收益400%,改成81就变成200%了,这样肯定不行,但是一般没有参数平原的策略,不同交易所同一个标的这一关就过不了。我不是空手套白狼,目前自己用的长这样。




好了,最后,我自己的策略也会不断迭代,分不分享策略不重要,关键是多交流思路,这样才能进步。想拿现成的就别来了,想梭哈挣快钱的也别来了,就这样。
这里插一句,作为一个游戏程序员,我想说的是(估计我是第一个这样觉得的),写交易策略和写shader,底层逻辑神似!都是获得数据(或者想方设法获得数据),数据加工(想怎么玩就怎么玩),最后输出(策略是做决策,shader是输出颜色或者buffer,哈哈哈),扯远了扯远了。
原文 https://zhuanlan.zhihu.com/p/137655673