资源加载中... loading...

商品期货量化交易-TradingviewPine语言基础课程

Author: ianzeng123, Created: 2024-10-22 13:31:29, Updated: 2024-11-15 09:50:36

[TOC]

商品期货量化交易-TradingviewPine语言基础课程

(一):Pine语言和优宽量化平台介绍

量化交易及其应用

量化投资是指以获取稳定收益为目的,通过量化方法和计算机程序发出指令的交易方式。它主要是通过数学模型把投资理念表达出来,然后由计算机生成交易策略。量化投资是多种技术的结合。在策略制定过程中,通常利用数学、几何、心理学甚至仿生学的知识来实现择时交易、统计套利和风险规避。量化交易在一定程度上克服了人性的弱点,使人更加理性。越来越多的学者认为,量化交易将是未来处理金融市场最重要的方式。

量化交易作为科学与机器的结合的产物, 正在改变着现代金融市场的格局。 目前,中国的量化投资领域仍处于起步阶段。目前,在欧美等发达经济体资本市场,机构量化交易占比已达70%左右。而在境内市场上,量化交易的行业规模已超万亿元,有研究认为,量化交易在A股市场的成交占比达两成左右。麦肯锡公司于2021年估计,以个人金融资产计算,中国已成为全球第二大财富管理市场,作为全球增长最快的资产管理市场,中国的量化交易机构市场有很大的成长空间。

作为个体投资者而言,“量化交易” 是高端大气、 一夜暴富的代名词。量化交易最大的引力在于“躺着赚钱”,通过设定好的程序语言和服务器,构建出“完美无缺” 的交易策略,实现财富的复合增长,这无疑是广大量化入门爱好者终极梦想。然而,在一定程度上,量化交易已经被神话了。如果小伙伴们不想被“量化的镰刀”割到,不妨从今天开始,做一个“量化人儿”,也许没有你想象的那么难!

中国期货市场的量化交易

期货作为相对于股票和债券的风险最大的金融产品,其收益率呈现最高水平。期货合约由于其特殊的 T+0 交易机制、杠杆交易、较强的流动性、卖空交易等特点,受到投资者的追捧,将其广泛用于投机、套利和对冲交易之中。近年来,中国期货市场的规模迅速扩大扩张中。期货市场目前发展至72个品种,投资者也在逐渐壮大,对投资的要求逐渐提高。

在期货市场中,绝大部分散户投资者目前仍采用以自身经验或基本面分析为主的主观逻辑上的人工手动交易,随着判断层面因素的复杂程度和数量繁多,宏观经济走势、热点新闻、 K 线趋势、个人经验等各方面因素都影响着投资者的价值判断,甚至无法摆脱人性的弱点,这种人工操作的情绪化问题使得投资者不能在重大损失面前理性出逃,也不能在重大利好之际见好就收。

量化交易在这个信息迅速发展的时代对人性的情绪管理、机器学习和相关因素设计等方面独具有绝对的优势。量化研究是在大数据的背景之下,通过对历史数据的归纳和分析,利用统计建模等方法不断优化改进,寻求期货市场长期可盈利的交易模式,相信这是每一位Quanter的挑战目标。

量化交易劝退(打气)指南

量化投资是一门复合型学问,涉及到数学、统计、金融、编程等多方面知识,其中编程能力是量化的门槛。因为量化是个很大的领域,不同方向有着不同的编程要求,所以不能一概而论。但最基本的需要在matlab,python,r里面至少会一门。如果要做高频方面的话,还要会C++。然而,这些语言需要极大的学习成本和时间成本,不少初入门者因此劝退。

然而,量化的门槛真的是高不可攀吗?非也非也,正如懒惰是人类第一的生产力,我们金融弄潮儿也有自己的跃龙门方式,下面将为大家介绍量化入门的重磅利器:Pine语言和优宽量化平台。

TradingviewPine语言

Pine语言,起源于TradingView平台。TradingView作为国外最热门的一个金融平台,是一个价格图表分析网站,这里有股票,外汇,数字货币等等,很多数字货币交易所都内嵌了它的图表。TradingView有一个很好的语言载体:Pine脚本,它允许任何人开发自己的量化策略应用到金融产品中并进行收益的回测展示。

Pine语言,作为一门专门为交易而生的语言,它对很多指标函数都进行了封装。相对于Python语言的复杂(代码量大)和My语言的死板(不能进行复杂的策略),它更加的简洁和灵活。所以在实现轻量化代码的过程中,降低了普通交易者的量化门槛。

商品期货量化交易-TradingviewPine语言基础课程

优宽量化平台

Tradingview作为一个国外的交易平台,通常需要我们“跋山涉水”去使用它;在同时,Tradingview上的开源策略数量数目繁多且更新很快,很多优秀的策略、思路、指标不能实盘着实令人遗憾。

作为致力于把量化交易技术普及给众多交易者的优宽平台,目前已支持Pine语言编写策略,支持回测、实盘运行Pine语言策略,兼容Pine语言的较低版本。优宽不仅支持了Pine语言,同时也支持Pine语言强大的画图功能。优宽平台上的各项功能、丰富实用的工具、高效便捷的管理,也进一步增强了Pine策略(脚本)的实用性。优宽基于对Pine语言的兼容,同时也对Pine语言进行了一定程度的扩展、优化、裁剪。

商品期货量化交易-TradingviewPine语言基础课程

优宽量化平台功能

优宽量化工具(https://youquant.com)对小白友好, 即便你是零基础, 也可以根据里面的工具体验量化的魅力。 该工具是面向高频交易设计, 在性能和安全上有严苛的要求。 支持高频策略、 套利策略、 趋势策略。 并且它集成了策略开发、 测试、 优化、 模拟、 实盘交易的完整流程。 在优宽量化交易平台,在初期你可以模拟、围观、回测大佬的成熟策略,在后期可以学习、编写、分享、买卖自己的量化策略,实现从量化模仿小白到市场实操大佬的转变。

优宽平台支持商品期货与易盛外盘期货, 也支持腾讯富途证券美股、港股、A股以及中泰证券XTP等实盘量化交易。优宽适用于量化交易初学者,即使无基础也可以快速入门,平台功能强大灵活,可以满足不同层次量化爱好者需要。

(二):优宽量化平台使用指南(1)

Hello, 大家好,在上节课的基础上,我们了解了量化交易的入门利器-Pine语言和优宽量化平台,相信很多小伙伴们已经迫不及待的大展身手了,现在,我们来开始吧。

本节课我将带领大家先了解一下优宽量化交易平台,作为一个宝藏网站,这里有很多资源可以免费去探索!

作为一个专业的量化社区,在这里你可以学习编写量化交易策略,也可以免费在线回撤和使用模拟盘交易,还可以围观大佬们的实盘和进行手动交易。而且不同于其他交易软件需要下载相应的客户端,优宽平台用户可以依托于云端服务器或者个人设备所部署的托管者程序,直接和优宽网站进行通信,传递日志,访问交易所获取行情和实盘交易。当然,如果各位小伙伴们成长成了大佬,也可以将自己的策略进行分享和买卖。

我相信各位小伙伴们不乏卧虎藏龙之辈,因此优宽平台不仅支持支持简单的Pine语言,可视化编程语言及文华财经的My语言等,也支持JavaScript、Python以及c++高级语言,也同时支持免费仿真交易,极大降低了各位小伙伴们的学习探索成本。在安全性上,大家大可放心,优宽量化交易平台用户开发的策略也仅账户持有者自己可见,除非用户自己公开分享策略,平台不会保存用户密码明文,从而极大提高了数据的安全性。

商品期货量化交易-TradingviewPine语言基础课程

注册登录

首先,我们需要进行优宽量化交易平台的账号注册。首先我们进入优宽量化交易平台官网,然后看到主界面有一个右上方有一个注册按钮,点击它进入注册,在这里我们需要提前准备一个常用的邮箱,然后这边就是起一个用户名,然后设置一个密码,然后点击注册,这里会有一个授权码,我们要去设置的邮箱获取注册认证,完成平台注册之后,我们一定要把平台的密码保存好,因为后续我们在部署托管者的时候,还需要平台的登录密码进行验证。

商品期货量化交易-TradingviewPine语言基础课程

第一个策略

注册成功之后,我们登录去熟悉一下优宽量化交易平台的界面内容及功能。首先我们看顶端栏的介绍,控制中心就是平台用户的操作界面,策略,就是策略广场 (https://www.youquant.com/square),平台用户公开和出售策略就在这里,可以点击相应的标签筛选不同种类的策略。

商品期货量化交易-TradingviewPine语言基础课程

在这里策略广场中的策略都是公开的,各位小伙伴们可以挑选感兴趣的策略,验证其有效性。我们随机点击一个策略进入,在这里你可以看到策略的原理解释,参数设置和策略的源码,然后点击“完整复制并进行在线回测”,可以进入策略编辑界面,然后点击“开始回测”,添加平台,再点击“开始回测”,随后就可以看到模拟账户的收益,行情数据,收益概览和具体的日志信息,这里包括了具体的开仓和平仓操作。是不是很简单,大佬的起点都是从模仿开始的。大家可以挑选不同的策略,应用于自己感兴趣的证券或者期货品种进行在线回测测试,验证策略的有效性。

商品期货量化交易-TradingviewPine语言基础课程

实盘围观

让我们回到上方顶端栏围观板块(https://www.youquant.com/live),小伙伴们会担心策略的实盘结果,在这里你就可以进行大佬的正在运行的实盘检阅,点击进入不同的策略,可以看到一直在进行的策略的运行结果和收益状况。

商品期货量化交易-TradingviewPine语言基础课程

文库讲解

小伙伴在入门的时候肯定会有很多问题,因此可以点击后面的三个板块寻找解答。文库(https://www.youquant.com/digest)主要是官方出品的一些精品文章,包括各种策略的逻辑讲解,以及最新的行业前沿知识。

商品期货量化交易-TradingviewPine语言基础课程

社区讲解

社区(https://www.youquant.com/bbs)主要是用户平台用户发帖提问交流的一些平台,在这里也有优宽平台使用的讲解和量化交易的教程,当然如果有一些问题实在找不到答案的话,你可以创建主题进行提交,各位热心大佬会帮你解决。

商品期货量化交易-TradingviewPine语言基础课程

Api文档

API文档主要是一些用平台编写策略所需的API介绍(https://www.youquant.com/api),包括还有如果有一些问题,我们都可以在里面去搜索查询。

商品期货量化交易-TradingviewPine语言基础课程

相信各位小伙伴们最感兴趣的还是如何通过优宽平台进行自己的实盘交易,下一节课我们将讲解如何搭建自己的量化Robot进行实时的交易。下节课再见!

(三):优宽量化平台使用指南(2)

大家好,上节课我们了解了优宽平台的顶端栏模块,这里有很多的量化交易策略和平台操作资源,大家可以熟悉下,在实盘操作有问题的时候可以及时查询,找到答案所在。

控制中心主页

这节课我们来熟悉下用户控制中心,这里就是你组装你的量化系统引擎的地方。首先,我们看到的是控制中心主页,概览可以快速浏览你的实盘配置,账单这里可以清楚显示你的账户金额信息,快捷方式提供了策略代码编写,数据查询和探索的快捷方式,最后是消息中心,当账户或者策略实盘模拟出现问题的时候,这里就会及时提醒。

商品期货量化交易-TradingviewPine语言基础课程

一个完整的量化交易由三个部分组成,第一个部分是你的策略,第二个部分是你的期货交易账户,也就是交易所,第三个部分是策略托管的robot,就是这个托管者。来让我们进行逐一的设置。

策略库

策略库,就是你存放量化武器弹药的地方。通过点击新建策略,你就可以进行策略编写,在这里选择不同的语言进行代码的编写,笔记,描述,手册可以记录你的策略的灵感来源,执行逻辑和使用程序,方便策略的复盘和更新。当然,身为一个初学者,你可以直接运用策略库里的成熟的代码进行实盘模拟和回测。

商品期货量化交易-TradingviewPine语言基础课程

当你编写好策略后,点击操作项,这里由分享和出租两个选项,分享就是分享此策略源码,分为内部分享和外部分享,内部分享会让你选择分享有效期、分享次数之后会生成该策略的复制页面地址和复制码。可以分发给指定的优宽平台用户,需求该策略的用户只需使用复制页面地址链接,登录复制页面后输入复制码即可获取该策略,获取后策略自动会在策略库中出现。

商品期货量化交易-TradingviewPine语言基础课程

出租分为公开出售:点击「出租」按钮后会弹出对话框,可以选择「公开出售」。策略即可申请上架(需要通过审核)。内部出售:点击「出租」按钮后会弹出对话框,可以选择「内部出售」。选择使用天数、最多并发、注册码个数之后会生成该策略的注册页面地址和注册码。可以分发给指定的优宽平台用户,需求该策略的用户只需使用注册页面地址链接,登录注册页面后输入注册码即可获取策略的使用权。策略也会出现在策略库中,不过只有回测、实盘使用权,看不到策略源码等信息。重要提示,在创建、分发策略注册码时请务必仔细确认是「注册码」还是「复制码」。以免误将策略分享出去。

商品期货量化交易-TradingviewPine语言基础课程

策略库也有分组管理功能,通过设置不同的分组,将你的策略直接拖动放入分组进行分门别类,方便以后观看。

交易所设置

策略需要和交易所对接才能进行期货的买卖。点击交易所,点击添加交易所,进行交易所的账号配置。点击期货CTP协议,当然这里也许期货外盘和证券协议,期货公司这里选择你的开户公司,身为一个量化初学者,你可以选择选择上期模拟(SimNow)账号。上期模拟需要你登陆(https://www.simnow.com.cn/),进行注册账号,注册完成后需要一次密码修改,这样才能使用。然后点击投资者登录,这里有你的investorId账号,请记录下来。填写到交易账号这里,输入交易密码,其它的信息都会自动填写完成。点击“添加交易所”,这样你的期货账户就设置成功了,当然你也可以添加真实的账户,优宽平台和宏源,国泰君安公司都有良好的合作关系,通过平台进行账户开户可享最优手续费。期货账户开户以后,进行量化交易需要进行看穿式认证。社区这里有篇文章大家可以看下( https://www.youquant.com/bbs-topic/8436)。

商品期货量化交易-TradingviewPine语言基础课程

托管者设置

量化引擎的最后一个部分就是托管者。托管者需要在交易时间段,持续稳定的运行你的量化策略进行交易。点击进入,点击部署托管者,这里可以根据你的需要首先选择托管者服务器,你可以选择部署在云端,需要租用服务器,或者本地。首先根据你的需要linux/mac/Windows,进行云端部署或者本地部署,云端部署这里有详细的参考手册可以看( https://www.youquant.com/bbs-topic/8290)。下面以linus为例,首先需要租用一个服务器,一个轻量的价格比较低廉的服务器就可以,服务器可以选择centos系统安装完成后,

  • 第一步,在服务器输入 wget https://www.youquant.com/dist/robot_linux_amd64.tar.gz 下载robot;
  • 第二步,输入 tar -xzvf robot_linux_amd64.tar.gz 进行robot解压;
  • 第三步,测试托管者运行 chmod +x robot ./robot -s node.youquant.com/xxxxxx -p your优宽password xxxxxx为node, -p后面添加密码;
  • 第四步,当出现 Login OK 就代表云端托管者设置成功。

商品期货量化交易-TradingviewPine语言基础课程

通过身为初学者,你可以选择部署在本地。windows这里以64位界面版进行操作,点击下载,进行解压安装,点击打开robot,输入地址,和你的优宽平台登录密码,当显示login Ok的时候,你的托管者已经部署好了。在策略运行的期间,请确保这个窗口不要关闭。

商品期货量化交易-TradingviewPine语言基础课程

优宽平台同时也有一键租用托管者入口,大家可以根据自己的需要进行选择。

商品期货量化交易-TradingviewPine语言基础课程

创建实盘

现在让我们来创建一个实盘看看,点击实盘,点击创建实盘,命名你的策略名称,期货模拟test,托管主机选择你刚才的托管者,选择运行策略,点击交易平台,点击创建实盘,进入。可以看到你的日志信息,当显示连接成功,你的实盘就已经运行起来了。温馨提示,当你的实盘出现login error的时候,你可以检查下是否是交易所设置的问题,比如交易账户和交易密码是否填写有问题。实盘运行起来后,点击“交易终端”,你就可以看到实盘运行情况。优宽量化交易平台提供模块化、定制化的交易终端页面。可以自由添加各种数据模块、交易功能模块,甚至可以自己编写代码开发模块(交易终端插件)。凭借着高度灵活自由的使用方式也极大方便了手动交易、半程序化交易的用户。交易终端页面上的各种模块均可以拖动、缩放,可以修改模块绑定的交易对、交易所等设置,可以添加多个同类型的模块。如果你想通过手机或邮箱接受实盘运行错误,你可以选择监控,你的手机和邮箱可以及时接到报警错误。当然,非交易时段内你也可以停止实盘,直接点击停止就好,后续也可以重启。当然实盘运行的时候,是需要付费的,0.125一个小时,每天交易时间段(八个小时)不间断运行每月花费30元左右,加上每月的服务器租用费用,一个量化交易系统搭建的费用在50元左右。在实盘运行过程中,有任何问题你都可以通过“发起工单”向平台工作人员发起提问获得及时的回复。

商品期货量化交易-TradingviewPine语言基础课程

商品期货量化交易-TradingviewPine语言基础课程

对比于其它量化平台,优宽省略了复杂的API索取和调用,托管者的设置也更为简便,策略的编写具有更多成熟的框架参考,因此使用起来对量化爱好入门者是十分贴心的。如果你感兴趣的话,可以立即动手尝试。当然如果你有任何的问题,都可以在下方评论板块提出问题,我也将及时答复。我们下节课再见!

(四):Pine语言编辑器窗口和代码结构

大家好,从今天起,我们就要学习一门新的语言-Pine语言。如果你是java或者python用户,Pine语言的灵活简洁一定会让你的量化入门之路格外轻松。在保留完整语言和交易逻辑的基础上,Pine语言对很多交易的指标和函数都进行了封装,不需要让你重新import packages,轻松的指标的计算,清晰的图表展示,简洁的交易逻辑的判断,直到最后和市场对接的交易指令,可以这样说,Pine语言是一门专门为交易而生的语言。

如果你是一个量化新手,犹豫在Pine语言和文化财经麦语言之间,害怕高额的时间成本和学习成本的无用功,这里也请不用担心。相对于麦语言,Pine语言能实现的量化策略更多也更为灵活,并且在掌握Pine语言交易逻辑的基础上,对于麦语言的入门会起到事半功倍的效果。

Pine语言作为国外平台tradingview的交易脚本语言,需要我们跋山涉水的翻墙使用,而庆幸的是,优宽量化交易平台对Pine语言进行了完美的移植,在保留Pine语言简洁优雅属性的同时,优宽平台又对Pine语言进行了进一步的封装和改动,让量化爱好入门者使用起来更为轻松简便。

当然,熟练掌握一门完整的语言需要大家长久的努力,很高兴成为大家Pine语言教学的领路人,也许我们都习惯于害怕未知山峰的高度和自己残余勇气的不足,但请相信,努力终会有回报。让我们开始今天的课程吧!

编辑器窗口

本节课的课程是Pine语言的代码编辑器窗口和代码结构的讲解。作为一门计算机语言,一千个人都一千个钟爱的哈姆雷特编辑器。幸好,优宽平台解决了这个问题。不需要部署任何软件和服务器,优宽提供了在线的回测系统,通过丰富的图表和数据统计功能,及时的对量化策略进行收益的回测展示,减轻了大家的学习压力和理解难度。

首先我们登录了优宽量化交易平台,然后可以在控制中心快捷方式点击“新建策略”。这样我们进入了策略编辑页面,语言我们选择Pinescript,界面中显示了一个简单的例子,通过定义策略名称,我们就可以创建这个策略。

商品期货量化交易-TradingviewPine语言基础课程

在编辑器的右上角,有一些按钮可以方便我们进行策略编辑:

商品期货量化交易-TradingviewPine语言基础课程

  • 1. “保存”,“下载源码”,“导入/导出源码”可以帮助我们迅速的进行策略的导入导出和保存。
  • 2. “皮肤-eclipse”提供了一系列的皮肤选项,大家可以根据自己的编辑习惯进行选择;

商品期货量化交易-TradingviewPine语言基础课程

  • 3. “开启Vim模式”提供了Vim的开启和关闭按钮,大家也可以根据自己的代码书写习惯进行开关。

脚本结构

策略编辑页面是编写这个派语言策略代码的地方,我们可以先删掉这个默认的代码。 Tv上Pine中代码遵循的一般结构:

<version>
<declaration_statement>
<code>

优宽对tv上的pine语言的脚本结构做了更为简洁的改进。在tv中,我们需要在首行指定脚本的版本(//@version=5),在优宽平台上不用,因为优宽平台的默认脚本即是version 5,当然你也可以指定其它版本的脚本(//@version=4),优宽也支持运行。

对于第二部分declaration statement,声明语句确定脚本的类型,这又决定了其中允许哪些内容,以及如何使用和执行。设置脚本的关键属性,比如它的名称,当它被添加到图表中时,它将出现在哪里,它所显示的数值的精度和格式,以及管理其运行时行为的某些数值,比如它将在图表中显示的最大绘图对象数量。对于策略,属性包括控制回测的参数,如初始资本、佣金、滑点等。而这些优宽平台封装在了Pine语言交易类库里,点击开始回测,通过设置不同的参数,你就可以对交易的参数进行设置,比如交易的设置,期货品种的选项,实盘的选项和现货的交易等,这些参数我将在后续Pine语言交易逻辑里面进行详细的讲解。

商品期货量化交易-TradingviewPine语言基础课程

通过优宽对于Pine语言的封装,因此Pine语言不要求一个策略代码必须包含indicator()或者strategy()声明语句。因为优宽量化上本身就是可以实盘,因此也不区分这个画图和实盘的声明。

第三部分是代码板块,脚本中不是注释或编译器指令的行是语句,它实现了脚本的算法。脚本语句可以分为 * 1. 变量声明 * 2. 变量的重新赋值 * 3. 函数声明 * 4. 内置函数调用,用户定义的函数调用 * 5. if,for,while或switch等结构

单行语句

有些语句可以用一行来表达,比如大多数变量声明、只包含一个函数调用的行或单行函数声明。多个单行语句可以通过使用逗号(,)作为分隔符在一行中串联起来。

var a = close[1]
var a = close[1], var b = open[1]

局部块语句

其他的,像结构,总是需要多行,因为它们需要一个局部的块。脚本的全局范围内的语句(即不属于局部块的部分)不能以空格或制表符(tab键)开始。它们的第一个字符也必须是该行的第一个字符。在行的第一个位置开始的行,根据定义成为脚本的全局范围的一部分。结构或多行函数声明总是需要一个local block。一个本地块必须缩进一个制表符或四个空格(否则,会被解析为上一行的串联代码,即被判定为上一行代码的连续内容),每个局部块定义了一个不同的局部范围。

plotColor = if barIsUp()            // 变量声明 (全局范围)
    color.green                     // 本地块 (本地范围)
else
    color.red                       // 本地块 (本地范围)

换行代码

长行可以被分割在多行上,或被 “包裹”起来。被包裹的行必须缩进任何数量的空格,只要它不是4的倍数(这些边界用于缩进局部块)。

a = open + high + low + close 可以被包装成(注意每行缩进的空格数量都不是4的倍数):

a = open +
     high +
         low +
            close

注释

一行中可以包含注释,也可以只是注释。

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // 计算MACD指标

/*
plot函数在图表上画出指标线
*/

好了,本节课Pine语言的编辑器介绍和脚本结构介绍就到此为此了,我们下节课再见!

(五):Pine语言类型系统讲解(1):Forms

大家好,上节课我们了解了在优宽平台上Pine语言的脚本结构,本节课我们的内容集中于Pine语言的类型系统讲解。Pine Script的类型系统很重要,因为它决定了在调用Pine Script函数时可以使用什么样的值,这是在Pine语言中做任何事情的必要条件。 虽然可以在不了解类型系统的情况下编写非常简单的脚本, 然而对它的合理理解对于实现Pine语言的熟练应用是必要的, 深入了解其微妙之处将使您能够充分发挥 Pine语言的潜力。

吸收了面向对象语言的优点,Pine语言的类型系统的定义和使用也是清晰明了。Pine语言是一门专门为交易而生的语言,因此Pine语言类型系统的设定也与交易逻辑的设定一致。交易是流动的,而策略就是使用参数构建的算法去捕捉交易的流动趋势. 因此不仅需要type确定参数的性质,还需要form描述一个参数定义的时间。Pine语言使用form-type对来描述所有的值。通过不同的参数时间(form)和性质(type)的确定,一个优秀的策略尝试着去拟合千变万化的金融市场,发现本质规律,进而预见可能性的收益机会。

Forms

当Pine脚本被加载到图表上时,它在每个历史条上执行一次,使用每个条的可用OHLCV(开盘open、最高high、最低low、收盘close、成交量volumn)值。一旦脚本的执行到达数据集的最右边的条形,如果目前交易活跃,那么Pine 指标将在每次更新发生时执行一次,即价格或成交量变化。Pine 策略默认只在最右边的条形图收盘时执行,但它们也可以被配置为在每次更新时执行,就像指标那样。

所有的符号/时间框架对都有一个数据集包括有限数量的条形图。当你向左滚动图表以查看数据集的早期条形时,相应的条形会在图表上加载。当脚本第一次在图表上运行时,数据集中的所有条形图都是历史条形图,除了最右边的条形图,如果交易时段是活跃的。当交易进行时候在最右边的条形图上,它被称为实时条形图。当检测到价格或成交量的变化时,实时条就会更新。当实时条形图关闭时,它将成为一个失效的实时条形图,并打开一个新的实时条形图。

商品期货量化交易-TradingviewPine语言基础课程

我们如今尝试的交易系统,是利用历史信息,运用算法寻找其中的规律搭建模型。利用大数据的优势,模型搭建完成之后,我们需要不断调整模型的参数,而输入的数据信息也是伴随着市场源源不断整体流动的,因此在模型设定初期,我们需要设定不同模型参数确定的时间。

Pine语言forms确定了变量的值是何时已知的。共分四种类型: * “const”表示编译时已知的值(向图表添加指示符或将其保存在Pine脚本中时确定的)。

  • “input”表示输入时已知的值(当脚本的“设置/输入”选项卡中的值发生更改时设定)。

  • “simple”表示柱线 0 处已知的值(当脚本开始在图表的第一个历史柱上执行时设定)。

  • “series”表示每个柱上已知的值(在任何柱上执行脚本期间的任何时间设定)。

Forms按以下层次结构进行组织:const < simple < series < input,例如,其中“const”被认为是比“input”弱的形式,而“series”比”simple”强。 表达式的结果始终是表达式计算中使用的最强形式。此外,一旦变量获得更强的形式,该状态是不可逆的; 它永远无法转换回较弱的形式。因此,“series形式的变量永远不能转换回“simple”形式,以便与需要该形式参数的函数一起使用。

请注意,在所有这些形式中,只有“series”形式允许值在脚本执行期间动态更改图表历史记录的每个柱线。一旦脚本开始执行,“const”、“input”或“simple”形式的变量就不能更改。

Const

“Const”形式的值必须在编译时知道,然后脚本才能访问与其正在运行的交易品种/时间帧信息相关的任何信息。 当您在Pine脚本编辑器中保存脚本™时,就会进行编译,这甚至不需要它已经在图表上运行。“Const”变量在脚本执行期间不能更改。

整形 int: 1, -1, 42
浮点型 float: 1., 1.0, 3.14, 6.02E-23, 3e8
布尔型 bool: true, false
字符 string: "优宽"
颜色 color: #FF55C6, #FF55C6ff

Input

当确定通过函数初始化的值时,“输入”形式的值是已知的。 这些函数确定脚本用户可以在脚本的“设置/输入”选项卡中修改的值。 当这些值发生更改时,这总是会触发从图表历史的开头(柱线零)重新执行脚本, 因此,“input”形式的变量在脚本开始执行时始终是已知的,并且在脚本执行期间它们不会更改。凡是需要“input”形式的地方,也可以使用“const”。

在优宽上的input函数和在Trading View上的有些不同,不过该函数都是作为策略参数的赋值输入使用。input函数的几个主要参数如下所示:

  • defval :作为input函数设置的策略参数选项的默认值,支持Pine语言的内置变量、数值、字符串
  • title :策略在实盘/回测的策略界面上显示的参数名称。
  • tooltip :策略参数的提示信息,当鼠标悬停在策略参数上会显示出这个参数设置的文本信息。
  • group :策略参数分组名称,可以给参数分组。

在声明变量时给变量赋值,经常使用的就是input函数,在优宽上input函数会在优宽策略界面自动画出用于设置策略参数的控件。优宽上支持的控件目前有数值输入框、文本输入框、下拉框、布尔值勾选。并且可以设置策略参数分组、设置参数的提示文本信息等功能。下面我们来通过一个例子详细说明input函数在优宽上的使用:

param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")

ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)

商品期货量化交易-TradingviewPine语言基础课程

Simple

只有当脚本在图表历史记录的第一个栏上开始执行时,“simple” forms的值才是已知的,并且在脚本执行过程中这些值永远不会改变。例如,syminfo.*等系列的内置变量都返回“simple”形式的结果,因为它们的值取决于图表的品种,只有在脚本对其执行时才能检测到。在需要“simple”格式的地方,也可以使用“const”或“input”格式。

runtime.log(syminfo.ticker)
runtime.log(timeframe.period)
runtime.error('stop')

商品期货量化交易-TradingviewPine语言基础课程

Series

“Series ”形式的值提供了最大的灵活性,因为它们可以在任何柱上更改, 甚至在同一根柱线中多次,例如循环。 开盘价(open)、收盘价(close)、最高价(high)、时间(time)或交易量(volume)等内置变量是“series”形式, 就像使用它们计算的表达式的结果一样. “Series ”会改变柱线, 用于访问时间序列的过去值的 [] 历史引用运算符也是如此。凡是需要“series ”形式的地方,也可以使用其他三种形式代替。

strategy(overlay=true)
a = close + 100
b = close[1] + 100
plot(a, title='close', color=color.black)
plot(b, title='close[1]', color=color.blue)

商品期货量化交易-TradingviewPine语言基础课程

本节课,我们学习了Pine语言的类型系统的forms。可以发现,对比于其它多功能的语言(如python,c++等),Pine语言更加纯粹与精巧。因此对于Pine语言的学习,在除去死板的语法结构之外,我希望和大家一起探讨的是,对于整个市场和交易的理解,运用代码去尝试庖丁解牛,即将自身的交易逻辑和心得用Pine语言的形式进行交易的梳理和建构。我们下节课再见!

(六):Pine语言类型系统讲解(2):Types

大家好,上节课我们了解了Pine语言类型系统的Forms,Forms确定了Pine语言参数确定的时间,本节课我们将继续讲述Pine语言的类型系统之Types。Types确定参数的性质,types有基本类型(int, float, bool, color and string),还有特殊类型(array, na, 和元组tuples等)。本节课我们就这些常用的参数types和使用方法展开介绍。

优宽平台对Pine语言是进行了一定程度的封装,因此它和Tradingview上的Pine语言有所不同,请大家注意辨别。如果大家在优宽平台模仿tv的策略时,发生报错的情况下,大家可以查阅下https://www.youquant.com/bbs-topic/9326这本pine语言使用手册,检查一下优宽是否对某些函数进行了封装,然后对应修改下tv上的pine语言脚本。当然,在后续的时期,我们也会继续完善优宽上的Pine语言,使其更加适合量化爱好入门者使用。

首先我们讲解下Pine语言的基本type类型:

Int

整数值必须写成十进制,例如:

1
-1
750

bar_index、 time、 timenow等内置变量 都返回“int”类型的值。

Float

浮点数包含一个小数点,也可能包含符号e或者E (表示“乘以 10 的 X 次方”,其中 X 是符号之后的数字e),例如:

3.14159    
-3.0
6.02e23    // 6.02 * 10^23 
1.6e-19    // 1.6 * 10^-19 

String

字符串文字可以用单引号或双引号括起来,单引号和双引号在功能上是等价的。你可以使用运算符“+”连接字符串。

A = "优宽"
B = '优宽'
//C = '优宽" //error
C = '优宽"'
D = A + B

runtime.log(A, B, C, D)
runtime.error('stop')

布尔值

只有两个文字表示bool值:

true    // 真值
false   // 假值

类型转换

Pine语言中有一个自动类型转换机制,可以将某些类型转换(或转换)为另一种类型。自动转换规则是:“int”🠆“float”🠆“bool”,这意味着当需要“float”时,可以使用“int”代替它,当需要“bool”值时,可以使用“int”或“float”值代替它。在优宽平台对Pine语言进行了一定程度的封装和改进,例如在tv上这段代码会报错,而在优宽平台,float/string类型会自动转换为int运行。

indicator("")
len = 10.0
len1 = '10'
s = ta.sma(close, len) // tv报错
s = ta.sma(close, len1) // tv报错
plot(s)

Color

颜色文字具有以下格式:#RRGGBB或#RRGGBBAA。其中:RR,GG和BB是红色、绿色和蓝色分量的值。 AA是颜色透明度(或alpha分量)的可选值,其中00是不可见,FF是完全可见的。

例子:

#000000      // black color
#FF0000      // red color
#00FF00      // green color
#FF000050    // 50% transparent red color
#FF000000    // completely transparent color

Pine Script还具有内置颜色常量,例如 color.green、 color.red、 color.orange、 color.blue (plot()和其他绘图函数中使用的默认颜色)等。使用内置颜色时,可以使用 color.new向它们添加透明度信息。

#FF000050  == color.new(#FF0000, 50)  // 50% transparent red color
strategy(overlay=false)
p1 = plot(high)
p2 = plot(low)
fill(p1, p2, color=color.new(#FF0000, 80))
fill(p1, p2, color=#FF000080)

商品期货量化交易-TradingviewPine语言基础课程

下面我们介绍一些特殊的type类型:

‘na’值

在 Pine Script™ 中有一个名为na的特殊值,它是not available的首字母缩写词,表示表达式或变量的值未定义。它类似于Java中的null 或Python 中的None值。

Tuple值

元组是一组以逗号分隔的表达式,括在方括号中,当函数或局部块必须返回多个变量作为结果时可以使用它们。例如我们熟悉的MACD指标,就可以使用元组的形式,代表MACD的三个指标(MACD线、信号线和直方图线),下面我为大家画图展示下。

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
plot(macdLine, title = 'macdLine', color=color.blue)
plot(signalLine, title = 'signalLine', color=color.orange)
plot(histLine, title = 'histLine', color=color.red, style=plot.style_histogram)

商品期货量化交易-TradingviewPine语言基础课程

当然,如果你只需要一个值,请使用像这样的占位符’_‘:

[_, signalLine, _] = ta.macd(close, 12, 26, 9)
plot(signalLine, color=color.orange)

商品期货量化交易-TradingviewPine语言基础课程

Array

用于显式声明变量或参数的“阵列”类型的关键字。可以使用array.new_type,array.from函数创建阵列对象。Array对象总是“series”形式。 Array.new_int/float/bool/string(),第一个值确定重复的次数,第二个值确定重复的对象。Array.from()从调用函数时提供给函数的参数,推断出数组的大小及其元素的类型。

m1 = array.new_int(10,12)
m2 = array.new_string(10, '优宽')
m3 = array.from(2, 12, 20, 50, 100, 200, '优宽')
m4 = array.from(close > open, high != close)
runtime.log(m1, m2, m3, m4)
runtime.error('stop')

标识符

上述我们讲解了变量的类型结构form和type,通常情况下在变量设定以后,我们需要对变量进行命名。通俗的讲“标识符”是用来当做函数和变量的名称的(用于命名变量、函数)。函数在我们之后的教程中会了解到,我们首先学习一下“标识符”。

  • 1、标识符必须以大写(A-Z)或小写(a-z)字母或下划线(_)开头,作为标识符的第一个字符。
  • 2、标识符第一个字符之后的下一个字符可以是字母、下划线或数字。
  • 3、标识符的命名是区分大小写的。
youquantVar
_youquantVar
youquant666Var
MAX_LEN
3barsDown //错误命名

如同大部分的编程语言一样,Pine语言也有书写建议。通常建议对标识符的命名时:全部字母大写用于命名常量。使用小驼峰规则(小写/大写单词)用于其它标识符命名。

LEN = 10 //全部字母大写用于命名常量
zeroOne(boolValue) => boolValue ? 1 : 0 //使用小驼峰规则用于其它标识符命名

通过对Pine语言第一个板块“类型系统”的学习,可以看出来相对于tradingview,在优宽平台上的Pine语言的语法规则比较宽松。因此在优宽上可以跑通的策略,在tradingview上可能会报错,希望大家仔细辨别。本节课的内容介绍完毕,我们下节课再见!

(七): 运算符

大家好,本节课我们讲解的内容为运算符。在量化交易中,如何对指标进行加减乘除操作,如何判断入场信号和离场信号,对交易逻辑的处理必然少不了运算符的操作。在本节课的最后,我将带领大家运用本节课的知识打造一个简易的量化策略,大家请安心等待。

商品期货量化交易-TradingviewPine语言基础课程

在Pine语言中,运算符主要分为以下几种:

  • 赋值运算符
  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • ? :三元运算符
  • [ ]历史引用运算符

下面我将为大家逐一讲解。

赋值运算符

= 用于给变量赋值,但仅在声明变量时(第一次使用)。基本作为常量赋值,在函数体外使用。

:= 赋值运算符,给左侧变量赋值。用于为先前声明的变量赋值。基本在函数内使用,随着函数逻辑的判断对变量进行重新赋值。

算数运算符

运算符 功能
/+ 加法和字符串连接
/- 减法
/* 乘法
/ 除法
% 取模(除法后的余数)
runtime.log('加法', 1+1)//2
runtime.log('减法', 1-1)//0
runtime.log('乘法', 1*2)//2
runtime.log('除法', 1/2)//0.5
runtime.log('取模', 1%2)//1
runtime.error('STOP')

运算符指派

a = a 符号(+-*/%) b a 符号(+-*/%)= b

上面的算术运算符都是二进制的。如果两个操作数都是数字,但其中至少一个是float类型,则结果也将是float。如果两个操作数都是int类型,则结果也将是int。如果至少一个操作数是string,则结果也是string。

runtime.log(1+0.1)  // 1.1
runtime.log(1+0.1+'AA') //1.1AA
runtime.log('优宽'+'AA') //优宽AA
runtime.error('STOP')

“+”号运算符还用作字符串的连接运算符。”优宽”+“PINE”产生”优宽PINE”字符串。

比较运算符

在Pine Script中,有六个比较运算符。

运算符 功能
< 小于
<= 小于或等于
! = 不等于
== 等于
> 大于
>= 大于或等于

比较操作是二进制的。如果两个操作数都是数值,结果将是bool类型,即 “true”、”false “。

a = 2
b = 3
runtime.log('等号',a==b)
runtime.log('不等号',a!=b)
runtime.error('stop')

逻辑运算符

在Pine Script中,有三个逻辑运算符(not, and, or)。

not 假 = 真 not 真 = 假

a b a and b a or b
true true true true
true false true true
false true true true
false false false false

逻辑运算符常用于Pine语言逻辑的判断,比如交易信号的判断,比如价格连续上涨加上交易量的连续上涨,两个条件都需要满足,就可以使用’and’,作为你可以判断为进场的信号;价格连续下跌或者交易量的连续下跌,两个条件满足其一,可以使用’or’,作为出场的信号。

?: 三元运算符

?:三元运算符用于为符合条件的信号创造表达式的,相当于一个ifelse的简写:

条件 ? 如果为真返回值 : 如果为假返回值

三元运算符返回的结果取决于条件的值。如果它是 “真”,那么返回第二个参数的值。如果条件是假或na,那么将返回第三个参数的值。

conditionsig = close > open ? 1 : 0 // if close > open, 返回1, 否则返回0
runtime.log(conditionsig)

[]历史引用操作符

可以使用[]历史引用操作符来引用时间序列的过去值。过去的数值是指变量在当前脚本执行的条形图之前的数值,即当前条形图。在变量、表达式或函数调用之后使用[]操作符。操作符的方括号内使用的值是我们要引用的过去的偏移量。要引用volume内置变量的值,离当前柱状体有两个柱状体,我们可以使用volume[2]。

strategy(overlay=true)

plot(volume)
plot(volume[1])
plot(volume[2])

商品期货量化交易-TradingviewPine语言基础课程 ****

运算符优先级

计算的顺序是由运算符的优先级决定的。优先级较高的运算符会先被计算。下面是一个按优先级递减排序的运算符列表。

优先级 操作符
9 []
8 +, -, not
7 *, %
6 +, -
5 >, <, >=, <=
4 ==, !=
3 and
2 or
1 ?:

如果在一个表达式中,有几个具有相同优先级的运算符,那么它们将被从左到右计算。如果表达式必须以不同于优先级的顺序进行计算,那么表达式的部分内容可以用圆括号分组。请注意优先级为8的’+-‘(一元运算符)和优先级为6的’+-‘(二元运算符)并不一致。

简易策略

通过上述的讲解,我相信大家对于Pine语言的运算符系统有了一个清晰的认识。下面我将用上述的运算符打造一个简单的量化策略,只是为了说明运算符的应用,大家对于实盘操作要谨慎尝试。

首先我们来定义一个hloc值,这个值是在一个策略周期内,高低开收的平均值,当然也****可以使用内置变量OHLC4值,我们后续会介绍 接下来我们来定义一个价格连续上涨的指标,利用三元表达式,判断当满足,条件1:前日的价格大于大前日的价格,条件2:昨日的价格大于前日的价格,两个条件都满足时,设定价格连续上涨的指标为1,否则为0;因为需要两个条件都满足,所以需要’and’操作符; 成交量连续上涨的指标也一样,利用’and’判断前日大于大前日,昨日大于大前日。这里提醒以下哈,为了避免未来函数,我们使用的都是过去的指标。

下面我们来使用if逻辑判断,这个后续我们也会介绍。因为入场信号比较谨慎,所以我们需要判断的是当价格和成交量都要连续上涨的时候,使用’and’符号确定满足两个条件, 我们进场, 利用stategy交易函数开多仓;

因为我们比较谨慎,所以感觉有风吹草动时,就是当价格或者交易量其中之一出现下降的时候,我们就要及时止盈,迅速离场,平掉多仓。因此这里使用’or’判断满足一个条件(价格下跌 or 成交量下跌)就可以。

最后,我们打印出价格连续上涨和交易量连续上涨的指标的日志。

hloc = (high + low + open + close)/4 //可以使用内置变量hlcc4,后续介绍
pricesignal = (hloc[2] > hloc[3] and hloc[1] > hloc[2])  ? 1 : 0
volumesignal = (volume[2] > volume[3] and volume[2] > volume[1]) ? 1 : 0

if pricesignal == 1 and volumesignal ==1
    strategy.entry("buy", strategy.long)
if pricesignal == 0 or volumesignal ==0
    strategy.close_all("buy", comment = "close long")
    
runtime.log('pricesignal',pricesignal)
runtime.log('volumesignal',volumesignal)

通过策略回测,我们看到本策略的收益为正。在策略回测日志中,可以看到只有在条件满足的情况下会进行开平仓的操作。通过运算符的学习,我们可以构建一些基础的交易逻辑,对我们日后进行交易逻辑的梳理有着很大的作用,但是大家不要轻易应用于实盘,因为本策略的适用范围为具有较长时间的趋势策略,因此在震荡行情中可能不太适用。所以“市场有风险,入市需谨慎!”。我们下节课再见!

商品期货量化交易-TradingviewPine语言基础课程

(八): 条件和循环结构

大家好,本节课我们要讲述的内容为Pine语言语法结构的最后一块拼图–条件和循环结构。假设通过你在期货市场上通过多年的学习,形成了一套完整的指标信号计算方法,和使用指标信号进行期货市场进场出场的判断方法,但是这套交易方法是基于手工操作的,大量的准确的指标运算和交易判断方法需要耗费你极大的精神成本,如果有一套代码可以胜任这项工作,仅仅需要你少量的精力去学习,可以大大减轻你的时间压力和工作压力,如此性价比的投入,你愿意尝试一下吗?

上节课的内容我们学习了运算符,可以帮助你进行准确的指标计算。本节课我们所学的内容是条件和循环结构,通过学习本节内容,可以帮助你利用指标进行交易逻辑的判断。在学完本节内容后,基本上Pine语言交易逻辑的梳理和代码的编写工作你都可以胜任了。

条件结构

Pine语言中的条件结构是 if 和 switch。它们可用于:

  • 返回一个值或元组,然后可以将其分配给一个或多个(元组)变量。
  • 不返回值,重新赋值变量或者执行函数(比如交易函数)。

if语句

if语言相信大家都很熟悉,“如果,就”。在if条件里准确的对信号加以描述,模型就可以执行相应的操作。其基本语法结构为:

单层判断

if condition1 \\conditon后不需要加任何符号
    action1

双层判断

if condition1 
    action1
else
    action2

多层判断

if condition1 
    action1
else if condition2
    action2
else
    action3

if语句可用来给变量赋值或者执行逻辑操作,下面给大家举例示范下:

\\ 赋值
x = if close > close[1]
    '涨'
else if close == close[1]
    '平'
else
    '跌'

runtime.log(x)

\\ 操作

if close > close[1]
    runtime.log('涨') 
else if close == close[1]
    runtime.log('平')
else
    runtime.log('跌') 

需要注意的是: * 在tradingview上,某些 Pine语言内置函数无法从条件结构的本地块中调用,比如一些画图函数 plot(), plotbar(), plotcandle(), plotchar(), plotshape()等


更多内容