商品期货量化交易-TradingviewPine语言基础课程(四):Pine语言编辑器窗口和代码结构

Author: ianzeng123, Created: 2023-01-29 15:41:37, Updated: 2023-01-31 14:26:53

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

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

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

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

编辑器窗口

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

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

img

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

img

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

img

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

脚本结构

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

<version>
<declaration_statement>
<code>

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

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

img

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

第三部分是代码板块,脚本中不是注释或编译器指令的行是语句,它实现了脚本的算法。脚本语句可以分为

    1. 变量声明
    1. 变量的重新赋值
    1. 函数声明
    1. 内置函数调用,用户定义的函数调用
    1. 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语言的编辑器介绍和脚本结构介绍就到此为此了,我们下节课再见!


更多内容