更多精彩内容,欢迎关注公众号:数量技术宅。想要获取本期分享的完整策略代码,请加技术宅微信: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)回测数字货币交易策略的更多相关文章

  1. 如何使用交易开拓者(TB)开发数字货币策略

    更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 为何使用交易开拓者(TB)作为回测工具 交易开拓者(后文以TB简称)是一个支持国内期货市场K线 ...

  2. 回测框架pybacktest简介(一)

    pybacktest 教程 本教程让你快速了解 pybacktest's 的功能.为此,我们回测精典交易策略移动平均线MA交叉. MA快线上穿慢线时,买进做多 MA快线下穿慢线时,卖出做空 进场规则, ...

  3. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...

  4. 量化投资学习笔记01——初识Pyalgotrade量化交易回测框架

    年初学习量化投资,一开始想自己从头写,还是受了C/C++的影响.结果困在了计算回测数据那里,结果老也不对,就暂时放下了.最近试了一下python的各个量化投资框架,发现一个能用的——pyalgotra ...

  5. FMZ发明者量化平台回测机制说明

    原文连接:https://www.fmz.com/digest-topic/4009 大部分策略在实盘之前都需要回测进行验证,FMZ支持部分品种数字货币现货.期货和永续合约,以及商品期货所有品种.但发 ...

  6. [LeetCode] Palindrome Number 验证回文数字

    Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. S ...

  7. javascript 实现一个回文数字

    写一个方法,让"1234"变成回文数字“1234321”,就是顺着读和倒着读都是一样的:注:不让用reverse()方法: function palindrome(str){ va ...

  8. 用Python编写的第一个回测程序

    用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...

  9. UVALive 2889(回文数字)

    题意:给定i,输出第i个回文数字. 分析:1,2,3,4,……,9------------------------------------------------------------------- ...

随机推荐

  1. 843. Guess the Word —— weekly contest 86

    题目链接:https://leetcode.com/problems/guess-the-word/description/ 占坑 据说要用启发式算法,可参考下述答案进行学习:https://leet ...

  2. .netcore 简单使用ElasticSearch

    .netcore 简单使用ElasticSearch(7.6) 最近在捣鼓学习了下ElasticSearch,在此记录下使用.netcore操作elastic search 的实现(简单的封装,使用) ...

  3. 【KataDaily 191015】Sort the Gift Code

    题目: Happy Holidays fellow Code Warriors! Santa's senior gift organizer Elf developed a way to repres ...

  4. z-index属性详解

    z-index属性详解 目录 z-index属性详解 一.定义和用法 二.代码 三.效果图 一.定义和用法 z-index属性指定一个元素的堆叠顺序,也就是z轴 position属性定义的是x轴和y轴 ...

  5. 【SpringBoot】05.SpringBoot整合Listener的两种方式

    SpringBoot整合Listener的两种方式: 1.通过注解扫描完成Listener组件的注册 创建一个类实现ServletContextListener (具体实现哪个Listener根据情况 ...

  6. Mybatis的二级缓存、使用Redis做二级缓存

    目录 什么是二级缓存? 1. 开启二级缓存 如何使用二级缓存: userCache和flushCache 2. 使用Redis实现二级缓存 如何使用 3. Redis二级缓存源码分析 什么是二级缓存? ...

  7. Statistical physics approaches to the complex Earth system(相关系统建模理念方法的摘要)

    本文翻译自"Statistical physics approaches to the complex Earth system",其虽然是针对复杂地球系统的统计物理方法的综述,但 ...

  8. 学习.NET 挑战赛

    今天访问dot.net 网站看到了一个学习.NET 挑战赛,发现已经赛程过半了,这是一个为那些想更多地了解 C# 和 .NET 的人举办的一个完全免费的课程活动,这些模块必须在 11 月底前完成.参加 ...

  9. Flutter 开发从 0 到 1(五)源码

    Flutter 开发从 0 到 1 明天开始又要上班了,你的假期任务完成如何啊?由于平时加班太多了,实在挤不出更多时间,从开始想用 Flutter <Flutter 开发从 0 到 1(一)需求 ...

  10. linux 进程间通信 共享内存 shmat

    系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shm ...