分享一个帮我赚了30万的项目

593 阅读10分钟

前言

本人做前端今年迈入第十个年头了,过了30岁也是陷入了无穷的焦虑当中。从本人做前端今年迈入第十个年头了,过了30岁也是陷入了无穷的焦虑当中。从很多年前,我就开始为这个困境做好准备。便开始了研究各种有机会赚钱的项目,白的灰的都不放过。由于本人从2017年就开始接触数字货币,也算是老韭菜了,今天要分享的,就是与数字货币相关的项目。

可能有人会有疑问:真能赚钱你还会分享出来?你不会闷声发大财?肯定是骗子!这个问题,我会放到最后说明,代码我也会放到 github,我是不是骗子,你们自己看完再自行判断吧。我不会跟任何人收钱,毫无保留地分享这个项目,但求各位路过的大哥给小弟 github 一个star 我就满足了。

项目盈利点

先声明一下,由于本项目涉及金融等交易行为。帖子仅仅是作为经验交流分享,绝对不是投资建议!!

在这个圈子的人都知道,有众多大大小小的交易所,包括最大的交易所(B字开头的,下文简称B所)。而B所每隔一段时间,就会上架一些新的币种,每个币种背后都由一个项目方发行,而上B所可以说是每一个项目方的终极目标,一旦达成了这个目标,意味着你这个项目甚至说你发行的这个币,得到最高的认可。

但是,并不是每个项目方都能达成这个目标。这个圈子没有监管,什么妖魔鬼怪都有,随便一个垃圾都可以发币。B所作为圈子里的权威,当然对项目方的考核非常严格,不会让这么多狗屎垃圾都上自己的场子把自己的口碑搞臭。于是项目方便会瞄准一些相对没有那么权威的交易所(这里我就不列举了,以免有人说我打广告,我就找一个G字开头的作为举例吧,下文简称G所),G所并没有B所那么严格,因此口碑特别差,也特别多妖魔鬼怪,各种割韭菜的垃圾项目。但说不定哪一天其中一个垃圾项目将会上架B所,这时候这个币就起飞了。例如这个:

WechatIMG3419.jpeg

WechatIMG3420.jpeg

在B所上架公告一发出的瞬间,这个币就会坐火箭般地起飞。

我们要做的就是第一时间抓取到这个信息,并在获取到信息后瞬间买入。然后获利卖出赚取差价

说白了,就是赚取信息差的钱。你比其他人快哪怕是几秒钟,都能赚到钱。

思路及技术方案

有了上述的逻辑,那目标就很明确了。大致思路如下:

  1. 定时请求公告列表页,判断是否有新的公告
  2. 如果判断出有新公告,那就提取币种
  3. 判断该币种,是否已存在于G所
  4. 如果存在,那就发起交易(交易所都有提供api进行自动化交易,不要傻乎乎地去手动操作)

坑、风险、技术难点

开发过程我就不多说了,一切尽在代码中。你们自己看吧,主要我想分享一下开发过程中遇到的坑和这套策略的风险,以及如何克服一些技术难点去降低风险。

首先,我想说的是这套策略最大的一个风险,就是你不够快!什么意思呢?就是尽管你的程序把上述的流程都跑通了,但是在任何一个环节中你比别人慢了。那么你的资金就是帮比你早买入的人把币价推上去,假设跟你做同样事情的人有100个,你是最后一个,那么你就是最妥妥的接盘侠。尽管你是第50个,实际上你也没有多大利润。换句话说就是,你越早买入,你的风险就越低,利润就越高。

决胜于毫秒之间,是这套策略的精髓所在。记住这个大前提,我后面所说的坑和技术难点,都是为了解决这个问题。

定时请求公告列表页,判断是否有新的公告

一开始我在做这一步的时候,通过get请求拿到的,是一个html页面。于是通过正则匹配找出关键字来判断是否有上新的公告发布。但后面发现,这个过程贼慢,原因是我接收到的,是一个html页面,从发出请求到接收到页面内容,再通过正则去判断页面内容。这个过程不是一般的慢,以致于我一开始总是被割韭菜。

于是我想办法优化这个逻辑,绞尽脑汁终于发现了app端有一个接口可以用来平替,返回的就是一个json数据,而不是html。这处理起来就快很多了,用charles抓包,就发现了这个接口以及请求包。大大缩短了这个过程的时间。后面发现,这个缩短这个过程的时间是最难也是最关键的,后面还会针对这个难点进行很多优化处理,这是第一个。(具体代码逻辑路径:/server/exchanger/binance/article.go —— FetchFromApi)

交易逻辑优化

按照G所api下单的逻辑,必须填写数量、价格这两个参数。一开始,我是判断到有上新币的公告,查询到G所存在这个币,再去查询这个币的价格,再发起交易。这个过程在整个逻辑中太耗时了。于是采用了定时轮询的方法。就是定时获取所有币种的价格(G所有这个接口),以key/value的形式存放在缓存里面,key就是币种,value是一个对象,包括价格、价格精度(即小数点后面有几位)等信息,以便最大限度地缩短整个计算过程,因为在买入的瞬间,你不可能以缓存的价格买入,需要做一些溢价,例如10%。所以买入价还是需要计算的,这时候就需要计算价格精度。

分布式部署

进行了上述两个优化之后,我以为我已经胜券在握了。但事实却是啪啪打脸,我依然是充当接盘侠,依然比别人慢了十几秒,甚至一分钟。这个可以通过k线图看出来,因为拉盘的瞬间,意味着公告发出的一瞬间已经有人知道了,而往往在拉盘之后的一段时间,我的程序才捕捉到有新公告发出。这显然是不能接受的,我有怀疑过,是不是B所有内鬼,在发公告之前就已经先交易了。但后面的事实告诉我,这事大概率是不存在的,因为我也做到了。

一开始我采用异步线程来发起获取最新公告的api请求,但这样意义其实不大,因为交易所每个api都有请求次数限制,何况这个是非公开的api(前文说过是抓包获取的),于是我把频次降低到10秒请求一次,还是过于频繁,被交易所屏蔽ip了,最终我把频次降到1分钟/次。但这样意味着我要有多台服务器进行轮询。于是我就在某云服务商一口气搞了20台服务器去做这个事,平均下来,大概就是3秒请求1次,这个频次可以说是比较理想了。

然而,奇怪的事情出现了

就是每台机器捕捉到最新公告出现的时间都不一样,但每次发出请求的时间戳是一样的。例如A、B两台机器都在11:00发送请求,然而A机器发现到有新公告,B机器没有发现。这种情况并不是偶然,而是必然,每台机器捕捉到新公告的时间都不一样,对于这种现象,一般都认为是服务器缓存,于是我在请求后面加上时间戳参数,发现情况都是一样。这个问题,我至今仍然不知道是什么原因造成。但是不重要了,因为采用这种方案,我终于挤进最快一批人里面买入了。但这是最终的结果,还有一个优化要处理

服务器地区的选择

我查了一下域名映射的ip地址,是在新加坡,为了追求最快的请求和响应速度,我租的服务器都在新加坡。但是经过一轮请求分析,我发现从新加坡发出请求到接收到响应的时间大概是400多毫秒。刚好我自己有一台香港的服务器,我就测试一下,结果发现香港服务器的时间是200多毫秒,有时候甚至是180-190毫秒(测试代码在/server/exchanger/binance/article.go —— TestFetchFromApi)。后面经过一轮调查发现。原来是域名的交换机是在香港,而不是在新加坡。因此才会出现这个问题,于是我便把所有新加坡的服务器放弃了,重新在香港租服务器。

结语

至此。完成上述所有优化之后,我基本上都能盈利。但文章开头提到,就是我现在为什么没做而分享出来呢?就是这套逻辑已经是3年前了,这套策略是严重依赖B所上新的频率,3年前B所每个星期都会上新1-2个币,这种频次利润是非常可观的。但是现在平均2-3个月才有一次,而服务器成本一个月差不多要2000块。因此,这个策略可以说是入不敷出,所以我就没做了,分享给大家,骗骗star好了。

附上我当时的部分交易记录给大家看看

WX20240628-154001@2x.png WX20240628-153728@2x.png WX20240628-152808@2x.png WX20240628-153035@2x.png WX20240628-153120@2x.png WX20240628-153228@2x.png WX20240628-153337@2x.png

上面有一些状态是“已撤销”的,是这个挂单还有部分没有成交而撤销的,并不是没有成交的意思,要看成交金额。有些细心朋友可能会发现,一买一卖之间的时间都很短,这是因为这种拉盘都是市场的情绪波动而造成的,情绪结束之后,市场便会冷却,价格也会下来,所以见好就收,持仓时间都很短暂。累计收益也没仔细算了,大概超过30个w人民币。

github代码在这里,希望各位高抬贵手给个星星,小弟万分感谢。 github.com/Leungkingma…

最后再次严正声明:本项目仅作为经验分享,绝对不能视为投资、投机建议。而且由于代码久远,部分接口内容可能已经不适用

如果有圈子相关的朋友想和我交流一下的,我也很乐意,微信我就不放这里了,放在github,欢迎加好友交流交流。