龙听期货论坛's Archiver

龙听 发表于 2018-10-22 13:48

EasyLanguage编程

图文教程










admin 在 星期四, 09/04/2014 - 11:46 提交


第四章 第一讲 EasyLanguage编程 (上)





4.1 EasyLanguage的数据类型

程序运行是数据与逻辑之间的运算过程,在此过程中数据必须要有类型的区分,编译器检查所有数据类型操作的合法性,非法数据类型操作不会被编译,数据类型的出现不但保证了数据存储的安全性,而且根据不同需求定义不同数据类型,更加节约了使用的计算机内存空间。数据类型分为两大类:一个是值类型,一个是引用类型。EasyLanguage中值类型主要包括三种数据类型:数值型,逻辑型,字符型。引用类型主要为数组类型。

EasyLanguage开发语言值类型包含三种主要数据类型,分别为

1) 数值型(Numeric)

数值型又细分为三种不同精度的数据类型,分别为

类型位数 范围

整型(Int)32-2,147,483,648 到 2,147,483,647

长整型(Int64)64-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

单精度浮点型(Float)32-3.40E+38到 +3.40E+38

双精度浮点型(Double)64-1.79E+308到 +1.79E+308

2) 逻辑型(Bool)

逻辑型数据类型,又称为布尔型。用Bool保留字来声明布尔类型变量,真值为True,假值为False。

3) 字符型(String)

字符型又称文本型。用String保留字来声明字符串类型的变量。如: Var:String ("Hello");这样就声明了一个“Hello”的字符串。

EasyLanguage开发语言中引用数据类型主要为数组类型,声明数组类型变量时,使用Array保留字来声明。详细内容我们会在下一小节中介绍。



4.2 参数、变量、数组的定义与使用

在程序设计的过程中,数据是以变量的方式存储的,无论何种程序设计语言,变量是构成一个程序的最基本元素。我们可以将参数,数组都看做一个变量。下面我们来看下它们的具体用法。

1) 参数(Inputs)

参数是用户向程序集输入的一个变量值,一般情况下参数是影响该程序的关键因子,通过改变参数从而完成对整个程序的调整。参数值一般不能够在程序中通过运算被更改,用户只能在程序运行前进行参数设置。

EasyLanguage语言中的参数需要在程序设计之前用Input或Inputs保留字声明,其语法格式为Input: Name(Value) ;

“Name”表示参数名称,参数名最多可以包含20个字符,第一个字符不能够为数字。

“Value”表示该参数的值,参数值可以为数值型、布尔型、字符串型中的一种。如果声明多个参数,每个参数之间用逗号隔开,最后要加入分号,表示声明结束。

例如:Input:Length(10),Con(False);表示声明了一个数值型参数Length和一个布尔型参数Con,参数类型根据其初始值判定。

2) 变量(Variable)

变量是程序进行运算的基本单位,EasyLanguage中的变量必须先声明后使用。可以使用Var,Vars,Variabls中的任何一个保留字声明变量,一般我们经常使用Var保留字。

声明变量完全模式为Variable:<IntraBarPersist><DataType>Name(Value);

< IntraBarPersist>:表示如果使用该保留字声明变量,则表示该变量会在每一个tick完成后要更新,否则只有每根K线完成后更新该变量。

<DataType>表示数据类型,此处数据类型必须和初始值的数据类型相同。该保留字可以缺省,此时变量数据类型根据初始值数据类型进行判定。

Name表示变量的名称。同样最多可以包含20个字符,第一个字符不能够为数字。

Value表示该变量的初始值,可以为数值型、布尔型、字符串型中的一种。

例:Variable: Count(10); 表示声明了一个整型变量Count

Var:intrabarpersist Num(1.23) 表示声明了一个K线内浮点型变量Num。

多数情况下,一般情况下使用变量的一般声明模式:Variable: Name(Value) ;就能够满足我们的基本需求。

EasyLanguage中的变量不仅包括用户声明的变量,还包括其内置的变量和一些常量保留字。常用的内置变量包括:数值型变量“Value1-99”,逻辑型变量“Condition1-99”。每种变量共有99个,可以直接使用,不需要声明。

例如:Value1 = 10;Value2 = close;Condition1 = True;

常量保留字变量我们会在下面的章节中逐步介绍。

3) 数组(Array)

数组在存储大量同一属性数据及处理复杂数据逻辑运算方面具有明显的优势,在程序设计中用到的频率极高,因此掌握数组的用法尤为重要。

EasyLanguage中的数组使用前同样需要先声明,我们可以使用Array或Arrays保留字声明数组。声明数组的完整语法为:

Array: <IntraBarPersist> <DataType> ArrayName[unitN](InitialValue);

IntraBarPersist保留字的含义与变量声明中的含义相同。

DataType 同样表示数据类型,可以为数值型、布尔型、字符串型中的一种,同一数组元素的数据类型必须相同,DataType可以缺省。

ArrayName表示数组变量的数组名,命名规则同变量命名规则相同。

unitN用于定义该数组的维度和元素数量,声明一维数组时,该值为一个正整数,如果声明多维数组时,不同维度之间利用逗号隔开。这里需要注意的是,数组元素的索引值是从0开始计算的,而不是从1开始。

InitialValue表示该数组定义的初始值,该初始值的数据类型必须和DataType数据类型保持一致,且该数组中所有元素都默认为这一初始值。

例:Array: int WeeklyHighs[52](0); 表示声明一个名称为WeeklyHighs,数据类型为整型,元素个数为53的一维数组。

例:Arrays: VolumeHighs[5,20](0); 表示声明一个名称为VolumeHighs,数据类型为整型,大小为6行21列的二维数组。

数组的声明需要注意两点,第一点是数组的初始值为必填,且仅为一个值,同时如果前面使用了DataType保留字,则初始值和DataType必须为同一数据类型。

第二点是数组元素的索引值是从0开始的。但是由于使用习惯的原因,我们经常会从索引值为1的元素作为运算起点,从而牺牲掉0行0列的元素空间。这一点不是必须的,根据开发者的习惯而定。



4.3 EasyLanguage运算符优先级

运算符是用于计算数据,表达逻辑关系等操作的特殊符号。EasyLanguage中的运算符主要包含四种,即算数运算符,关系运算符,赋值运算符,逻辑运算符。

1) 算数运算符

EasyLanguage中算数运算符主要用于常规数据验算,包括加法(+),减法(-),累加(+=),累减(-=),乘法(*),除法(/)。

例:close + open; 加法运算

(close - open)/2;减法和除法混合运算

(close + open - low)*3 ;加减乘混合运算

Value1 += 1; 内置变量Value1进行累加1

2) 关系运算符

EasyLanguage中关系运算符的作用是比较关系运算符两端的数据,从而判断该表达式的真假值。EasyLanguage中主要关系运算符为:

关系运算符 涵 义

>大于

<小于

>= 大于等于

<= 小于等于

=等于

<>不等于

以上关系运算符中,前四种关系运算符的优先级相同,后两种优先级相同,前四种的优先级高于后两种。

例: open > close; 判断开盘价是否大于收盘价

close – open >= 0 ;判断收盘价与开盘价的差是否大于等于0

EasyLanguage另外提供了两个额外的关系运算保留字,用于判断穿越关系,如果条件满足,则返回真值True,否则返回假值False。

Cross Above/Over 向上穿越

Cross Below/Under 向下穿越

例: close cross over Average(close,9); 判断开盘价是否向上穿越周期为9根K线的移动均线。



3) 赋值运算符

在程序编写过程中,我们经常需要将数据赋值给一个变量再进行运算,在表示一个赋值语句的过程中会用到赋值运算符。

EasyLanguage中的赋值运算符和等号为同一符号,都为“=”。但使用的环境和表达的含义都是不同的。等号用于关系运算表达式中,而赋值符用于赋值语句中。

比如:Condition1 = close = open; 在这条语句中,第一个“=”符号为赋值符号,含义为将后面的关系表达式的结果赋值给布尔变量Condition1。第二个“=”符号为等于号,用于判定close和open是否相等。

4) 逻辑运算符

逻辑运算符的作用是连接多个关系运算表达式,从而判断更为复杂的逻辑关系。

EasyLanguage中的逻辑运算符主要为“与”和“或”运算符,分别用“And”和“Or”表示,返回值为布尔型True或False。

“与”运算符两边同时为真值时,才返回True,否则返回False。“或”运算符两边同时为假值时,返回False,否则返回True。

例: Condition1 = close > open And High > close + open; 判断And两边表达式的真假值,将结果返回个Condition1



以上为EasyLanguage中经常使用的运算符,在使用过程中我们需要注意的是不同运算符之间的优先级关系。EasyLanguage中运算符优先级从高到低的顺序为:小括号à乘除法à加减法à关系运算符à逻辑运算符à赋值符。

例:Condition1 = (close + open)/2 + low *0.8 > high And close > open;

该表达式判断了两个逻辑表达式是否正确,用And判断是否同时为真值,将结果赋值给Condition1。



4.4 BAR时间序列编程思想及常用BAR属性保留字

EasyLanguage编程与常规的编程语言在设计思想上有所不同,因为我们是针对技术指标和交易策略进行编程,所以编程所面向的对象是每一根K线。

面向K线编程是以每一根K线作为基本单元,每根K线包含若干的市场信息,如价格、时间、成交量、所在位置等,程序在运行的过程是按照图表中从左到右逐根K线进行数据运算的,因此在数据处理及逻辑操作的过程中更加便于理解。

EasyLanguage中对K线所包含的信息定义了很多的属性,并以保留字的方式,提供我们使用。




BAR属性保留字


简写


含义




Date


D


日期(当前BAR最后Tick的日期)




Time


T


时间(当前BAR最后Tick的时间)




Open


O


开盘价




High


H


最高价




Low


L


最低价




Close


C


收盘价




Volume


V


成交量(当前BAR时间内成交量)




OpenInt


I


持仓量(当前BAR时间内持仓量)


Bar基本属性保留字包括:

以上为Bar的基本属性,每一根K线都存在这些属性值,因此这些保留字以序列的形式存在,我们可以在编程中,用回溯的方式使用任何一根K线的属性值。

例如Open表示当前K线的开盘价格,如果想要获取前一根K线的开盘价格要怎么办呢?我们有两种方式可以回溯表示前一根K线的开盘价格。

方法一:Value1 = Open[1]; 或者 Value1 = O[1];表示将当前K线的前一根K线的开盘价格赋值给Value1。

方法二:Value1 = Open Of 1 Bar Ago; 利用Of N Bar Ago语法的方式回溯前面K线的属性值。

其他属性值同样可以使用这两种方式获取前面K线的属性值。

例如:Value1 = Close[3]; 获取之前第三根K线的收盘价。

Value2 = V[1]; 获取前一根K线的成交量。

如果想获取不同图表分析器中的Bar属性值,可以通过Price Of DataN 的方式获取。

例如: Value1 = Close Of Data2 表示获取Data2图表分析器中的当前K线的收盘价格。



除了以上Bar的基本属性以外,Bar还有另外一些常用的重要属性及函数。如下:

1) BarStatus

BarStatus表示K线状态位置保留字,使用语法为BarStatus(DataNum),DataNum是一个1-50之间的整数,代表被评估的数据流窗口。1表示Data1图表分析器中数据,2表示Data2图表分析器中数据,以此类推。

BarStatus根据不同情况可能会返回四个值,分别为




返回值


意义




2


Bar的收盘tick位置(该tick完成后Bar将完成)




1


Bar中tick位置(Bar未完成)




0


Bar的开盘tick仅用于策略中Next Bar下单指令中




-1


执行该保留字出错时返回


例子:If BarStatus(1) = 2 then {Your Operation Here}表示当Bar为K线最后一个Tick时,执行操作。



2) BarType

BarType为K线时间间隔类型保留字,返回值为一个整数,根据数据的周期进行返回。以下列举出常用返回值及具体含义如下:




返回值


英文


含义




0


TickBar


Tick级图




1


Minute


分钟线图




2


Daily


日线图




3


Weekly


周线图




4


Monthly


月线图




5


Point&Figure


点数图




11


Momentum


动量图




12


Range


波幅图




14


Second


秒线图


如果当前图表分析器中数据为5分钟数据K线图,则BarType关键字会返回1,表示分钟级K线图。如果返回值为2,则表示K线图时间周期为日线周期。



3) BarInterval

BarInterval 表示K线时间周期值,与BarType时间周期类型一起构成完整的K线图时间周期。BarInterval仅在日内数据、成交量数据和tick数据图中有效,返回值分别代表分钟数或秒数,合约手数,tick数。

如果当前图表中数据为5分钟数据,则BarInterval返回5,BarType返回1。如果当前图表中数据为10 tick数据,则BarInterval 返回10,BarType返回0,以此类推。

4) BarNumber

BarNumber是EasyLanguage中的一个无参数的序列函数,返回值为整数,表示满足最大K线引用值(MaxBarsBack)之后K线的所在位置。MaxBarsBack表示的是在计算策略或技术分析时,在图表开头必须留出的历史数据最小使用数量。

例如:计算周期为10根K线的移动平均线,那么MaxBarsBack最小要设为9,这9根K线和当前K线共同计算出该移动均线。因此BarNumber的值要基于MaxBarsBack确定,如果MaxBarsBack设为9,则图表中第十根K线的BarNumber为1。

BarNumber作为一个序列函数,经常用于记录特殊情况发生的位置和K线的数量。我们可以通过BarNumber[N]的方式回溯之前K线的BarNumber。

例: Value1 = BarNumber[1]; 表示获取前一根K线的BarNumber值。

5) CurrentBar

CurrentBar与BarNumber很相似,同样表示满足最大K线引用值(MaxBarsBack)之后K线的所在位置。但是CurrentBar不能够像BarNumber一样进行回溯引用。

例如: Value1 = CurrentBar[1];是无效的表达。



6) LastBarOnChart

LastBarOnChart为无参数函数,用于判断当前K线是否为图表中最后一根K线。返回值为布尔值True/False。如果当前K线为最后一根K线,返回True。

7) CurrentAsk & CurrentBid

CurrentAsk : 实时卖价。现价买进时,需要在Ask报价之上下单,方可立即成交。

CurrentBid : 实时买价。现价卖出时,需要在Bid报价之下下单,方可立即成交。

EasyLanguage中除了以上常用的与Bar相关的保留字和函数,还有一些其他类别的常用保留字。这些保留字你可以通过TS的“EL Reserved Words&Functions”文档查询其使用方法和含义。保留字列举如下图:




Above


Alert


And


Array


Bar


Barinterval




Barssinceentry


Begin


Below


Bigpointvalue


Breakpoint


Buy




Buytocover


C


Close


Commentary


Contracts


Cross




Currentbar


Currentdate


Currenttime


D


Data


Date




Downto


Else


End


Entryprice


False


For




From


Getsymbolname


H


High


I


If




Input


L


Limit


Low


Market


Marketposition




Maxbarsback


Minmove


Newline


Next


Noplot


Numeric




Numericarray


O


Of


On


Open


Or




Over


Plot1-99


Plotpb


Points


Pointvalue


Pricescale




Print


Sell


Sellshort


Setplotcolor


Shares


Stop




T


Than


Then


This


Ticks


Time




True


Under


V


Variables


Volume


while


同时EasyLanguage还有许多常用的函数,在下面的章节中,我们会逐步的使用到,再进行讲解。

跳跃字(Skip Words)

跳跃字的作用是使EasyLanguage语言串连起来,使之读起来更像英语一样,增加程序的可读性。在程序的编译过程中跳跃字不被编译,没有实际意义。以下为跳跃字列表:




a


based


from


on


the




an


by


is


place


was




at


does


of


than





例如:if Close > High[1] then Buy next bar at market;



4.5 EasyLanguage逻辑语法语句

在EasyLanguage的开发中 ,仅用变量和保留字是不足以完成模型开发的,我们需要一些逻辑语句使控制系统来处理复杂的逻辑关系,执行订单操作等。EasyLanguage中逻辑语句主要包括赋值语句、条件判断语句、循环语句。

1) 赋值语句

语法为:VarName = VarValue;

VarName为变量名称,VarValue为变量值,变量名和变量值必须为同一数据类型。

例如:Condition1 = Close > Open;

Value1 = Close / Open;



2) IF条件判断语句

语法1:IF Condition1 Then

{Your Code Line1}

语法2:IF Condition1 Then

{Your Code Line1}

Else

{Your Code Line2}

语法1中如果Condition1返回True值,则执行下面的代码,否则不执行下面的代码。语法二中如果Condition1返回True值,则执行Line1代码,否则执行Line2代码。以上两种语法结构均执行一行代码,如果要执行多行代码,需要在Then或Else后加入Begin...End结构。

语法3:IF Condition1 Then Begin

{Your Code Line1}

{Your Code Line2,etc.}

End;

语法4:IF Condition1 Then Begin

{Your Code Line1}

{Your Code Line2,etc.}

End

Else Begin

{Your Code Line3}

{Your Code Line4,etc.}

End;

语法3和语法4为执行多条代码时IF条件语句的语法结构,语法4中如果Condition1为True值,执行Line1和Line2代码。否则执行Line3和Line4代码。这里需要注意的一点是语法3后的End有分号,语法4中第一个End后无分号,最后一个End带有分号

3) Switch条件判断语句

IF..Else语句,如果判断条件过多,那么分支也会越多,嵌套层数越多。这样程序代码不但冗长,而且代码不好理解不便于修改。Switch的开关模式控制能够很好的处理这类问题。其结构如下:

Switch ( expression )

Begin

Case case-expression: statements;

Default: statements;

End;

Expression 选择因子,与下面的Case进行匹配判断,可为变量或公式等。

Case 后将列举出选择因子值可能出现的情况。

Case-expression表示与expression进行匹配的情况。情况中存在的值必须和expression为同一数据类型。并且同一情况不能重复出现在Case后。

Statements表示情况匹配成功后执行的代码。

Default 表示如果上面所有Case情况都不匹配,则执行Default中的代码段。



需要说明的是情况(Case-expression)可以列举出多个进行匹配的值,不同值之间用逗号隔开,如下面的方式:Case 1,2,3,4,5,6,20 : Value1 = Average(close,10);

也可以用to方法表达范围情况,例如:Case 1 to 6,20 :value2 = Lowest(close,3);上面两个例子中,如果选择因子等于1到6之中的任何整数或20,则表示选择因子和情况匹配,并执行后面的代码段。

除此之外,关系表达式同样可以应用到情况当中,例如:Case > Average(close,10):Value1 = Close; 此例中如果选择因子大于移动均线表示匹配成功,则执行Value1 = Close;代码段。

Switch完整实例:

Switch(Value1)

Begin

Case 1 to 5:

Value2 = Value2 + 1;

Case 10, 20, 30:

Value3 = Highest(High,10);

Case is > 40:

Value3 = Value3 + 1;

Value4 = Value4 - 1;

Default:

Value5 = Value5 + 1;

End;

该实例中Value1为选择因子,依次与以上3个情况进行匹配。情况1表示选择因子是否在1至5之间,情况2表示选择因子是否为10、20、30之一,情况3表示选择因子是否大于40。如果均未匹配,则执行Default代码段。

4) Once..Begin..End条件语句

Once条件语句用于执行程序中只执行一次的代码段。

语法结构:

Once ([optional boolean expression])

begin

Statement(s)

End;

Once后括号内([optional boolean expression])为可选布尔表达式项。

Statement表示要执行的代码段。

例1:Once Value1 = GetAppInfo( aiApplicationType ); 该例子中省略布尔表达式,直接只执行一次后面的代码。它相当于下面的代码:if CurrentBar = 1 then Value1 = GetAppInfo( aiApplicationType );但是Once语句有效的避免了后面每一根Bar都进行计算的过程。

例2:Once (MarketPosition=1)

Begin

ClearPrintLog;

Print("Log Header");

End;

该例子表示当MarketPosition为1时,执行一次下面的代码段,以后不再执行。



5) FOR循环语句

For循环语句是迭代语句的一种,其作用是重复执行某一段代码,提高代码利用率。

语法结构:

For Variable = Value1 to Value2

Begin

{Your Code Here}

End;

Variable = Value1 to Value2 表示循环条件,只要Value1不大于Value2该循环就会继续执行Begin后面的代码,直到Value1大于Value2为止。

例:Variables: Sum(0), Length(10);

Sum = 0;

For Value1 = 0 To Length - 1 Begin

Sum = Sum + close[Value1];

End;

该例表示用For循环语句计算10根Bar的收盘价格总和,将结果赋值给变量Sum。

6) While循环语句

语法结构:While Condition1 Begin

{Your Code Here};

End;

如果Condition1返回值为True值,则循环执行Code代码段。如果Condition1返回值为False,则代码段不被执行。

7) Repeat/Until循环语句

语法结构:Repeat

Statement(s);

Until(Condition_is_true);

Repeat循环语句和While循环语句相似,但略有区别。首先Repeat语句执行多行代码时,不会用到Begin..End结构,只要代码段在Repeat与Until之间即可。其次是当Condition_is_true为False时,会执行循环过程,当Condition_is_true为True时,停止循环过程。所以Repeat循环语句至少会被执行一次。

语言 Chinese, Simplified


admin 在 星期四, 09/04/2014 - 12:29 提交


第四章 第一讲 EasyLanguage编程 (下)





4.6 EasyLanguage函数的建立与应用

EasyLanguage中函数的作用是将程序开发中相对独立的功能分离出来,封装为一个独立的函数实体,通过调用函数的方式获取该功能所计算的值。函数的使用降低了程序开发的复杂度,提高了程序的可读性和灵活性。

EasyLanguage中的函数大致分为两种。第一种为内置函数,可以通过系统直接调用。第二种为用户自定义函数,使用前需要用户自定义声明、定义和编译。

在函数开发过程中,直接通过函数名接收并返回一个值,而不是像其他开发语言中用Return返回一个值。在调用方中直接使用同一数据类型的变量,接收函数的返回值即可。如果需要返回多个值,可以通过定义输出参数的方式,返回所需要的值。

1)函数的参数类型

自定义函数中的参数使用前需要先声明,函数的参数同样使用保留字Input来声明,但与策略、技术指标中参数的声明略有不同。函数的参数声明语法结构为Inputs:ParametersName(ParameterType);

ParametersName为参数名称。

ParameterType为参数类型,而不是初始值。

1. 函数输入参数类型

1) Numeric 数值型

包括:Numericsimple 简单数值型

Numericseries 数值序列型

2) TrueFalse 布尔型

包括:Truefalsesimple 简单布尔型

Truefalseseries 布尔序列型

3) String 字符串型

包括:Stringsimple 简单字符串型

Stringseries 字符串序列型

4) 数组型输入参数

包括:Numericarray 数值数组型

Truefalsearray 布尔数组型

Stringarray 字符串数组型

Numeric、TrueFalse、String型参数的声明形式相同,数组型参数的定义需要在参数名后加上[n]表示数组形式的字符。

例:Inputs:Sum(Numericsimple),Price(Numericseries),Cond(Truefalsesimple),Str(Stringsimple),ArrayTest[n]( Numericarray);



2. 函数输入/输出参数类型

输入/输出参数的作用是返回一个或多个函数要输出的值,输入/输出参数的使用,实现了允许在函数中修改某一变量或数组,再将该变量或数组返回使用。这类参数我们以下统称为输出参数。

1) Numericref数值型输出参数

2) Truefalseref 布尔型输出参数

3) Stringref 字符串型输出参数

4) 数组型输出参数

包括:Numericarrayref 数值数组输出参数

Truefalsearrayref 布尔数组输出参数

Stringarrayref 字符串数组输出参数

例:Input:OUpline(Numericref),OSign(Truefalseref),OArray[n](Numericarrayref);

在调用函数时,输入参数位置传入同一数据类型的实参,输出参数位置需要同一数据类型的变量接收该输出参数输出的值。

例:在函数MyFunction中的参数声明为

Inputs: Length(Numericsimple),Price(Numericseries),Oput(Numericref);

在策略或技术分析中调用该函数的方法为

Var:UpLength(12),Pseries(close),Ovalue(0);

Value1 = MyFunction(UpLength, Pseries, Ovalue);

Value2 = Ovalue;

该例子中用Value1接收MyFunction本身的返回值,用变量Ovalue接收输出参数返回的值。



2)函数的建立

在系统开发中我们经常会将相对独立的功能分离出来,声明一个自定义函数进行应用。因此我们需要通过“TradeStation Development Environment”EL开发环境建立自定义函数。调用该窗体可以通过单击工具栏“Tools”中的“EasyLanguage”按钮,直接调用EL开发环境窗口。

在打开的EL开发环境窗口(TDE)中通过单击菜单栏FileàNewàFunction操作,此时弹出“New Function”对话框。

Name表示函数名称,函数名称可以包含字母、数字、点、下划线,首字符不可以为数字。

Short Description 表示对该函数的描述,为可选填项。

Return Type 返回类型,定义该函数的返回类型,在函数的开发中返回值类型必须和该选项为同一类型。

完成以上属性的配置后单击“OK”按钮,进入自定义函数的开发页面内。在这里我们列举一个实例,演示一个完整的自定义函数开发。

例子:开发一个名为GoldCross的函数,函数逻辑:求两条不同周期收盘价格均线出现金叉的次数

代码:Inputs:FastLength(Numericsimple),SlowLength(Numericsimple);参数声明

Vars:FastValue(0),SlowValue(0),Sum(0); 定义变量

FastValue = Average(Close,FastLength);计算短周期Close移动均线,Average()为TS中内置的求均线函数,可以直接应用。

SlowValue = Average(Close,SlowLength); 计算长周期Close移动均线

Condition1 = FastValue Cross Over SlowValue; 判断是否出现金叉,并赋值给Condition1

If Condition1 then Sum = Sum + 1; 如果出现金叉变量Sum自增1

GoldCross = Sum; 用函数名GoldCross接收返回值Sum



以上即为一个完整的自定义函数开发实例,在调用方我们可以通过函数名加实参的方式调用该函数。同样其他类型返回值的自定义函数的构建方法基本相同,在EasyLanguage中内置了很多常用的函数,其使用方法和含义可以参考“EL Reserved Words & Functions”帮助文档。



4.7 EasyLanguage交易指令应用

EasyLanguage中仅有逻辑处理是不足以实现策略开发的,在逻辑处理完成后,还需要执行相应的交易指令。

EasyLanguage中提供了四种基本交易指令和两种挂单方式,基本交易指令与挂单方式可以配合使用,共组成8种交易指令。

1) Buy/SellShort 多头/空头建仓指令

语法:Buy /SellShort ("Order Name") [Number of Shares/Contracts] [Order Action];

其中:Buy /SellShort保留字和Order Action是该语法必须的。

例如:Buy next bar at open ;

SellShort next bar at market;

“Order Name” 表示指令名称,数据类型为字符串类型。该项为可选项,在缺省的情况下,Buy指令名称默认为”Buy”,SellShort指令名称默认为”Short”

[Number of Shares/Contracts] 表示持仓合约数或手数,在缺省情况下,默认为策略全局变量中Trade Size的设置值。

[Order Action] 指令执行方式,指定指令在什么位置执行及执行方式,执行订单时有两种模式可以选择,一种是K线交易模式,一种是K线内交易模式或称Bar内交易模式。

Order Action必须指定为以下五种方式之一。




Order Action

K.线交易模式

?内交易模式




... this bar on close;


在收盘tick价格执行指令


在收盘tick价格执行指令




... next bar at open;


下根Bar开盘tick价执行指令


下一个tick开盘价格执行指令




... next bar at market;


下根Bar开盘tick价执行指令


下一个tick开盘价格执行指令




... next bar at price Stop;


在price价格停价挂单,根据K线的H,L,C,O价格判断


在price价格停价挂单,BAR内每一个tick价格都进行判断




... next bar at price Limit;


在price价格限价挂单,根据K线的H,L,C,O价格判断


在price价格限价挂单,BAR内每一个tick价格都进行判断


例子:1)Buy ("Entry1") next bar at market; 在下一根K线的开盘价格,执行名称为“Entry1”的多头建仓指令,建仓数量默认为策略全局变量中Trade Size值
2.)Buy ("LowBuy") 100 shares next bar at High + Range limit ; 在最高价格加上Range的价格位置,挂一个买入100手的限价单,仓位名称为“LowBuy”。

2) Sell/BuytoCover 多头/空头平仓指令

语法:Sell/ BuyToCover [("Order Name")] [from entry ("Entry Name")] [ Number of Shares/Contracts [Total]] [Order Action];

其中Sell/BuyToCover保留字和Order Action是语法必须的。

例: BuyToCover this bar on close;

“Order Name” 表示指令名称,数据类型为字符串类型。该项为可选项,在缺省的情况下,Sell指令名称默认为” Sell”, BuyToCover指令名称默认为” Cover”。

[from entry ("Entry Name")] 表示将该平仓指令绑定于某一指定仓位,可以实现平掉指定的仓位和指定的手数。

例:Buy (“MyBuy”) 10 Shares next bar at market;

Buy 20 Shares next bar at High Stop;

Sell From Entry (“MyBuy”) next bar at High + 2 Point Stop;

上面的例子中一共买入了30手,然而Sell指令只是针对“MyBuy”仓位执行平仓命令,将平掉“MyBuy”的所有仓位,策略中还剩20手。如果想平掉“MyBuy”中的5手,可以这样表达:Sell From Entry (“MyBuy”) 5 Shares next bar at High + 2 Point Stop;

[Number of Shares/Contracts] 表示持仓合约数或手数,在缺省情况下,默认为策略全局变量中Trade Size的设置值。

[Order Action] 指令执行方式。请参考Buy指令中介绍。

3) Limit/ Stop 指令

Limit和Stop两个保留字使用于挂单命令行中,其含义不同。

相同点:

只能在Next Bar模式的Order Action中执行,同时必须有一个价格参考。

例:Buy next bar at 60 Stop; SellShort next bar at 79 Limit;

不同点:

Limit可译为“this price or better”,表示达到price价格或比price价格更好,常用于反趋势建仓。可以理解为在一个更低的价格Buy或BuyToCover,或在一个更高的价格SellShort或Sell。

Stop可译为“this price or worse”,表示到达price价格或比price价格更糟糕,常用于追加仓位情况下。可以理解为在一个更高的价格Buy或BuyToCover,或在一个更低的价格SellShort或Sell。



4.8 输出和调试

在技术分析和策略的开发过程中,有时需要将所求的值绘制出来或显示输出,以方便我们观察和检测。而有时还需要在特定的事件触发时,进行声音或文字的警报。这里我们将会列举几个常用的输出函数和用于警报作用的保留字。

1) Text_new保留字

用于在图表中指定的K线和价格位置,绘制指定的文本文字。该保留字本身将返回一个整数作为索引值,需要用一个变量进行接收。在修改、删除Text_new的内容时,我们会用到这个索引值进行相关操作。

语法:Value1 = Text_New(BarDate, BarTime, Price, "MyText");

Value1 用于接收Text_New创建时返回的ID值,如果创建成功则返回一个正整数ID,否则返回负整数错误代码。Value1 可以换为其他任何的数值型变量或数值型数组元素变量。

BarDate、BarTime指定绘制字符串的锚定Bar的日期和时间,用于指定该K线的位置。

Price 指定绘制字符串的价格停靠位置,如High,low,close,open等。

“MyText” 表示输出的字符串。

例:Variable: ID(-1);

If Low < Low[1] AND Close > Close[1] Then

ID = Text_New(Date, Time, Low, "Key");

表示如果当前Bar的最低价小于前一根Bar的最低价,同时收盘价大于前一收盘价格,则在当前Bar的最低价的位置上输出“Key”字符串。



2) Print 保留字

Print保留字用于输出文本信息到“Print Log”或本地地址。“Print Log”显示窗口可以通过单击菜单栏“View”à“EasyLanguage Print Log”来调用。如输出到本地地址,需要在Print保留字中的第一个参数位置,指定本地路径。

语法:Print(Parameters);

Parameters 为要输出的信息,数据类型可以为字符串型、布尔型、数值型,可以为变量或表达式,每一个输出信息之间用逗号相隔。

例:Print(Date,Time,Close);表示在Print Log中输出Bar的日期、时间、收盘价格。

在输出数值型变量时,可以用语法Print(Value1:N:M);对输出的数值进行格式化。其中:

Value1 表示输出的数值变量。

N 表示输出数值一共所占的位数,当输出数值位数大于N时,则尽可能多的输出该数值。

M 表示输出数值小数部分所占有的位数。

例如:Print(3.14159:0:4); 则输出3.1416

如果想要将数据输出到本地地址,则需要在第一个参数指定本地地址路径。

例如:Print(File("c:\data\mydata.txt"), Date, Time, Close);

表示在"c:\data\mydata.txt"文件中输出Bar的日期、时间和收盘价格。

3) Alert 保留字

Alert保留字的作用是当指定事件触发时,建立一个警报事件,并发出警报。

语法:Alert("Description")

"Description" 为触发警报时警告通告窗口显示的额外信息。

需要注意的是Alert警报的建立只能够在最后一根Bar上建立,在历史数据中其他Bar上是无效的,同时只有事件被触发,且警报属性开启时(参照3.4节),警报才能被触发。如果一个策略或技术分析中同时触发两个或两个以上Alert,则只会执行显示最后一个警报事件。

例:Plot1(Average(Close, 10), "Avg");

If Close Crosses Over Plot1 Then

Alert("Price crossed over average");

If Volume > Average(Volume,10) Then

Alert("Volume Alert");

如果在最后一根Bar上,两个条件同时为True,则只有一个警报会触发,并描述最后一个警报的内容“Volume Alert”。



4) Commentary 保留字

Commentary 保留字的作用是无论选中图表中哪个Bar,都会发送一条设定好的信息到“Analysis Commentary Window”窗口。“Analysis Commentary Window”的调用可以通过单击“Chart Analysis”工具栏中的“Analysis Commentary”按钮直接调用。

语法为:Commentary("My Expression") ;

"My Expression" 为要发送到“分析评论窗口”的数据,数据类型可以为字符串型、布尔型、数值型。

例如:Commentary("The Average is:", Average(Close, 10));

如果想要发送多行数据到“分析评论窗口”可以利用CommentaryCL保留字。用用法请参考“EL Reserved Words&Functions”手册。

页: [1]