如何使用TradingView(TV)回测数字货币交易策略

更多精彩内容,欢迎关注公众号:数量技术宅。想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01
TradingView平台简介
前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做TradingView,希望技术宅能将分享的策略,用这个平台的语言改写。确实,有部分交易者,他们长时间在某个平台交易,适应了这个平台的操作,而有相当一部分平台,会提供量化交易的接口,或者内置一些简易的可编程语言,帮助大家实现指标计算、甚至是自动交易。

打开TradingView的主页,可以看到TradingView不加有数字货币的行情,还有A股、美股、外汇、黄金、大宗商品等外盘行情,我们在TradingView上编写的交易策略,不转换代码,即可在多市场进行测试。
关于Pine编辑器
TradingView可以说是 一个简单,易上手,且功能极其强大的交易图表工具,但它不仅仅是主观交易者的利器,还内置了一种叫Pine的编程语言,并有对应的Pine编译器,Pine可以获取到TradingView的所有交易历史数据,并且可以快捷、简便地编写一些基于K线的交易策略(熟悉交易开拓者的同学,可以将其类比为数字货币的TB)。
Pine编辑器的进入步骤很简单,首先,我们点开某一个品种,比如BTC/USD,选择右上角图形的“全功能图表”按钮。

进入后,选择下方的“Pine编辑器”,即可进入策略编写界面。

在编写我们的第一个TradingView策略前,先来简要看一下,Pine语言的基本语法。Pine语言,可以说,相对于时下最热门的Python语言的语法,简单了不少,技术宅甚至认为,没有什么编程基础的同学,经过我们这篇文章的引导,也能够写出一些简单的策略。Pine语言有一个语法参考手册,包含三部分内容,分布是运算子、内置变量、内置函数。运算子的部分比较好理解,大部分和我们常用的数学公式或常用的计算机语法类似,比如下图中的!=代表不等于,而%代表取余数。

内置变量,指的是系统内置的一些关键词,通过这些关键词可以直接获取到策略计算过程中所需要用到的关键数据,最典型的比如K线的开、高、低、收价格数据,以下图为例,在代码中调用close,可以直接获取到每根k线的收盘价,而open、high、low、volume同理,分别是k线的开盘价、最高价、最低价和成交量。

而内置函数中,最多的一类是技术指标,我们常见的技术指标,都可以在TradingView中找到对应的内置函数,比如RSI、ADX、KD、MACD、ATR等等,我们如果在策略中想要用某个技术指标,只需要调用该指标的名称,不必编写指标内部的计算公式,就能得到想要的结果了。语法手册中也有详细的例子,告诉你每个技术指标如何使用。

开始练手,双均线策略
双均线策略可以说是初学者最容易上手的一个策略了,交易规则很简单:当短期均线上穿长期均线,平空做多;当长期均线下穿短期均线,平多做空。我们以这样一个简单的策略,开启Pine语言的编程之路,来看我们是如何实现的:

策略总共有效代码,只有7行。第一行的strategy,相当于申明这个策略,第一个"My"是该策略的名称。接下来是一个判断变量longCondition, 大家不用纠结longCondition是什么数据类型,Pine脚本对于变量类型定义是开放式的,即赋给它什么类型,它就是什么类型。
我们再来看等号右边,crossover(sma(close,20),sma(close,60)),此处的close我们在前文已经知道,是k线的收盘价,而sma、crossover又分别代表什么?别着急,Pine编辑器有一个很好用的功能,只需要将鼠标放在关键词上,我们就能知道系统对于这个关键词(内置变量、内置函数)的定义。比如sma,系统提示我们,返回的是移动平均值。 同理,crossover和crossunder也可以通过同样方式获取解释(不得不说,真的好用)。

在理解了每个系统内置关键词的用法,我们就可以来翻译上述策略代码了。开多条件:20日收盘价均线上穿60日收盘价均线,如果满足开多条件,则以当时的价格平空做多1手,同时标记该信号为“My Long”;开空条件:20日收盘价均线下穿60日收盘价均线,如果满足开空条件,则以当时的价格平多做空1手,同时标记该信号为“My Short”。将该策略加载到想测试(交易)的K线图表上,可以看到“My Long”、“My Short”对应的交易信号标记。

当我们把策略信号加载到K线图表后,通过Pine编辑器右侧的策略测试器,就可以测试得到该策略的绩效。我们把这个策略应用到BTC的日线周期上,可以看到尽管策略很简单、很基础,它仍然是一个长期能够盈利的策略,但中间的回撤幅度会让人比较难受。

再实现一个类海龟策略
有了第一个练手的双均线策略的基础,我们再来一起实现一个比双均线策略略微复杂一点的类海龟交易策略。之所以称之为类海龟交易策略,是因为我们在海龟交易策略的唐奇安通道进、出场的基础之上,添加了一个不同周期的均线过滤,只有当均线和唐奇安通道同时满足多头或空头条件的时候,才会触发进场的操作。
我们分成三段来编写这个策略。首先第一段,还是在strategy方法中申明这个策略,然后,我们定义了3个参数变量,分别是唐奇安通道的进场周期20,唐奇安通道的出场周期10,以及均线的周期15。定义为input变量,是为了方便我们能够直接在Pine的测试界面修改参数数值,而不需要改动原始的代码。

策略的第二段,我们通过Pine内置的指标函数,分别定义了唐奇安通道进场、出场的上、下轨道,以及收盘价的均线,在代码中可以看到,每个K线所获取的high、low、close,我们都在后面加了[1],这是为了计算并取前1个K线周期的指标数据,以防止在当前的计算信号K线中用到未来的数据。

最后是策略第三段,开仓、平仓条件的判断与执行,此处为了避免连续开仓,引入系统内置变量strategy.position_size,该变量能自动读取策略的当前仓位。前4行是开仓的判断与操作,如果当前K线突破唐奇安通道上轨、前一个K线收盘价大于均线、并且此时策略没有做多仓位,则在突破价位进行做多的操作;如果当前K线突破唐奇安通道下轨、前一个K线收盘价小于均线、并且此时策略没有做空仓位,则在突破价位进行做空的操作。后4行是平仓的判断与操作,如果当前持有多头仓位,价格向下突破平仓唐奇安通道,平掉所有多头仓位,持有空头仓位,平仓逻辑相似。

我们将编辑好的策略加载到一个稍精细的周期:BTC4小时K线,并测试策略的绩效。可以看到下图中策略的信号以及回测结果,从测试情况来看,尽管策略逻辑不复杂,但仍可以在BTC的中周期,取得比较稳定的收益了,这也说明数字货币市场,是有着很多交易机会的。


我们不改变任何条件和参数,将策略移植到ETF这个同样是热门的数字货币品种上,策略依旧是有稳定的表现。TradingView提供了许多主流交易所的数字货币对,再包括外盘的商品、股指、A股等测试数据,都可以对所写的Pine语言策略进行测试,只需要修改图表左上方的品种,就能迅速完成品种的切换和策略的测试。动动手,说不定你能找到更优秀的策略。

如果你想要本次分享Pine语言策略的文本代码,欢迎加小编微信,与我交流。


往期干货分享推荐阅读
【数量技术宅|量化投资策略系列分享】基于指数移动平均的股指期货交易策略
AMA指标原作者Perry Kaufman 100+套交易策略源码分享
【数量技术宅|金融数据系列分享】套利策略的价差序列计算,恐怕没有你想的那么简单
【数量技术宅|量化投资策略系列分享】成熟交易者期货持仓跟随策略
【数量技术宅|金融数据分析系列分享】为什么中证500(IC)是最适合长期做多的指数
商品现货数据不好拿?商品季节性难跟踪?一键解决没烦恼的Python爬虫分享
【数量技术宅|金融数据分析系列分享】如何正确抄底商品期货、大宗商品
【数量技术宅|量化投资策略系列分享】股指期货IF分钟波动率统计策略
【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫
如何使用TradingView(TV)回测数字货币交易策略的更多相关文章
- 如何使用交易开拓者(TB)开发数字货币策略
更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 为何使用交易开拓者(TB)作为回测工具 交易开拓者(后文以TB简称)是一个支持国内期货市场K线 ...
- 回测框架pybacktest简介(一)
pybacktest 教程 本教程让你快速了解 pybacktest's 的功能.为此,我们回测精典交易策略移动平均线MA交叉. MA快线上穿慢线时,买进做多 MA快线下穿慢线时,卖出做空 进场规则, ...
- 手把手教你用Python搭建自己的量化回测框架【均值回归策略】
手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...
- 量化投资学习笔记01——初识Pyalgotrade量化交易回测框架
年初学习量化投资,一开始想自己从头写,还是受了C/C++的影响.结果困在了计算回测数据那里,结果老也不对,就暂时放下了.最近试了一下python的各个量化投资框架,发现一个能用的——pyalgotra ...
- FMZ发明者量化平台回测机制说明
原文连接:https://www.fmz.com/digest-topic/4009 大部分策略在实盘之前都需要回测进行验证,FMZ支持部分品种数字货币现货.期货和永续合约,以及商品期货所有品种.但发 ...
- [LeetCode] Palindrome Number 验证回文数字
Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. S ...
- javascript 实现一个回文数字
写一个方法,让"1234"变成回文数字“1234321”,就是顺着读和倒着读都是一样的:注:不让用reverse()方法: function palindrome(str){ va ...
- 用Python编写的第一个回测程序
用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...
- UVALive 2889(回文数字)
题意:给定i,输出第i个回文数字. 分析:1,2,3,4,……,9------------------------------------------------------------------- ...
随机推荐
- Linux__用户用户组和权限
用户用户组和权限 useradd +用户名, 添加这个用户 userdel +用户名, 删除这个用户(有残留 ) userdel -r +用户名, 彻底删除这个用户 groupadd +组名 ,添加这 ...
- MySQL全面瓦解6:查询的基本操作
概述 提到查询,就回到我们第四篇的SQL语言分类了,DQL(Data QueryLanguage),也就是数据查询语言,实际就是从数据库中获取数据的一种命令方式.我们给数据库发送一个查询语句的命令,数 ...
- 老大说新项目的结构和 xxx 项目一样就可以了,我 ……(使用 Maven Archetype 快速创建项目)
前言 又要开发新项目了,还是创建新项目,怎么办?老大说按照 xxx 项目的结构创建一个新项目就可以了. 公众号:liuzhihangs,记录工作学习中的技术.开发及源码笔记:时不时分享一些生活中的见闻 ...
- 对于button元素的理解
button有四种常用的类型: submit: 此按钮将表单数据提交给服务器.如果未指定属性,或者属性动态更改为空值或无效值,则此值为默认值. reset: 此按钮重置所有组件为初始值. butt ...
- (4)ASP.NET Core3.1 Ocelot负载均衡
1.负载均衡 Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求.负载均衡类型:●LeastConnection:根据服务正在处理请求量的情况来决定哪个服务 ...
- 利用ms08_067入侵window xp sp1(English)版本
前几天上课,老师搬出实验,自己体验了一下 1.环境配置 需要准备kali(攻击机),window xp (我这里是sp1 英文版本,标题很清楚了),攻击机和目标靶机要在同意网段下我的kali(192. ...
- Pytest系列(八) - 自定义标记mark的使用
一.前言: pytest 支持自定义标记,自定义标记方便用例模块划分,也可以理解方便管理,配合标记参数 -m使用 二.示例代码 # -*- coding: utf-8 -*- # @Time : 20 ...
- <摘自>飞:jxl简析[ http://www.emlog.net/fei ]
<摘自>飞:jxl简析:http://www.emlog.net/fei 最近,完成了一个网上报表系统,刚巧用到了一个 JAVA 操作 excel 表格的 API .闲来无事,就将其大概的 ...
- 模块化-CommonJs、AMD、CMD、ES6
在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理.模块化是一种处理复 ...
- NO.A.0001——FIO工具使用教程
一.FIO工具安装: 1.FIO地址: 官网地址:http://freecode.com/projects/fio/ 源码安装包:http://brick.kernel.dk/snaps/fio-2. ...