说明

去年杂七杂八看了一些量化交易的视频算是入了门。本地回测的库有Catalyst(基于zipline)、vnpy、Zipline。

这篇文章是一个简单的Tradingview(也可以回测)交易策略通过自己写的python web程序对接火币交易所进行现货买卖的demo。

简单来说:Tradingview webhook->python web-> huobi

步骤

注册Tradingview

https://cn.tradingview.com/

打开首页你就会发现很多别人已经写好的策略在进行展示,但这些策略往往应用于其他传统金融市场,而不是数字货币。而对于我这种不懂交易会写一点点代码的人只能用别人的策略在币圈进行回测优化。

打开脚本页面

https://cn.tradingview.com/scripts/

script

这个页面里就是所有的开源策略。

选其中一个你认为还不错的,进行我们下面关键的web hook设置。

我这里随便举个例子:
比如选SuperTrend策略,点“添加至收藏脚本”

script

点击图表按钮

script

选择btcusdt的图表布局

script

左侧出现的就是btc的k线图

选择收藏的脚本应用到图表上

script

script

点击“指标&策略”,然后点击你收藏的“SuperTrend”策略脚本,这时你看图中的数字3那里,就出现了策略在盘面的走势应用图,比如箭头所指的sell,就是策略给的卖出信号。

script
看上图,没想到这个策略在今天还是挺准的,如果都在它给的点位买入卖出或者做多做空,应该是能赚到钱的。

注:本人没有用它做实盘策略,自己要用请自行评估。

添加信号告警

这一步是本篇文章的重点,就是如何使用tradingview的Webhook对接python web程序。tradingview我下文统一叫tv吧,太长了不好打字。

script

点击“警报”图标,会弹出一个对话框。

script

点击下拉,选中supertrend策略。

script

注意我红框里面选中的内容,第一个框是选策略,第二个框是策略的买入信号(待会儿我们还要创建一个卖出信号的警告),第三个框是“每根K线一次”,简单的解释就是可以一直跑,一旦符合指标就提示,其他的选项就是用一次就停止了之类的,不过多解释了。最后点创建,如果不接入webhook的话,平时人工盯盘这样用就足够了。

但是量化重点在webhook,下面我们介绍如何接入它。

先给出python的web程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
'''
@File : huobi.py
@Time : 2020/01/10 00:07:06
@Author : pirogue
@Version : 1.0
@Contact : [email protected]
@License : (C)Copyright 2019-2020, Pirogue
@Desc : Tradingview webhook通知webserver对接火币交易所进行现货买卖
'''

import ccxt
import time
import json
import tornado.web
import tornado.ioloop

ex = ccxt.huobipro({
'apiKey': '填自己的',
'secret': '填自己的',
'options': {
'createMarketBuyOrderRequiresPrice': False, # switch off
},
})

def get_assets():
btc_count = ex.fetch_balance()["BTC"]
print(btc_count)
# 账户正在使用的btc
#btc_used = btc_count["used"]
btc_free = btc_count["free"]
return btc_free

def sell_btc():
btc_count = get_assets()
symbol = 'BTC/USDT'
ex.create_market_sell_order(symbol,btc_count)


def buy_btc():
symbol = 'BTC/USDT'
amount = 0.9 # BTC
price = 9000 # USDT
cost = amount*price
ex.createMarketBuyOrder(symbol, cost)


class MainHandler(tornado.web.RequestHandler):
def get(self):
buy = self.get_arguments("buy")
sell = self.get_arguments("sell")
if buy:
buy_btc()
if sell:
sell_btc()
self.write("Hello,Tornado.")
def post(self):
buy = self.get_arguments("buy")
sell = self.get_arguments("sell")
if buy:
buy_btc()
if sell:
sell_btc()
self.write("Hello,Tornado.")
# def make_app():
# return tornado.web.Application([
# (r"/btc",MainHandler),
# ])

if __name__=="__main__":
app = tornado.web.Application([(r'/btc',MainHandler)])
app.listen(80)
tornado.ioloop.IOLoop.current().start()

这段程序用到了两个python类库,一个是tornado做web,一个ccxt与交易所api对接。

ccxt 是 github上最火热的加密货币交易库, 包含了近百个交易所api。支持 Python、JavaScript、PHP 三种语言调用。对于这个行业来说,各个交易所 API 签名方式、数据结构都不相同,如果一个个接入适配可以说费时费力,ccxt的出现解决了这个问题。

简单来说ccxt就是把所有的交易所的各自不同的api接口都封装好了,你只要在代码里配置好自己交易所的api key,就可以用统一的函数去实现交易。这样的好处是辛辛苦苦写的策略代码,想移植到火币就改一下火币的api key,想移植到币安就改一下币安的key,其他代码根本不用动。

注:ccxt当前还没有封装火币的季度合约接口,想做合约量化交易的可能要等官方实现或者自己实现。做现货是没问题的。

上面这段程序如何运行:

1
python huobi.py

这样就运行起来了,如果你要后台运行就

1
nohup python huobi.py &

假设你的购买的服务器ip是123.123.123.123,当你运行之后,post请求http://123.123.123.123/btc?buy
就会走到

1
2
3
4
5
6
7
8
def post(self):
buy = self.get_arguments("buy")
sell = self.get_arguments("sell")
if buy:
buy_btc()
if sell:
sell_btc()
self.write("Hello,Tornado.")

函数里,程序判断post请求中有buy参数,那就执行buy_btc(),买入btc。

1
2
3
4
5
6
def buy_btc():
symbol = 'BTC/USDT'
amount = 0.9 # BTC
price = 9000 # USDT
cost = amount*price
ex.createMarketBuyOrder(symbol, cost)

buy_btc函数里面我写的是以市价(createMarketBuyOrder)买入btc,可以去查一下这个函数createMarketBuyOrder。为什么是0.9*9000?因为我以市价买入时,只能买入这么多usdt的btc。买入逻辑需要你自己去设计,我这里只是当时的例子….

卖出跟买入的逻辑同理,可以自己看代码理解。web程序的运行逻辑就是如上所述。

怎么与webhook对接呢?看到上面其实已经很明显了,只要webhook可以请求我们服务器web程序的post接口带着buy或者sell参数就可以了。所以在webhook处配置http://123.123.123.123/btc?buy

script

点创建,就是一个配置了webhook的警报。这样在策略触发警报时就会执行警报配置里面的内容,比如触发Webhook。
注意Webhook触发请求时是POST请求,不是GET请求,我代码里面的get请求方法忽略就好。。POST请求里面还能携带下方表单里面设置的数据,这些我在demo里面就详细阐述了。

再创建一个卖出的警告,步骤跟上面创建警报的步骤是一样的,只是选的是相反的如下图,不再文字描述
script

这样tv的webhook通知python对接交易所就做完了。

对了,Webhook功能是收费的,tv收费也有点小贵…

币圈友情提示

“本是同根生,相煎何太急”,同是韭菜,我已经亏了小县城的半套房子的钱了。这个市场没有踏入的最好也别进来了,稳定的买买基金、保本理财还是挺香的,币圈到处都是庄家割你的镰刀。

上述代码只是demo,提供tv对接实盘的参考。tv也可以通过webhook对接fmz.com发明者量化交易平台。tv听说也有chrome插件之类的对接啥啥的。

我现在已经不是这种略显笨拙的方法去回测,去对接实盘。

因为不懂金融也不懂交易,我跟朋友通过tv上或者网络上别人开源的策略进行优化,然后把tv上用pine script语言写的脚本改写成python,在fmz上回测更精准,在fmz上对接实盘更容易一些,如此拾人牙慧(好可怜)~

script
script
script

钱没赚到,表情倒是收藏了一大堆!我还有几个难兄难弟等着我的策略上车致富呢~不说了,先跑个半年看看…