量化投资_EasyLanguage/PowerLanguage教学课程__【第一篇基础】__【第二章语言要素】

第二章:语言要素

第一节:语句、脚本   

  学习EL需要配合Multicharts交易软件(一下简称MC)的公式编辑器使用,后面的讲解已经认为你已经掌握了这个软件的最基本的使用功能。另外,如果你是一个学过或者非常精通编程的人士,希望暂时方下传统理解编程的一些思维,因为它会妨碍你学习EL这门语言(尽管它非常简单)。

  如果你已经打开了MC的公式编辑器,随便找到一个信号脚本像下面的样子:

   此时已经恭喜你已经成功的打开了一个“脚本”。“脚本”的概念就是你所见到的“函数”、“指标”、“信号”这种运行在图表上面,且可执行的代码。也就是你最终需要完成的这件“艺术品”,关于“函数”、“指标”、“信号”等内容后面会陆陆续续讲到。那这件“艺术品”当中需要包含哪些东西呢?当然你可以说有这些字母或者其他什么符号。站在可执行的角度来说(也就是说你最少包含什么东西,这个“脚本”就可以运行或者说能够工作起来)最少应该包含一个“语句”。

  “语句”又是什么?我们在这张截图中可以找到很多后面的都以分号进行结尾“;”,可以说一个完整的“语句”或者陈述你想要告诉电脑听懂你的一句话。一个脚本至少应该包含一个语句,语句当中可以包含其他语句,每个语句都必须是用分号进行结尾。

  示例1:一个简单的语句

Buy Next Bar at Open;

   这就是一条完整的语句。另外我们还可以在语句当中加入语句

  示例2:

if close > high then begin
    buy 1 shares next bar at market;
end;

  我们看到有两个分号,这就是在语句当中加入语句,或者说是一种“嵌套”。在编程中嵌套随处可见。

  因此:“脚本”“语句”是对EL最直观而且最基本的认识,必须牢牢记住。另外要说明的是,在EL编译器中所有的编程语言、符号等都必须是英文格式的,而且暂时还不能用中文做为注释,可能这点对中国用户并不太友好。

 

第二节:bar概念(时间序列)

  编辑好的“脚本”一般是需要运行在K线上面(这里以K线为例),也就是说“脚本”的运行需要依赖于数据。在金融编程中一个最重要的概念就是时间序列。所谓时间序列就是以时间作为“标尺”,每个刻度上都存在着各种数据。以K线为例,每一个K线就是每一个刻度上的数据。这里引用国外传统的叫法,每一个K线就是一个bar(当然这个bar的概念不仅仅限于K线,其他数据表示方式的每一个数据点也可以叫做一个bar)。这里可以简单理解成一根K线就是一个bar。

 

第三节:完成bar和指标运算参考的最大Bars数量

  3.1 完成bar

  完成bar就是指一根K线以完成,或者说一根K线已经形成了,也就是说完成了一根bar。

  在这里要说明一下K线的形成过程。我们新建一个图表的时候可以选择的周期中有“tick”周期。所有的K线,不管是几分钟或者几秒或者几小时等周期,都是由tick这个周期形成的。其实叫“tick”周期并不太准确,应该称作所有数据的最小单位一个完整的tick都需要带有一个唯一且只有一个价格,带有一个成交量

  我们以一根5分钟的K线为例,如下图所示:

  

   我们把一根5分钟的K线当做一个容器,在限时的5分钟时间内,随着tick的不断填充到5分钟K线当中,在填充的过程中,我们把第一次填充的tick叫做开盘tick、中间填充的tick叫做过程tick,最后填充的那个tick叫做收盘tick。因此,这个不断的变化过程中生成了K线的开、高、低、收四个价格,其中开盘tick形成了开盘价、收盘tick形成了收盘价等等K线的四价位置。

  3.2 完成bar的特殊情况

  如果我们还没有收到最后一个收盘的tick,但是5分钟的K线时间已经截止了,此时,最后的收盘价以就近的tick价格作为收盘价。

  3.3 指标运算参考的最大Bars数量

  先看下面这一张图:

   我们在右键设置指标/信号的时候,在属性栏会有设置指标运算参考的最大Bars数量。这只MC的一种特殊的“脚本”运行机制。也就是说在把脚本加载到图表当中后,预先读取N个bar的数据,这些数据是不会进行任何的画图、交易等操作的。目的是为了开辟计算内存空间,让脚本运行的速度更快。后面我们在看到绩效的时候,并不是从第一bar开始的,而且是从最大Bars后的第一个bar开始。

  另外还要注意的是,指标运算参考的最大Bars数量必须要大于脚本运算中所需bar数据的数目,如果小于这数目会报错,脚本无法运行。当然也可以在指标设置中选择自动检测。

 

第四节:脚本的执行

  在这里我们可能不知道什么是指标、什么是信号,在后面函数章节会详细讲到。这里指标可以理解成可以计算、画图但不能交易的脚本,信号可以理解成可以计算、交易但不能画图的脚本。

  4.1 指标的执行

    指标的计算方式是从图表上的第一个bar开始,一旦图上所有的完成bar都执行了,指标将执行图表上最新的一个bar,以tick by tick(逐笔)的方式运算,而不用等待这根bar的结束。也就是说历史都是基于完成bar来执行,实际过程是基于当前的tick进行计算。

    一个未完成的bar是上一个bar完成以来,接收到所有的tick的总和。

    新的一笔tick接收时,整个脚本会在那根Bar执行,直到此bar完成形成并且下一个Bar已经开始。值得注意的是,只有最后一根完成bar在每一个新tick收到时都会重新就算,并非对整个数据全部进行重复的计算。当然有时候并不需要基于每笔tick进行指标的运算,可以在指标设置中关闭每笔tick资料更新的设置,这样会加快运算速度(当然实际过程中不建议这样)。

  4.2 信号的执行

    第一次插入信号时,是完成bar逐个的计算,并从图表上第一个bar开始。整个脚本对于每个完成bar都执行一次。委托会在图表上标记箭头或者其他标志。当然如果你设置了“指标参考运算的最大Bars数量”,那么信号是基于这个bar数量后的第一个bar进行计算。当历史计算全部完成后进入到实时状态。此时:如果开启Bar内交易,信号会tick by tick(逐笔)的方式运算;如果未开启Bar内交易,信号会在当前bar的最后一个收盘tick运算一次。(这里提到的Bar内交易和非Bar内交易会在后面专门讲到,这里先理解为为开启Bar内交易方式,也就所谓的正常方式)。

  4.3 小结

  在此过程中我们发现都需要首先读取历史数据,当然我们也可以不读取历史数据,且基于实时数据来进行匹配。如上图,我们可以关闭“实时历史匹配”,当然我们不太建议这样的操作方式。

 

第五节:委托单的优先级

第一节:市价单、限价单、停损单、停损限价单

  所谓这三种单叫做下单策略,也就是交易所可以允许你采取什么样的买卖方式。

  市价单:所谓市价单就是在下单时,给予交易所指令,可以以当前的市价价格进行下单,如果以当前open价格进行的市价单形式进行下单。可能当前的open价格就是可成交的价格为市价,也有可能当前不是。因此市价单是一种较快的成交方式,也就是最好就是当前市价,最差是高于当前的下单价格以最后方向价格成交。

  限价单:在指定的价格或最优的价格,买或者卖的委托单。下单时告诉交易所至少这个价格成交,当然可以以更优价格成交。

  停损单:当价格到达停损价,告诉交易所立马把这个价格转换成当前的市价进行成交。

  停损限价单:与停损单类似,但是不是里面转换成当前的市价,而是转换成限价单等待成交。

 

第二节:洗价单

  由于国内几大期货交易所对于下单策略的限制。可能有的交易所不支持市价单。因此MC设立洗价机制。所谓洗价机制就是如果交易所不支持下单策略时,MC会把下单策略保存在MC本地,带价格成立,转换成本交易所允许的下单策略进行发单操作。

 

第三节:优先级

  在这里必须记住三种执行语句:

  this bar on close

  next bar at market / next bar at open

  next bar at price limit / next bar at price stop

  这三种语句无外乎就是下市价单、停损单、限价单,或者以close价格进行市价单交易等。具体的解释会在后面遇到。另外我们交易时会遇到4种下单命令,他们分别是:

  buy // 平空开多/开多

  sellshort  //平多开空/开空

  sell  // 平多

  buytocover  // 平空

  重点1:其中buy和sell是一对、sellshort和buytocover是一对。如果在代码中存在同方向的委托单,是按照语句在脚本中的先后顺序执行。比如我有四种买入方式,按照先后顺序进行买入。

  重点2:如果有持仓,其中buy和sellshort具有反向功能。举例来说,如果当前仓位持有空头,如果采用buy的买入多单方式,会先平掉空头,然后再开多,sellshort也是这原理。

  重点3:在MC12版本中可以关闭这个反向功能。如下图:

  

 

   我们在MCTrader交易设置中开启独立开平,buy和sellshort就不在具有反向功能。

  重点4:一个委托组内,委托单执行的优先级排序是基于当前部位(当前持仓)而定的。

 

第六节:简介EL语句组件

  我们前面知道了由分号(;)来定义一条EL的语句,那么在EL语句中会包含:关键字、跳跃字、运算符、引用历史bar、时间和日期、变量、数组、标点符号这些组件。这些组件会在后面陆陆续续的见到。下面简单介绍一下组件:

  关键字组件(Keyword)

    关键字组件也叫保留字,这些字我们在定义变量时不能与之重名,他们在EL语句中起到特定的作用,而这些作用是被定义好的。

  数学运算符

    数学运算符无外乎就是+  -  *  /  (),其中换括号在数学运算符当中表示优先级

  逻辑运算符和字符运算符:

    逻辑运算符有And、Or、Not,分别表示逻辑与、逻辑或、逻辑非

    字符运算符:+  加号与数字运算符一样,在这里表示字符的拼接

  关系运算符:

    <  >  >=  <=  =  <>,这里特别注意的是 = 表示关系是否相等,在其他编程语言中采用的是双等于号 == ,而在EL中采用的是= ,这里是特别注意的。

  引用历史bar:

    引用历史bar,表示在当前bar的位置去获取历史中某一时刻的bar数据,一般有两种方式:

    方式1:N bars Ago

    方式2:[N]

    示例:获取前一个close价格:

    close 1 bars ago 或者 close[1],在这里推荐使用后者的方式,前者采用了跳跃字的方式

  跳跃字:跳跃字是EL中的语气词,是的EL的语言开启了更像是自然语言一样,在脚本执行时会被忽略。

  变量:变量在MC中有系统全局变量像value1,condition1这种方式。后面会见到。

  日期和时间:略

  标点符号

    ;  //表示语句结束

    ,  //表示分割

    :  //表示声明等

    []  // 表示执行内容,比如开启bar内模式[intrabar.... = True]、表示自定义数组长度arry[5](0)等

    ()  // 表示参数,优先级等

    //  //表示单行注释

    {}  //表示多行注释

    ""  //表示字符串

 

第八节:脚本格式

   一个脚本至少应该包含一条语句,脚本的编写会有一些规范。如下图:

 

   通常来说在编写正文的时候,需要对一些参数值、变量等进行一下事先的声明等操作:

  1、表示在所有语句执行前,开启或者执行的内容,一般以[]括号表示,这里表示开启bar内交易

  2、表示为输入参数,如果你的脚本有一些参数设置,在这里进行参数变量

  3、表示声明变量,也就是正文中所需的一些自定义变量,在这里声明

  4、表示声明数组,如果正文中需要数组在这里进行声明

  思考:在后面编写过代码的时候会发现,这里用那种关键字都可以,比如inputs也可以,input也是可以。这就是第一章所讲到的PowerLanguage对Easylanguage的一种兼容性的操作,后面会遇到bar和bars,表示的意思是一样的。

  

第九节:基本数据类型

   在这里可以看到MC具有三种基本的数据类型,也就是变量有哪几种类型,这包括布尔型、数值型和字符串型。

  其中数值类型就是我们见到的整数、浮点型(像123,像123.4),布尔型就是两种一种是False和True,也就是真或者假,分别对应0和1两个数字。字符串类型就是用引号" "包裹起来的样子,里面可以有文字、数字、符号等等。这是MC三种基本的数据类型,后面我们还可以见到像数组等特殊的数据类型。

 

 

=================================================

之前的文章感谢大家的转载,希望转载时请注明出处,本人转自其它网站的图表一并感谢,谢谢~!

https://www.cnblogs.com/noah0532/

posted @ 2020-09-15 00:53  时海涛|Thomas  阅读(1522)  评论(1编辑  收藏  举报