Professional Documents
Culture Documents
2 EasyLanguage ÔÏó×ÔÑ ¿Î Ì
2 EasyLanguage ÔÏó×ÔÑ ¿Î Ì
2 EasyLanguage ÔÏó×ÔÑ ¿Î Ì
课程(译)
国信证券 TRADESTATION
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
0
重要信息及披露
下载课程材料
www.tradestation.com/education/downloads/ELOBJECTS
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
i
EasyLanguage 对象自学课程(译)
目录
重要信息及披露................................................................................................................................ i
关于本书.......................................................................................................................................... iv
EasyLanguage 对象简介 ................................................................................................................. 1
学习使用 .......................................................................................................................................... 1
EasyLanguage 代码编辑器............................................................................................... 2
工具箱............................................................................................................................... 2
组件盘............................................................................................................................... 5
属性编辑器....................................................................................................................... 5
EasyLanguage 字典........................................................................................................... 7
EasyLanguage 中的对象 .................................................................................................................. 8
什么是对象? .................................................................................................................................. 9
初始组件设置 .................................................................................................................................. 9
在代码中访问属性 ........................................................................................................................ 10
PriceSeriesProvider ......................................................................................................................... 12
◆课程例题 #1....................................................................................................................... 13
对象和函数 .................................................................................................................................... 16
价格集合 ........................................................................................................................................ 17
PriceSeriesProvider - Count 属性 ................................................................................................... 18
◆课程例题 #2....................................................................................................................... 18
输入和属性 .................................................................................................................................... 21
常见提供器(Provider)属性 ..................................................................................................... 21
◆课程例题 #3....................................................................................................................... 22
◆课程例题 #4....................................................................................................................... 25
方法 ................................................................................................................................................ 29
事件 ................................................................................................................................................ 31
事件处理程序................................................................................................................. 31
设计器代码 .................................................................................................................................... 32
计时器 ............................................................................................................................................ 33
◆课程例题#5......................................................................................................................... 33
AccountsProvider(账户提供器) ............................................................................................ 37
集合................................................................................................................................. 38
查询定义和帮助............................................................................................................. 39
◆课程例题#6......................................................................................................................... 39
筛选属性(TokenList) .............................................................................................................. 43
+=加等号赋值运算符 .................................................................................................................... 44
PositionsProvider(仓位提供器) .......................................................................................... 45
◆课程例题 #7....................................................................................................................... 46
方法变量 ........................................................................................................................................ 49
◆课程例题 #8....................................................................................................................... 51
ToString() .................................................................................................................................... 54
OrdersProvider ............................................................................................................................ 55
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
ii
EasyLanguage 对象自学课程(译)
◆课程例题 #9....................................................................................................................... 56
LastBarOnChart ............................................................................................................................ 58
分析技术 - Initialized 和 Uninitialized 事件 ................................................................... 59
IntrabarPersist .......................................................................................................................... 59
OrderTicket .................................................................................................................................. 59
激活下单对象................................................................................................................. 60
◆课程例题 #10..................................................................................................................... 61
声明对象变量................................................................................................................. 66
跟踪 Order Ticket 的委托单状态 ................................................................................... 67
BracketOrderTicket .................................................................................................................... 68
◆课程例题 #11..................................................................................................................... 69
MarketDepthProvider .................................................................................................................. 76
◆课程例题 #12..................................................................................................................... 77
QuotesProvider ............................................................................................................................ 80
◆课程例题 #13..................................................................................................................... 81
FundamentalQuotesProvider ...................................................................................................... 84
◆课程例题 #14..................................................................................................................... 85
Workbook(Excel) .......................................................................................................................... 89
◆课程例题 #15..................................................................................................................... 90
创建非组件对象 ............................................................................................................................ 95
Vector 集合 ................................................................................................................................... 96
◆课程例题 #16..................................................................................................................... 98
◆课程例题 #17................................................................................................................... 104
◆课程例题 #18................................................................................................................... 107
Using-(保留字) ....................................................................................................................... 110
窗体控件(Form Controls) .................................................................................................... 111
◆课程例题 #19................................................................................................................... 112
◆课程例题 #20................................................................................................................... 116
附加练习部分 .............................................................................................................................. 126
撤销委托....................................................................................................................... 127
◆附加例题 #21................................................................................................................... 128
DateTime ....................................................................................................................... 134
TimeSpan....................................................................................................................... 135
◆附加例题 #22................................................................................................................... 136
分析技术 - Unitialized 事件 ........................................................................................ 143
Try-Catch ....................................................................................................................... 143
XML 对象 ...................................................................................................................... 144
◆附加练习 #23................................................................................................................... 145
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
iii
EasyLanguage 对象自学课程(译)
关于本书
本课程的目标是帮助你更加熟悉EasyLanguage对象以及它们可以怎样被用于拓展你已经熟
悉的EasyLanguage代码。你将通过使用对象创建并检验若干独特的EasyLanguage指标来完成
熟悉对象的过程。
一个简单并一致的格式将贯穿全书: 一系列EasyLanguage元素和概念的介绍,后面跟着一
个或多个与概念相关的练习。
创建并输入每个练习,并按需将你的作品应用到图表或雷达屏中。
预备知识:
在尝试本课程内的练习之前,强烈建议你熟读“EasyLanguage学习课程”。你也可以通过从
编程手册或互联网上阅读一些关于面向对象编程的概念而获益。
本书的作用是,对在现有的EasyLanguage框架下访问市场数据和下单而设计的EasyLanguage
对象增强功能进行介绍。我们推荐用户在开始本课程之前理解并熟悉TradeStation平台。这
包括创建和管理图形分析、以及答题上的文件、窗口、工作区、及桌面的管理技巧。一个很
好的起点是国信TS大学:
http://www.guosen.com.cn/gxzq/tradestation/tradestationCollege.jsp?classid=0001
0002001200090001
无论是出于什么理由,你现在掌握了一门透彻的、进阶的课程,该课程将教你如何用
EasyLanguage来理解并编写包含对象、属性、方法的自定义分析技术和交易策略。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
iv
EasyLanguage 对象自学课程(译)
EasyLanguage 对象简介
自从推出以来, EasyLanguage 不断发展成为一款比传统编程语言更有效地帮助交易者分析
也能够轻松地和已经存在的代码融合。
不是一本对面向对象编程进行总体介绍的书。通过一系列的代码案例,你将学习如何结合你
的 EasyLanguage 开发,请注意你已经存在的分析技术和策略将继续工作,不发生任何变化。
学习使用
学习一个科目的一种方法是去学习它的具体细节。比如,我们可以通过学习内燃机、转向联
动装置,以及其他复杂的机械类话题去了解汽车,或者我们可以就将汽车当做一个复杂精密
的机器然后学习驾驶它们。同样地,我们可以通过学习多态、封装、继承,及其他复杂的编
程概念去学习编程对象,或者我们可以直接接受“对象代表包含属性和方法的复杂程序”这
一事实,然后学会如何驾驭它们。
助我们的几个面向对象的编辑工具,包括:
EasyLanguage 编辑器
工具箱
组件盘
属性编辑器
EasyLanguage 字典
面将更详细地介绍对象术语,但是下列这些将帮助你开始学习:
组件 - 从工具箱内获取的拖放对象
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
1
EasyLanguage 对象自学课程(译)
对象 - 组件或其他对象的复制品
类(Class) - 对象包含的特征和行为的蓝图
属性 - 对象内的数据和信息
点号 - 在代码中用于获取对象的属性和方法
事件 - 有变动的通知
Collections - 对象和对象数据的数据结构
EasyLanguage 代码编辑器
每当你开始在编辑器中打字,自动完成窗口会弹出,根据你输入的内容显示可能的选择。除
了显示常见的保留字和函数之外,自动完成窗口还会帮你选择你创建的对象的属性。很多新
对象相关属性将会在本书中提及。
例如,在一个代码编辑器内打开的 EL 文档中,输入字符"va",自动完成窗口会出现并高亮
单词"value1",因为这是"va"为首的第一个单词。再输入字母"r",高亮的单词变为"var"。再
输入字母"i",高亮单词换为"variable"。在任何时间段,按下回车键将会把高亮的单词放进
你的文档中。
工具箱
工具箱选项卡位于代码编辑器的左边,它显示的是一列能够作为对象加载到你的 EL 文档中
的可用组件。一个对象把数据和程序结合成一个方便的程序包,这样你可以将它在 EL 代码
中作为属性和方法使用。设计工具箱组件是为了让你通过最少的编程向分析技术、策略和函
数中轻松添加对象。
可用组件(工具箱中)
价格、基本面、报价,以及市场深度(Level II)数据
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
2
EasyLanguage 对象自学课程(译)
账户数据
委托单和仓位数据
委托单 (下单)
计时器
非组件对象(不在工具箱中)
全局变量
向量(数据收集)
自定义 EL 窗口设计
XML 数据库
日期
更多„„
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
3
EasyLanguage 对象自学课程(译)
它放入代码编辑器中(参见“组件盘”)。在接下来的很多例子中,我们会使用工具箱向
EasyLanguage 文件中添加组件对象。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
4
EasyLanguage 对象自学课程(译)
组件盘
的名称。默认情况下,这个名称由组件名和编号组成。
单个文档可以添加不同的组件,或者同一组件的多个实例。我们将在后面的例子中对此进行
更详细的讲解。
属性编辑器
属性选项卡位于代码编辑器的右侧。它用来访问属性编辑器面板(见下),在这里你可以设
置或检查你的文档中特定组件的属性。要表明你想在属性编辑器里编辑哪个组件的属性,点
击组件盘里的组件名称,或者从属性编辑器顶部的下拉列表中选择名称。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
5
EasyLanguage 对象自学课程(译)
属性编辑器工具栏包含了数个不同的图标,这些图标可以让你在属性 窗格和事件 窗
格间选择,以及其他我们后面会提到的编辑工具。
在默认情况下显示的是属性窗格。属性列显示按类别分组的属性名称,数值列显示相应属性
的设置。类别和子类别可以通过点击 和 两个符号进行展开或折叠。时间窗格包含一
个事件列和一个数值列。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
6
EasyLanguage 对象自学课程(译)
默认情况下,当你在面板外点击时,面板会自动关闭并再次显示为一个选项卡。要想在你做
注意:对象属性不要与设置指标样式、颜色、刻度轴的指标属性混淆。
EasyLanguage 字典
同样位于代码编辑器右侧的字典选项卡用来访问字典面板。在字典面板中,你可以搜索
的信息(属性、方法、事件等等)。
默认情况中,对象窗格(位于字典面板左侧)显示库和命名空间的层级,它们包含了
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
7
EasyLanguage 对象自学课程(译)
EasyLanguage 的类和保留字。点击 和 图标,你可以浏览层级中的其他层。在对象窗格
中点击一个对象可以在右上角的成员窗格内看到相关条目。在成员窗格内点击一个条目可以
在右下角的描述窗格内显示这个条目的概要。在对象和成员窗格中,图标帮助确认对象或成
示一列属于该类别的保留字,描述窗格内显示该类别的概要。
你也可以通过往字典面板左上角的搜索框里输入一个或多个单词来搜索字典里的条目。搜索
结果会显示在对象窗格内,在这里选择一个条目,该条目的概要会显示在描述窗格内。
当你读完本课程,对于对象和类更熟悉后,不妨花些时间浏览字典中的各种命名空间,看看
接,这些帮助话题概括了语言的功能和有关的对象元素。
EasyLanguage 中的对象
本课程的目的是向你介绍 EasyLanguage 对象的使用,
所以最明显的问题是,
“为什么用对象?”
所以,什么是对象?最简单地说,一个对象代表一种特定类型的值,这些值你可以用一个用
事实上,这完全正确„„使用对象和使用变量很像。不过与传统变量不同的是,我们到目前
变量代表一个集成了值和相关元素并据此执行的程序包。
在对象中,值被称为属性,可以被认为是针对对象的保留字和保留变量。被称为方法(Method)
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
8
EasyLanguage 对象自学课程(译)
来执行针对对象的计算以及管理对象任务。
按照程序包的概念,属性和方法的名称总是与它们所属的对象一起写出来(后面的章节会详
要在变量名后面加上一个“.”再加上想要的属性名,就像下面这样:
Value1 = myObject.PropertyName;
由于对象是将数据和程序结合成一个便捷程序包的独立组件,要使用一个对象的属性值和方
法,你不必知道任何该对象内部的编程。这使得对象成为获取复杂数据结构(例如价格数据
流)或者处理复杂程序元素(例如窗口控制和事件)的理想选择。就对象来说,对象变量的
类型与它的类以及含有值的特定的包(这个包由一个被称为实例的独特的对象变量名所代表)
联系在一起。
什么是对象?
组件的一个副本,它知道如何访问、返回和处理数据
对象数据通过属性返回
像变量一样,对象有一个描述性的名称
初始组件设置
首先,你要使用工具箱里的组件往 EasyLanguage 文档中添加对象,并用属性编辑器进行设
置。
大多数组件在你的分析技术或策略中开始收集数据或执行想要的功能之前需要一些初始设
对象下单时需要先指定账户号码。
本书中的课程例题将会在标题组件和属性编辑器设置下列举例题中每个组件你需要输入的
设置。这会帮助你熟悉那些当你在自己的分析技术和策略中使用组件时需要注意的属性。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
9
EasyLanguage 对象自学课程(译)
在代码中访问属性
一旦一个组件对象通过属性编辑器向你的文档中添加并进行设置之后,你将可以通过
EasyLanguage 代码访问对象的值。这通过在对象名和属性名称或想引用的方法之间使用点号
“.”来实现。对组件来说,对象的名称通常由组件的名称后跟着一个实例序号来表示(例:
PriceSeriesProvider1)。当你在对象名称后敲下一个“.”字符时,一列可用的属性 和方
法 就会在自动完成窗口中出现。当你输入更多属性名称的字符,列表内的选择也更加严
格。
一列属性选择。
的组件对象的实例所代表。
Value1 = PriceSeriesProvide1.Count;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
10
EasyLanguage 对象自学课程(译)
单独的一个收盘价你需要使用方括号[ ]指数运算符和一个指数。在此情况下,这个指数代表
指数来访问的属性被称为集合。更多关于此的知识在下一章节介绍。
Plot1(PriceSeriesProvide1.Close[0]);
的 Close 保留字不同的是,当提到一个这样的集合属性中的单独的收盘价时,你必须总是指
定一个指数[0]作为属性识别码的一部分。
捷菜单里点击“„„的定义”(这里是“PriceSeriesProvide1.Close[0]的定义”
)来阅读选中对
象和相关属性的帮助主题。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
11
EasyLanguage 对象自学课程(译)
PriceSeriesProvider
PriceSeriesProvider 组件是一个对象,它包含了在一个历史数据的范围内,指定交易代码在
表,这个图表能访问有着相似名称的价格属性如 High,Low,Open,Close,Volume,Time
易代码和区间,这与你图表中的代码和区间设置互相独立。下面列举了一个
PriceSeriesProvider 的重要特征:
能够与一些标准 EL 函数一起使用
多个 PriceSeriesProvider 组件可以被包含在一个分析技术内,用以支持多数据分析而不必要
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
12
EasyLanguage 对象自学课程(译)
求组件的交易代码作为数据流包含在 K 线图或网格内。这意味着你可以用对象来创建多数据
指标在雷达屏中使用,并且可以使图表内设置多数据分析变得更简单。另外,你可以不依赖
下跌的成交笔数以及上涨和下跌的成交量。
EasyLanguage 代码里触发。
◆课程例题 #1
目标:
(PriceSeriesProvider 收盘价指标)
用属性编辑器设置组件对象属性
从组件对象里绘制一个属性值
理解 PriceSeriesProvider 数据和图表数据的不同
指标: $01_DailyBarClose
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
13
EasyLanguage 对象自学课程(译)
工作区:$01_DailyBarClose
建立图表
创建:30 分钟周期图
插入指标:$01_DailyBarClose
组件和属性编辑器
PriceSeriesProvide1:
IntervalSpan: 1 “ ”
Years 2 “ ”
指标属性
刻度轴:与标的物数据相同
指标练习#1:'$01_DailyBarClose'
练习中复制的代码,或者组件自动插入的代码会有一个浅灰色背景。每当提及 EasyLanguage
保留字或函数,它们会被单引号括起来以识别(例:'EntryPrice')。每当提及一个课程联系
输入值或变量,它将会以斜体加以识别,例如 myInput。
创建一个新指标并将它命名为:#01_DailyBarClose。我们将用#命名惯例来将课程练习与课
程可以下载的案例(以$开头)区分开。
我们要做的第一件事就是点击代码编辑窗口左侧的工具箱选项卡,打开工具箱面板。找到
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
14
EasyLanguage 对象自学课程(译)
PriceSeriesProvider 组件,然后双击组件名进代码编辑器。默认名称 PriceSeriesProvide1 将会
出现在位于代码编辑窗口底部的组件盘内。
现在,点击代码编辑器右侧的属性选项卡,打开属性面板并确保 PriceSeriesProvider ① 是属
性编辑器顶部指定的组件。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
15
EasyLanguage 对象自学课程(译)
获取 symbol 过去两年内每日的价格数据。
现 在 , 通 过 刚 刚 对 于 周 期 ( interval ) 和 区 间 ( range ) 的 设 置 , 你 就 能 够 将
PriceSeriesProvide1 组件在代码中作为一个对象来获取当前图中代码的价格了。
对象的最后的收盘价。
要访问代码中一个对象的属性,在对象名称后跟着的对象属性名称之后输入点号‘.’,这
里我们输入‘.Close’。既然我们想用该属性显示当前的收盘价,我们在属性名称后加一
捷菜单底部的“属性”。在指标属性对话框下的刻度轴选项卡上,将坐标轴设置改为刻度位
验证指标。如果没有已经显示的话,你应该从视图-工具栏-输出打开打开 EasyLanguage 输
出栏。这可以让你看到任何验证错误以及纠正错误的有用信息。
对象和函数
分析市场数据时,使用以一系列价格为基础的计算结果很普遍,例如在一定数量的 bar 的收
Value1 = Average(Close,10);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
16
EasyLanguage 对象自学课程(译)
价,它含有从当前 bar 直到 MaxBarBack(可引用到的第一根 bar)的一系列 bar 的收盘价。
平均数赋值给 Value2:
Value2 = Average(PriceSeriesProvide1.Close,10);
值组合起来使用。你可以通过在代码中右键点击函数名并选择“打开函数”来检查任何函数
的输入类型。
了可以接受有价格集合的对象,还可以接受包含历史值(例如开盘价,最高价,最低价,收
盘价等)的保留字。
Average 函数,前三行代码:
Inputs:
Price( numericseries ),
Length( numericsimple ) ;
价格集合
一个集合是一种对象(或属性)
,它很像 EasyLanguage 的数组,能保存多个值,可以通过指
以保存一系列组件指定的周期范围内的收盘价。就像前一个例题一样,你可以在属性名称后
用一个方括号[]和一个指数引用单个收盘价,比如可以用 PriceSeriesProvide1.Close[2],从
PriceSeriesProvide1 这个组件对象取两个周期以前的收盘价。
但是,当你去除方括号时,PriceSeriesProvide1.Close 属性引用组件的整个收盘价集合,并且
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
17
EasyLanguage 对象自学课程(译)
可 以 作 为 参 数 被 pass 给 任 何 接 受 数 列 的 EasyLanguage 函 数 。 例 如 , 下 面 根 据
Plot1(Average(PriceSeriesProvide1.Close,15));
尽管我们将在后面深入讲解集合,现在你所需要知道的就是价格集合可以通过使用方括号和
pass 给一个函数。
PriceSeriesProvider - Count 属性
PriceSeriesProvider 组件由一个代码在规定的周期范围内的一系列价格组成。Count 属性告诉
集合内有多少可用的历史价格。
Input: MovAvgLen(10);
If PriceSeriesProvide1.Count>MovAvgLen then
Plot2(Average(PriceSeriesProvide1.Close,MovAvgLen));
◆课程例题 #2
目标:
(MovAvg + Close Indicator)
指标:
‘$02_DailyAvgClose’
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
18
EasyLanguage 对象自学课程(译)
工作区: $02_DailyAvgClose
建立图表:
创建:30 分钟日内图
插入指标:$02_DailyAvgClose
组件和属性编辑器设置:
PriceSeriesProvide1:
IntervalSpan: 1 “ ”
Years 2 “ ”
指标练习#2:‘$02_DailyAvgClose’
练习中复制的代码,或者组件自动插入的代码会有一个浅灰色背景。每当提及 EasyLanguage
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
19
EasyLanguage 对象自学课程(译)
保留字或函数,它们会被单引号括起来以识别(例:'EntryPrice')。每当提及一个课程联系
输入值或变量,它将会以斜体加以识别,例如 myInput。
这 个 例 题 , 我 们 将以 课程 例 题 #1 中 创 建 的#01_DailyBarClose 指 标 开 始。将 它 另 存 为
#02_DailyAvgClose。我们将用#命名惯例来将课程练习与课程可以下载的案例(以$开头)区
分开。
既然 PriceSeriesProvide1 组件已经是你刚刚创建的指标的一部分,不用再次进行添加。但是,
照上述“组件和属性编辑器设置”,用属性编辑器设置组件的 Symbol(代码)
、Interval(周
期)和 Range(区间)。
指明当前的收盘价。
现在,让我们在原来的绘图语句前加一个移动平均数长度的输入声明:
input: MovAvgLen(10);
plot1(PriceSeriesProvide1.Close[0],"Daily Close");
价的移动平均线。我们将检查组件的.Count 属性来确保它包含足够的价格数据去进行计算。
Average 函数接受两个参数,第一个代表一系列价格,第二个代表从计算平均数开始处多少
间设置的整个收盘价的集合。第二个参数指的是从当前价格开始多少个周期之前来计算移动
平均数。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
20
EasyLanguage 对象自学课程(译)
If PriceSeriesProvide1.Count > MovAvgLen then
plot2(Average(PriceSeriesProvide1.Close,MovAvgLen),"MovAvgLen");
验证指标。
输入和属性
除了在属性编辑器中把初始组件属性设置为一个特定值以外,你也可以将一个属性设置为用
一个 EasyLanguage 输入值作为它的值。这使你在应用分析技术或策略时能够改变输入值并
让组件使用这个值。
会输入“000001.SZ”作为交易代码的值,这样每次运行你的分析技术时,组件将用你在属
注意如果你之前还没有在属性编辑器里设置交易代码值,iSymbol 的初始输入值会被设为“”
。
常见提供器(Provider)属性
一些工具箱组件在名字结尾含有单词“provider”。使用属性编辑器,你会发现他们都在
自动建立与分析技术或策略初次加载时有关的数据间的连接。比如,AccountsProvider 会
连接到与你指定账户有关的数据,PriceSeriesProvider 会连接指定交易代码的价格数据流,
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
21
EasyLanguage 对象自学课程(译)
等等。当为真时,Realtime 属性指挥提供器(provider)不断地请求相关数据的实时更新。
例 如 , PositionsProvider 根 据 所 请 求 的 交 易 代 码 的 实 时 价 格 变 化 计 算 新 仓 位 值 ,
MarketDepthProvider 会报告买、卖行情的实时变化,等等。
大部分情况下你不会需要修改这些设置;但是,如果你希望设置一个提供器(provider)组
件,让它在你的代码中某个条件出现时可以被激活,你可以在属性编辑器里设置 Load 和
果你想从你的代码中改变一个已经加载的提供器(provider)的过滤(filter)属性设置,
◆课程例题 #3
目标:
(RelStrengthRS)
添加一个 Symbol(交易代码)属性输入
在雷达屏中进行多数据分析
指标:
‘$03_RelStrengthRS’
工作区:$03_RelStrengthRS
建立雷达屏:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
22
EasyLanguage 对象自学课程(译)
创建:雷达屏窗口,窗口内把代码周期设为每日
指标属性-网格样式:采用小数点后两位,将每个指标绘制到 Number
插入指标:$03_RelStrengthRS
组件和属性编辑器设置:
PriceSeriesProvide1:
指标练习 #3:‘$03_RelStrengthRS’
在这个指标中,我们把雷达屏中每行交易代码的表现和一个基准代码进行比较。这种多数据
分析在对象被引入前是无法在雷达屏中实现的。每行的交易代码的表现用标准的 Close 保留
来对一个参考代码进行计算。
创建一个新指标并命名:
‘#03_RelStrengthRS’
。
现在代码编辑器窗口底部的组件盘内。
参考代码。由于当我们将该指标应用于图表上时有可能会更改参考代码,我们将这个代码值
通过点击属性编辑器顶部的 工具栏图表按钮转变为一个输入值。在属性编辑器内,单词
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
23
EasyLanguage 对象自学课程(译)
值。
Input: LookBack(20);
声明三个变量来保存用来衡量每行交易代码表现百分比变化的计算结果,基准参考交易代码,
以及它们之间的相对差别。
接着我们计算当前交易代码以及基准交易代码的百分比变化。
BenchPerf = PercentChange(PriceSeriesProcvide1.Close,LookBack);
相对表现是两个代码的百分比变化的差值。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
24
EasyLanguage 对象自学课程(译)
验证指标。
将指标加载到周期为每日的雷达屏窗口内。
◆课程例题 #4
目标:(RelStrengthFixed)
用多个 PriceSeriesProvider 组件
指标:
‘$04_RelStrengthFixed’
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
25
EasyLanguage 对象自学课程(译)
工作区:$04_RelStrengthFixed
建立图形:
创建:30 分钟日内图
插入指标:$04_RelStrengthFixed
组件和属性编辑器设置:
PriceSeriesProvider1:
PriceSeriesProvide2:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
26
EasyLanguage 对象自学课程(译)
指标练习 #4:‘$04_RelStrengthFixed’
这个指标与之前的例子很像,除了本指标的设计目标是使用一对周期均被设为每日的
PriceSeriesProvider 组件在一张图形上绘制相对表现。这让你可以将当前交易代码的每日
表现与基准交易代码的每日表现相比较,无论图形上的额周期设置是怎样的。
#04_RelStrengthFixed。我们将用#命名惯例来将课程练习与课程可以下载的案例(以$开头)
区分开。
由于 PriceSeriesProvide1 组件已经是刚刚创建的指标的一部分,因此不需要再次添加。但
被设置为取 symbol(当前图表的交易代码)过去两年内每日的价格数据。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
27
EasyLanguage 对象自学课程(译)
我们将使用与练习#3 中相同的输入名称;但是,让我们把初始 LookBack 值设为‘8’
。
Input: LookBack( 8 );
变量名称也会基于练习#3,但是,让我们把当前代码表现变量的名称改为 SymbolPerf。
计算当前交易代码和基准交易代码的百分比变化。我们把表现计算放在一个“if”语句中,
两个提供器(provider)的每日周期,尽管图表的周期不一样。
合以及同样的 PercentChange(百分率变化)回顾长度。
end;
绘制三个计算值,这次删除*100 语句,因为我们不需要在图表中把这些值作为百分数来绘
制。加一条零线作为第四个绘图,用来比较正表现或负表现值。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
28
EasyLanguage 对象自学课程(译)
Plot4(0);
右键点击指标文档,选择右键菜单底部的属性来访问指标属性对话框。选择刻度轴选项卡并
确认坐标轴设定为右侧坐标轴。
验证指标。
方法
方法在代码中被提及的方式和你在代码中提及函数的方式很像,但是因为它是本地的,它运
行得更快,并且允许你在分析技术或策略中直接向其他变量读取或写入。尽管方法与函数一
样,可以接受输入参数并返回一个值,一个不可返方法可以让你执行一系列语句而不要求返
回值,这使得一个方法可以像一些保留字一样独立地出现在代码中,而不需要将它赋值给一
个变量。下面是方法特征的概述:
方法可以返回值
方法可以有一个或多个参数
方法可以修改标准的变量
方法可以声明只在该方法内可见的本地变量
参数用括号括起来,用逗号分隔。即便没有参数,括号也是一定需要的。方法的主体包含一
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
29
EasyLanguage 对象自学课程(译)
begin
{ EasyLanguage statements }
localVar1 = myObject.Close[0];
localVar2 = 10;
if param1<localVar2 then
plot1(localVar1);
end;
一个 void(不可返)的返回表明这个方法不返回值,空括号表明这个方法不需要参数。
当方法被调用时,方法内的代码被执行,而不必在每次分析技术或策略求值时执行。在下面
的例子中,当 Condition1(条件一)为真时,上述方法中的语句将被执行。这就像一个外
部函数;但是,这个方法对你的文档来说是本地的。当一段代码被调用多次但将它组织成一
个有名称的模块很有帮助时,方法通常会被使用。另外,方法会作为事件处理程序被使用,
且与对象的事件属性相关。
Value1 = 5;
If Condition1=True then
myMethod(Value1);
量),和 Arrays(数列)的声明之后并且在代码主体之前。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
30
EasyLanguage 对象自学课程(译)
事件
事件是指,当对象内一些值得关心的事发生时,对象向客户端程序(你的 EasyLanguage 代
码)提供通知的一种方法。事件最常见的用法之一是在程序图形控制中,例如一个按钮,当
用户点击按钮时程序收到通知。另一个例子是计时器控制在一段规定时间倒数到零时通知被
调用程序。下面是事件的一些特征:
事件听取要发生或改变的事
被触发后,事件调用事件处理方法
事件处理方法内的代码被执行以处理一个事件
在属性编辑器内,事件连接事件处理方法
也支持事件并在对象相关的数据改变时提醒你,例如更新价格、仓位、或账户状态。在过去,
你也许必须要写一个轮询循环来寻找进来的数据中的变化,但是在对象事件的帮助下折可以
通过在分析技术或策略中添加事件处理方法来让它自动发生。
事件处理程序
在 EasyLanguage 中,事件处理程序是当对象内一个相应事件发生时被调用的方法。在事件
如何对一个事件作出反应。
要使一个事件处理方法可用,它必须与一个事件发生关联。在组件对象里,这可以通过使用
属性编辑器将方法与指定的事件相关联。例如,在一个 Timer(计时器)组件下,属性编辑器
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
31
EasyLanguage 对象自学课程(译)
参数。这些参数用来接收事件信息并且不该被用户编辑。
elsystem.TimerElapsedEventArgs args )
begin
{ Insert your EasyLanguage statements below }
end;
对组件来说,事件处理方法的名字通过使用属性编辑器与事件相关联。
对非组件对象来说,用下列格式在代码中给对象的事件属性指派事件处理方法的名称:
Object.EventName += Method_Name;
设计器代码
除了你使用 EasyLanguage 编辑器写的代码外,你的分析文档也可以包含关于每个组件的信
息,当一个组件被创建且属性被编辑好后该信息将自动帮你编好。该信息存在与一个特殊的
被称为设计器代码的只读页上,你可以通过代码编辑器的视图菜单访问。
设计器代码由系统创建,并每当你输入或改变一个组件的属性时在属性编辑器内更新。不能
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
32
EasyLanguage 对象自学课程(译)
直接用代码编辑器对它进行修改。
件处理方法名称
(位于 EL 代码的主体部分)的 EasyLanguage 语句就被添加到设计器代码块。
timer1.elapsed += timer1_elapsed;
法被调用,方法内的语句被执行。
目前来看,你不必去理解组件产生的设计器代码,但是它是一个很有趣的人资源,能够让我
计时器
Timer(计时器)组件创造一个对象,它让你设置一个计时器,倒数规定的毫秒,并在时间
到期后调用事件处理方法。计时器可以被设置为每次到期后自动重新开始,这样事件处理程
序可以不断被调用。
◆课程例题#5
目标:
(Bar Countdown 指标)
用工具箱组件创建一个计时器对象
用属性编辑器创建一个事件
在时间通知时运行一些 EasyLanguage 代码
指标:
‘$05_BarPcntLeft’
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
33
EasyLanguage 对象自学课程(译)
该指标只用一个 Timer 组件来设置一个每 1000 毫秒不断更新当日时间的计时器。1000 毫秒
=1 秒。
工作区:$05_BarPcntLeft
建立图表:
创建:一分钟图表
插入指标:$05_BarPcntLeft
组件和属性编辑器设置:
Timer1:
Elapsed: Timer1_Elapsed
指标练习#5:'$05_BarPcntLeft'
创建一个新指标并命名:
‘#05_BarPcntLeft’
。我们将用#命名惯例来将课程练习与课程可以
下载的案例(以$开头)区分开。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
34
EasyLanguage 对象自学课程(译)
码编辑器窗口底部的组件盘内。
被指定的组件。
于分析窗口,计时器会开始运行。
(事件)列中,其值为空白。每当计时器倒数到 0,此时我们想调用事件处理方法,Elapsed
的方法名添加进标题为 Value(值)的那一列中。
句之间添加。
elsystem.TimerElapsedEventArgs args )
begin
{ Insert your EasyLanguage statements below }
end;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
35
EasyLanguage 对象自学课程(译)
它需要在每笔交易更新后保留每个新的值,而不是像普通变量一样被重置。第二个变量保存
注意:记住变量声明语句总是被放在任何方法的上方。
状图。
elsystem.TimerElapsedEventArgs args )
begin
iCounter = iCounter-1;
PlotValues();
end;
添加另一个叫 PlotValues()的方法,当一个计时器事件发生时该方法被调用。第一张图
同样大小。
begin
plot1((iCounter/iMax)*100, "PctLeft");
end;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
36
EasyLanguage 对象自学课程(译)
代码最后一部分检查图中最后一根 bar 收盘没并且重置计数器和基于 bar 周期分钟数的最
之后被绘制出。
plot1(0, "PctLeft");
iCounter = iMax;
barnumb = currentbar;
end;
end;
plot2(100, "100");
plot3(0, "zero");
验证指标。
AccountsProvider(账户提供器)
AccountsProvider 组件创建一个对象,这个对象让你指出你的实盘或模拟盘国信 TS 账号。
哪个或哪些账户来获取数据。用规定的筛选条件,AccountsProvider 对象建立一个账户集
(账户)筛选将从所有有效账户内收集账户信息。
涉及到的账户相关的值发生改变时收到通知。当账户因为一个不在图表或网格中、但分析技
术或策略需要了解的交易代码而改变时,这尤为重要。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
37
EasyLanguage 对象自学课程(译)
定 AccountsProvider 是否找到账户。
AccountsProvider1 的 Account(账户)属性代表一个或多个账户(实际上是账户对象)的
集合,以及一系列可以从每个账户读取的属性。例如,要想引用集合中的第一个账户,可以
通过在提供器组件的 Account(账户)属性添加一个包含序数的方括号,此例为[0]。
AccountsProvider1.Account[0]
如果在属性编辑器内的 Accounts(账户)属性下仅指定一个账户号码,你的集合将包含
Account[0]的数据。但是,如果你要三个账户的数据(例如“SIM12345,SIM67890,SIM13579”)
,
Value1 = AccountsProvider1.Account[2].UnsettledFund;
集合
组件对象经常操纵项目的集合。例如,AccountsProvider 对象管理所有可使用账户(由账
户筛选规定)的集合。
下列语句显示集合中第一个账户(序号为 0)的账号:
Plot1(AccountsProvider1.Account[0].AccountID);
列于账户提供器的属性编辑器内的账户筛选属性被用来指明访问哪个或哪些账户。使用你指
明的筛选条件,账户提供器对象建立一个账户集合并将 Count(计数)属性设为集合元素数。
默认情况下,一个空白的账户筛选将收集所有有效账户的信息。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
38
EasyLanguage 对象自学课程(译)
查询定义和帮助
有几种方法可以了解更多关于一个组件的属性和方法。例如在属性编辑器里,当你选择一个
组件属性,编辑器下方面板显示字典内属性的剪短说明。在描述窗格上方是一个写着 帮助
关于属性的链接,该链接将会指引用户去到组件所属类的帮助主题。帮助主题通常包含给定
类的一列属性、方法、事件和通向相关类和属性的链接。
在代码编辑器内,可以通过右键点击代码内提到的对象然后在右击菜单内选择 对象的定义
(D)...。这将直接引导你去对象类的帮助主题。
顺便说一句,如果右键单击属性名称,属性的定义...菜单项将带你去包含这个属性的类。
但是,需要留心一个属性可能与组件在不同的类中,因为很多属性从其他的类继承,并且它
◆课程例题#6
目标:
(账户损益指标)
创建一个可以访问你权益类账户信息的对象
使用 Count(计数)属性来检查是否有账户
将提供器更名为一个更短的名字
指标:
‘$06_AccountPL’
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
39
EasyLanguage 对象自学课程(译)
制成直方图。如果账户净值大于 0,图的颜色是绿色;如果净值小于 0,则为红色。
工作区:$06_AccountPL
建立图表:
插入指标:$06_AccountPL
组件和属性编辑器设置:
AccP:
Updated: AccP_Updated
指标练习#6:
‘$06_AccountPL’
创建一个新指标,将它命名为‘#06_AccountPL’
。我们将用#命名惯例来将课程练习与课程
可以下载的案例(以$开头)区分开。
点 击 代 码 编 辑 器 左 侧 的 工 具 箱 选 项 卡 , 双 击 AccountsProvider 组 件 。 默 认 名 称
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
40
EasyLanguage 对象自学课程(译)
AccountsProvider1 组件将出现在代码编辑窗口底部的组键盘。
编辑器顶部被选定的组件。
组件对象的名称,这样写代码时可以少打点字。但是组件对象的特征和它的属性保持不变。
注意改后的名字现在出现在代码编辑器底部的组键盘内。
代码的顶部。
这就是它引用的账号。
声明另一个输入来指明账户的损益警告线。
我们声明一个变量来保存计算出来的账户利润。
var:AccountPL(0);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
41
EasyLanguage 对象自学课程(译)
事件处理方法。双击事件名 Updated,创建一个新事件处理方法名。
elsystem.TimerElapsedEventArgs args )
begin
{ Insert your EasyLanguage statements below }
end;
法。
tsdata.trading.AccountUpdatedEventArgs args )
begin
PlotValues();
end;
现在,创建一个每当账户更新事件发生时就计算并绘制账户损益的方法。它只会在图形最后
一根 bar 绘制,并且当提供器有收集到指定账户的数据时绘制。
begin
AccountPL = AccP.Account[0].RTAccountNetWorth –
AccP.Account[0].BDAccountNetWorth;
plot1(AccountPL,"AccountPL");
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
42
EasyLanguage 对象自学课程(译)
下面一系列语句,在损益为零时将净值绘图设为灰色,大于零时为绿色,小于零时为红色。
setplotcolor(1,LightGray);
setplotcolor(1,green);
setplotcolor(1,red);
end;
end;
plot2(0,"Zero");
plot3(PLAlert);
plot4(-PLAlert);
验证指标。
注意:计算期货账户的账户损益的代码是:
{ AccountPL = AccP.Account[0].RTAccountEquity -
AccP.Account[0].BDAccountEquity; }
当你将这个指标应用于图表时,你应该检查输入设置并根据图中代码相应地改变账号和利润
拟权益账号,将利润预警根据当前账号的净值做更改。
筛选属性(TokenList)
很多情况下,属性编辑器下的 Filter 部分内包含的属性期待一个含有逗号分开的值的字符
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
43
EasyLanguage 对象自学课程(译)
例如,PositionProvider 组件包含三个筛选(filter)属性,这些筛选属性用来缩小提供
器(provider)可能仓位的选项。假设你想为一组规定的交易代码收集仓位信息。设置 Symbol
(交易代码)属性来收集你账户内国信证券(002736),平安银行(000001)和中国联通(600050)
的仓位信息:
Accounts
Symbols "002736.SZ,000001.SZ,600050.SH"
Types
PositionProvider 对象返回你指定的三个交易代码的仓位,但不返回账户内其他代码的仓
结果。但是,你可以轻松添加一列指定账户或仓位种类,结果将局限于只包含符合所有筛选
条件的那几个项目。例如,下面的筛选设置将找到两个账户中指定交易代码的多仓。
Accounts "123456,234567"
Symbols "002736.SZ,000001.SZ,600050.SH"
Types "long"
除了输入指定代码的名称,你也可以输入保留字 symbol(无括号),让代码筛选返回当前图
内或网格内的代码的仓位:
Symbols symbol
+=加等号赋值运算符
与对象一起新加入 EasyLanguage 的还有一些面向对象编程中常用的运算符。其中一个运算
符可以将一个表达式的的值加给一个变量,并不用在赋值语句两侧重复变量名。也可以说,
这个表达式加给结果。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
44
EasyLanguage 对象自学课程(译)
例如,下面的表达式:
result += 1
以及接下来的表达式是一样的
result = result + 1
除了 result 在第一个表达式中只指明并求值一次。下面,你将会看到这个运算符在时间
处理器的名称被复制给或加给一个事件属性。
PositionsProvider(仓位提供器)
PositionsProvider 组件创建一个能够让你引用一个过一列指定交易代码的仓位值的对象。
你也可以按照特定账户或仓位类型筛选这些对象。按照指定的 Symbols(交易代码),
的 集 合 , 并 将 Count 属 性 设 为 集 合 中 元 素 的 个 数 。 如 果 不 指 明 任 何 筛 选 条 件 ,
PositionsProvider 将建立一个包含所有代码、账号和类型的仓位的集合。
化时收到通知。当仓位因为一个不在图表或网格中、但分析技术或策略需要了解的交易代码
而改变时,这尤为重要。
PositionsProvider 能否找到仓位。
Plot1(PosProvider1.Position[0].OpenPL, "P/L");
Plot2(PosProvider1.Position[0].Quantity, "PosSize");
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
45
EasyLanguage 对象自学课程(译)
Plot3(PosProvider1.Position[0].AveragePrice, "AvgPx");
◆课程例题 #7
目标:
(Position Value Indicator)
用工具箱组件创建一个能读取仓位信息的对象。
用属性编辑器初始化组件属性。
绘制一条交易代码的仓位的值
指标:
‘$07_PosValue’
无仓位,将会显示“0”。
工作区:$07_PosValue
建立雷达屏窗口:
创建:任意周期
插入指标:$07_PosValue
组件和属性编辑器设置:
PosP:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
46
EasyLanguage 对象自学课程(译)
Updated: PosP_Updated
指标练习 #7:‘$07_PosValue’
创建一个新指标,将其命名为:#07_PosValue.
点 击 代 码 编 辑 窗 口 左 侧 的 工 具 箱 选 项 卡 , 双 击 PositionsProvider 组 件 。 默 认 名 称
PositionsProvider1 将出现在代码编辑器窗口底部的组件盘内。
PositionsProvider1 是指定组件。
将在所有相关账户内寻找当前代码(symbol)
,例如不同的信用账户或现金账户。
仓位信息。
接下来,通过点击 图标切换到属性编辑器的事件窗格。
你将看到 Updated 列在事件列下,
法的名字与属性相关。
自动生成的,不应该被用户移除或修改。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
47
EasyLanguage 对象自学课程(译)
tsdata.trading.PositionUpdatedEventArgs args )
begin
PlotValues();
end;
此指标不要求输入值或变量。
接下来,创建 PlotValue()方法。
Begin
有仓位。如果当前交易代码不存在仓位,网格窗内它的值将是空白。如果有仓位,指标将绘
制三条正值。
begin
Plot2(PosP.Position[0].Quantity, "Qty");
Plot3(PosP.Position[0].OpenPL, "P/L");
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
48
EasyLanguage 对象自学课程(译)
SetPlotColor(3,Green)
else
SetPlotColor(3,Red);
end
else
begin
如果当前代码无仓位,下面的代码将显示‘0’。
Plot2(0, "Qty");
Plot3(0, "P/L");
end;
end;
验证指标。
该指标为网格分析窗口设计的,例如雷达屏,并且会显示代码的任何仓位。但是,它也会在
值最有用。
方法变量
在函数里声明变量,该变量只能在函数内使用。与之类似,你可以在一个方法内声明变量,
该变量是本地的,不能从方法以外访问。这些本地变量在方法每次运行时创建,在代码执行
过后消失。当对事件处理程序更新的值进行临时计算,或者像计数器以及下标这种只在方法
内需要的值时,本地变量很有用。你可以在一个方法内将本地变量与分析技术变量混合起来
使用且两个都可以被包含在计算中,但是,在退出方法后只有标准的分析技术变量的值会被
保存。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
49
EasyLanguage 对象自学课程(译)
方法内的本地变量声明语句与你已了解的标准变量声明语句很相似。但是,有两个重要的不
同:1)一个本地变量语句必须总是在变量名前面指定变量类别(int,double,bool 或
string);2)你不能在变量名称后给本地变量指定初始值。而且,由于你不能指望本地变量
本地变量赋值。
begin
{EasyLanguage statements and calculations}
end;
变量类型复习:
Int = Integer(整数)- 没有小数点后数值的正数或负数
Double = Double Float(双精度浮点数)-有小数点后数值的正数或负数
NumToStr(num,dec)
用保留字 NumToStr 可以将数值转化为字符串来绘图。当你希望在数字的文本变体中控制
小数点后位数时,这很有用。
数点后位数作为第二个参数。
Plot1(numtostr(ordersprovider1.Order[0].LimitPrice,2),"Limit");
注意,在网格应用中将数值转换为字符串意味着该列中所得到的值将不会按数值大小排序,
并且小数点后位数设置将不会被应用。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
50
EasyLanguage 对象自学课程(译)
◆课程例题 #8
目标:
(Position 和 Account Value 指标)
结合不同组件
使用工具箱组件,创建读取仓位和账户信息的对象
使用属性编辑器,初始化组件属性
指标:
‘$09_PosValueAcct’
权益仓位的市值。如果没有仓位将显示‘0’
。
工作区:$08_PosValueAcct
建立雷达屏窗口:
创建:任意周期
注意:列出想监视仓位的交易代码
插入代码: $09_PosValueAcct
组件和属性编辑器设置:
PosP:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
51
EasyLanguage 对象自学课程(译)
Updated: PosP_Updated
AccP:
指标练习 #8:‘$08_PosValueAcct’
这 个 例 子 , 我 们 将 从 课 程 例 题 #7 里 创 建 的 #07_PosValue 指 标 开 始 。 将 它 另 存 为
#08_PosValueAcct。
因为 PosP 组件已经是之前指标的一部分,你不需要再添加。但是,如果你从头开始的话,
AccountsProvider1 就会出现在代码编辑器窗口底部的组件盘内。
现在,点击代码编辑器窗口右侧的属性选项卡,打开属性面板并确保在属性编辑器顶部
AccountsProvider1 是被指定的组件。
需要提醒的是,灰色部分的代码是从练习#7 中复制过来的。
tsdata.trading.PositionUpdatedEventArgs args )
begin
PlotValues();
end;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
52
EasyLanguage 对象自学课程(译)
类型而且不接受默认值。
第一个变量用来计算当前代码仓位所占账户净值的百分比,第二个将会用来保存该仓位的
AccountID(账户号)。
begin
begin
Plot2(PosP.Position[0].Quantity, "Qty");
Plot3(PosP.Position[0].OpenPL, "P/L");
if PosP.Position[0].OpenPL>=0 then
SetPlotColor(3,Green)
else
SetPlotColor(3,Red);
器)得到当前仓位的账户号并用账号来引用实时净值数据。
PosAccountID = PosP.Position[0].AccountID;
If AccP.Count>0 then begin
Value1 = PosP.Position[0].MarketValue;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
53
EasyLanguage 对象自学课程(译)
Value2 = AccP.Account[PosAccountID].RTAccountNetWorth;
PcntOfAccount = Value1/Value2;
end;
end
else
begin
Plot2(0, "Qty");
Plot3(0, "P/L");
Plot4("0","% of Acct");
end;
end;
验证指标。
这个指标被用于网格分析窗口中,如雷达屏,并会展示交易代码的仓位以及根据市值算出的
每个仓位所占指定账户的百分比。
ToString()
ToString()方法是将对象属性值转换为字符串的简便方法。这个方法经常被使用,它可以让
你在绘图中显示一个属性的数值或日期值,或者使用打印语句时不必担心属性类型。
Plot1(elsystem.datetime.CurrentTime);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
54
EasyLanguage 对象自学课程(译)
符串,这个字符串可以在绘图中被绘制并可以用于打印语句中。
Plot1(elsystem.datetime.CurrentTime.toString());
OrdersProvider
OrdersProvider 允许用户根据指定筛选条件从一列规定的 TS 账户中使用实时和历史委托单
信息。这个信息与交易管理器内委托单选项卡上的信息很相似。Order 类描述一个指定委托
单可用的属性 (见下)。
你也可以通过筛选使结果中只包含特定账户、时间段、委托单编号以及委托单状态(例如,
已接收,已执行,已拒绝等)。通过使用用户对交易代码、账户、起止日期、委托单状态进
将建立一个包含所有交易代码、账户、时间范围和委托状态的集合。
生变动时接收到通知。例如,OrdersProvider 的特定实例的状态发生任何改变,都将触发
一个通知时间,这样你可以绘制改变的状态。当一个委托单因为一个交易代码发生改变,该
交易代码不在图表或网格中但你希望在分析技术或策略里了解该代码的信息时,这也很有用。
委托单,一直都是一个好想法。
Plot1(OrdersProvider1.Order[0].AvgFilledPrice, "AvgFillPx");
Plot2(OrdersProvider1.Order[0].FilledQuantity, "FillQTY");
Plot3(OrdersProvider1.Order[0].State.ToString(), "State");
Plot4(OrdersProvider1.Order[0].LimitPrice, "LimitPx");
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
55
EasyLanguage 对象自学课程(译)
Plot5(OrdersProvider1.Order[0].Duration, "Duration");
注意:委托单集合按时间顺序排序,从 0(最新)到最早。
◆课程例题 #9
使用工具箱组件,创建一个读取你委托单信息的对象
使用属性编辑器,初始化组件属性
绘制委托单的数量,委托类型,和委托单状态
指标:‘$09_OrderStatus’
如果一个交易代码没有任何下单活动,雷达屏的行将会是空白。
工作区:$09_OrderStatus
建立雷达屏窗口:
创建:任何周期
插入指标:$09_OrderStatus
组件和属性编辑器设置:
OrdersProvider1:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
56
EasyLanguage 对象自学课程(译)
Updated: OrdersProvider1_Updated
指标练习 #9:‘$09_OrderStatus’
创建一个新指标并命名为:“#OrderStatus”。
点 击 代 码 编 辑 器 窗 口 左 侧 的 工 具 箱 选 项 卡 , 双 击 OrdersProvider 组 件 。 默 认 名
OrdersProvider1 将出现在代码编辑器窗口底部的组件盘内。现在,点击代码编辑器窗口右
供器(provider)在所有账户内寻找任何当前交易代码的委托单。现在你就可以在代码中把
OrdP 组件作为一个对象使用来在网格或者图表中访问当前交易代码的仓位值。
方法名与属性相关联。
内的参数是自动生成的,不应被用户修改或移除。
给 PlotValue()插入一个方法调用。
tsdata.trading.OrderUpdatedEventArgs args )
begin
PlotValues();
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
57
EasyLanguage 对象自学课程(译)
end;
态属性,属性代表集合内第一个和最近一个委托单。.Count 属性表示当前代码的实际委托
单状态项目数,但是,在这个例子中,我们只对第一个感兴趣。同样,注意在好几个绘图的
属性名后使用.tostring()方法,这可以将非文本值作为字符串显示在绘图状态行上。
plot1(OrdP.Order[0].EnteredQuantity,"Quantity");
plot2(OrdP.Order[0].type.tostring(),"Type");
plot3(OrdP.Order[0].LimitPrice,"Limit Price");
plot4(OrdP.Order[0].state.tostring(),"State");
end;
end;
PlotValues();
验证指标。
该指标被用于网格分析窗口上,例如雷达屏,并会显示交易代码的任何下达的委托单。
LastBarOnChart
LastBarOnChart 函数被用来判断当前被评估的 bar 是否是图表中最后一根 bar。有时会写
需要创建并发送委托单的条件、这样它们就按实时价格条件而不是历史价格条件下单,这时
就很有用。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
58
EasyLanguage 对象自学课程(译)
在这个例子中,一个为真的 OrderCondition 将只会在当前 bar 上发送委托单。
理方法。类似地,一个未初始化事件(Uninitialized Event)在一个分析技术结束时被触
发,例如当它被从一个图标中移除或当平台关闭时。当你希望在分析技术中设置一些条件,
之前,或者在分析技术关闭前最后执行,这些情况下会很有用。你可以通过从属性编辑器顶
技术添加初始化事件或未初始化事件。在事件列你会找到一对事件, Initialized 和
句加入到新的事件方法,它们就会在每次分析技术或策略被加载或被卸载时执行一次。
IntrabarPersist
IntrabarPersist 是一个变量声明关键词,它用来创建可以每笔交易进行存储并更新值的
tickcount = tickcount + 1;
OrderTicket
OrderTicket 组件为指定交易代码产生 order ticket,并将委托直接通过你的 EasyLanguage
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
59
EasyLanguage 对象自学课程(译)
分析技术或策略发送到市场上。OrderTicket 对象支持大多数 order 参数,这些参数在从国
委托的状态将会和普通委托一起显示在交易管理器的委托单选项卡下。
例如 Symbol(交易代码)、Symbol Type(交易资产)、Account(账户)、Quantity(数
Send()方法进行下单,如下所示:
OrderTicket1.Send() ;
除了使用属性编辑器,当你想在发单前通过编程来决定交易代码、交易数量、交易方向等时,
调用 Send()方法将发送委托单。
OrderTicket1.Symbol = “XYZ”
OrderTicket1.Quantity = 200;
OrderTicket1.Action = tsdata.trading.orderaction.Buy;
OrderTicket1.Send() ;
激活下单对象
设置(选项卡中部)可以实现激活。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
60
EasyLanguage 对象自学课程(译)
注意:如果没有勾选并且指标试图发出委托单,一个运行错误将会出现。
◆课程例题 #10
目标:(市场委托单指标)
激活指标的下单对象设置
指标:‘$10_MarketOrder’
新加载指标会把指标重置来发送另一笔委托。
警告:这个指标将产生一个市价单——确保你没有登录实盘账户。该指标应该应用于虚拟
盘。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
61
EasyLanguage 对象自学课程(译)
工作区:$10_MarketOrder
建立图表:
创建:1 分钟周期图
刻度轴:与标的数据相同
插入指标:$10_MarketOrder
组件和属性编辑器设置:
OrderTicket1:
Action: Buy
Type: Market
AnalysisTechnique:
Initialized: AnalysisTechnique_Initialized
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
62
EasyLanguage 对象自学课程(译)
指标练习 #10:‘$_MarketOrder’
创建一个新指标并命名为:‘#10_MarketOrder’。
出现在代码编辑器窗口底部的组件盘。
OrderTicket1 是被指定的组件。
交易代码的委托了。
输入你的账号。然后,点击属性编辑器顶部的 图标,将其作为一个输入值。单词
个例子中,请再次检查当例题中产生委托单时你所使用的是模拟账号。
还是在属性编辑器中,给这个模拟委托单输入默认 Quantity(数量)10000。与之前一样,
的代码中。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
63
EasyLanguage 对象自学课程(译)
以在 EasyLanguage 代码中创建一个事件处理方法并让新的方法名与属性相关联。我们很快
就会向方法中添加代码。
sender,
elsystem.InitializedEventArgs args )
begin
{ Insert your EasyLanguage statements below }
end;
发出市价单。
在 EasyLanguage 代码中,让我们再加入一个当指标初次运行时代表委托单是否活跃的输入
值。
Input: OrderActive(True);
接下来我们为将在产生委托单的下单规则中用到的高价格目标和低价格目标声明变量。同样,
并允许委托单只被发送一次。
的交易代码的资产类型(股票,期货)设置为当前交易代码的类型。然后我们将
重置,这样一个委托单只被下单一次。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
64
EasyLanguage 对象自学课程(译)
method void AnalysisTechnique_Initialized( elsystem.Object
begin
OrderTicket1.SymbolType = Category;
AllowTradeFlag = OrderActive;
end;
创建一个绘制指标的值的方法。注意该方法中的绘制语句只有在方法 PlotValues()被调用
时执行。
Plot2(LoTarget,"Low Target");
Plot3(AllowTradeFlag.tostring(),"Active");
end;
以在应用指标后迅速得到委托单条件。
PlotValues();
值 在 图 表 最 后 一 根 bar 为 真 时 , 委 托 单 条 件 将 被 执 行 。 在 begin 后 的 语 句 用
直到图表刷新之前不会再下其他单。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
65
EasyLanguage 对象自学课程(译)
OrderTicket1.send();
AllowTradeFlag = False;
end;
验证指标。
打开图表并插入指标。
表时有效。如果删除指标之后再加载,你需要再次选中勾选框。
声明对象变量
到目前为止,我们用的对象都是通过双击组件自动生成的。正如我们之前看到的,用来创建
的代码”的隐藏代码块中,这个隐藏代码块可以通过代码编辑器的视图菜单访问。
是头几行代码:
这 里 包 含 了 一 个 tsdata.trading.OrderTicket 类 型 的 变 量 声 明 , 该 变 量 名 为
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
66
EasyLanguage 对象自学课程(译)
OrderTicket1,默认值为‘NULL’。这个名字应该很熟悉,因为它是我们在组件编辑器
内设置的组件对象的名称,并且我们调用它来发单。不论是“设计器生成的代码”为你创建
的,还是你直接在分析技术代码中添加的,每个对象变量看起来都很相似,都是对象类型后
跟对象名称和一个初始值‘NULL’。
你追踪一个 Order(委托单)的对象变量的变量声明:
在本课程的后面,你将声明其他允许你创建并引用你自己的非组件对象的对象变量。
委托单的状态所需要的步骤:
an Order object }
tsdata.trading.OrderUpdatedEventArgs args)
begin
Plot2(myOrder.State);
end;
instance }
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
67
EasyLanguage 对象自学课程(译)
myOrder = OrderTicket1.Send();
myOrder.Updated += OrderStatusUpdate;
BracketOrderTicket
BracketOrderTicket 组件产生一个 bracket OCO 委托单,它由指定交易代码的两笔相同委
钮手动下单时可用的委托单参数。
(例如买、卖等)
,这些都是创建一个有效委托单所需要的。另外,你需要指明 TargetType
和 ProtectionType 的限价和止损价。
当 所 有 属 性 被 设 置 好 后 , 通 过 使 用 Send() 方 法 在 EasyLanguage 代 码 中 添 加 一 个
BracketOrderTicket 组件的引用来下单。
单一起出现在交易管理器的委托单选项卡里。
BracketOrderTicket1.Send();
除了使用属性编辑器,你也可以在想要通过编程来在发单前决定交易代码、数量、交易方向、
情况,给指定的组件调用 Send()方法都提交订单。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
68
EasyLanguage 对象自学课程(译)
BracketOrderTicket1.LimitPrice = myOrder.AvgFilledPrice + .05);
BracketOrderTicket 1.Send() ;
◆课程例题 #11
目标:
(OSO Bracket Order 指标)
创建一个事件处理方法来跟踪 Order(委托)状态
用一个打印日志(print log)来跟踪市价委托的状态直到委托被执行
指标:
‘$11_OSOBracketOrder’
目标和保护性的止损目标。委托状态在打印日志(print log)内显示。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
69
EasyLanguage 对象自学课程(译)
工作区:$11_OSOBracketOrder
建立图表窗口:
创建:1 分钟区间
刻度轴:与标的数据相同
插入指标:$11_OSOBracketOrder
组件和属性编辑器设置:
OrderTicket1:
Action: Buy
BracketOrderTicket1:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
70
EasyLanguage 对象自学课程(译)
Action: Sell
TargetType: Limit
ProtectionType: StopMarket
Analysis Technique:
Initialized: AnalysisTechnique_Initialized
指标练习#11:‘$11_OSOBracketOrder’
#11_OSOBracketOrder.
由于 OrderTicket1 组件已经是你之前创建的指标的一部分,你不需要再添加一遍。但是,
BracketOrderTicket1 将出现在代码编辑器窗口底部的组键盘内。
现在,点击代码编辑器右侧的属性选项卡,打开属性面板,确保在属性编辑器顶部,
BracketOrderTicket1 是指定的组件。
代码下单。
点击 Account 属性旁边的空白文本框,然后点击右侧的向下的箭头,从下拉列表内选择
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
71
EasyLanguage 对象自学课程(译)
iAccount1。这和我们市价 order ticket 所用的是同一个模拟账号。同样,用一样的方法,
方所下单的委托类型。
Input: OrderActive(TRUE);
Input: BracketAmt(.001);
同样,声明一个对象变量,该变量被用来引用在市价单发出时创建的市价单对象。
为当前交易代码类型的语句,就像前一个例题一样。记住,当你在分析技术的属性编辑器内
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
72
EasyLanguage 对象自学课程(译)
10)。
sender,
elsystem.InitializedEventArgs args )
begin
OrderTicket1.SymbolType = Category;
BracketOrderTicket1.SymbolType = Category;
AllowTradeFlag = OrderActive;
end;
的本地方法变量来保存状态信息字符串。
tsdata.trading.OrderUpdatedEventArgs args)
begin
下面的一组方法内语句将建立委托单状态信息字符串并显示在打印日志中。
myStatus = myOrder.State.tostring();
print(myStatus);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
73
EasyLanguage 对象自学课程(译)
下面的语句只在市价单执行后执行一次。将 bracket 价格分别设为高于和低于市价单执行
中。
BracketOrderTicket1.Quantity = iQuantity1;
BracketOrderTicket1.Send();
BracketSent = True;
BracketOrderTicket1.LimitPrice.tostring(),
end;
end;
这里是前一个例题中用来绘制指标值和发出一开始的市价单的代码。
plot2(LoTarget,"Low Target");
plot3(AllowTradeFlag.tostring(),"Active");
end;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
74
EasyLanguage 对象自学课程(译)
PlotValues();
但是,在这个例题中我们创建一个允许我们在订单被发出、接收和执行时进行跟踪的订单对
象。我们通过将 OrderTicket1.Send()方法返回的委托单对象赋值给我们早先声明的
价单执行时发送 bracket 单。
MyOrder = OrderTicket1.Send();
MyOrder.Updated += OrderStatusUpdate;
AllowTradeFlag = False;
end;
验证指标。
在图形中插入指标。
生成委托单之前,标有启用下单对象的勾选框需要被勾选。你可以一次性为雷达屏所有行打
开此功能,也可以逐行单独打开。这个设置只在指标还应用于雷达屏时有效。如果删除指标
之后再加载,你需要再次选中勾选框。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
75
EasyLanguage 对象自学课程(译)
MarketDepthProvider
MarketDepthProvider 组件创建一个对象,这个对象让你引用更新后的包含特定代码买卖报
息相似。
市场深度集合:
买价和卖价
参与者
Bids(买价)和 Ask(卖价)集合属性允许你访问参与者(ECNs)列出来的股数。BidLevel
和 AskLevel 集合属性允许你访问所有参与者在特定价格的混合数据。Participants(参与
关联的值变动时你会被通知。
MarketDepthProvider 将信息储存在五个数据集合中:
(marketdepthprovide1.Bids[row].Price)
(marketdepthprovide1.Asklevels[lvl].TotalSize)
Participants – 给每个Participant标序号:
(marketdepthprovide1.Participants[par].Bids.Count)
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
76
EasyLanguage 对象自学课程(译)
◆课程例题 #12
目标:
(市场深度指标)
用一个工具箱组件来创建一个在一定买价卖价水平上计算并显示股数或合约总数
的对象
根据价格水平访问市场深度数据
循环总计不同水平的买单数量和卖单数量
指标:
‘$12_TotalBidAskSize’
单数量。
工作区:$12_MarketDepth
建立雷达屏窗口:
创建:五分钟周期
插入指标:$12_TotalBidAskSize
组件和属性编辑器设置:
MDP:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
77
EasyLanguage 对象自学课程(译)
Updated: MDP_Updated
指标练习#12:‘$12_TotalBidAskSize’
创建一个新指标并命名为:#12_TotalBidAskSize
点 击 代 码 编 辑 器 窗 口 左 侧 的 工 具 箱 选 项 卡 , 双 击 OrdersProvider 组 件 。 默 认 名
MarketDepthProvider1 将出现在代码编辑器窗口底部的组键盘内。
现在,点击代码编辑器窗口右侧的属性选项卡,打开属性面板并确保在属性编辑器顶部
MarketDepthProvider1 是被选中的组件。
参数改为“3”。在处理方法中加入一个调用语句 PlotValues()。
tsdata.marketdata.MarketDepthUpdatedEventArgs args )
begin
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
78
EasyLanguage 对象自学课程(译)
PlotValues();
end;
计买单数量和卖单数量时被用来作为循环计数器。两个本地变量会累计
MarketDepthProvider 组件要求的总的买和卖的市场深度(数量)。
begin
下面一组语句将加总从组件对象得到的买价和卖价水平的买卖单数量。首先,将买和卖的总
数变量设为 0。然后,通过测试来检查提供器(provider)是否含有足够的买价水平(bid
加总。如果足够的话,在一个循环中把每个买价水平的数量加入总计。给卖价水平创建一个
AskDepthTot = 0;
BidDepthTot = 0;
End;
end;
绘制总数,如果买单总数大于卖单总数,将买单数量绘图的背景颜色设置为绿色,如果卖单
总数大于买单总数则将卖单数量绘图的背景颜色设置为红色。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
79
EasyLanguage 对象自学课程(译)
Plot1(BidDepthTot,"Bid Size");
Plot2(AskDepthTot,"Ask Size");
setplotbgcolor(2,black);
end
Else begin
setplotbgcolor(2,darkred);
setplotbgcolor(1,black);
end;
end;
验证指标。
在雷达屏中加载指标。
QuotesProvider
QuotesProvider 组件创建一个让你引用指定交易代码的报价字段 quote field(快照
snapshot)的对象。报价字段值可能会根据实时更新,但没有历史数据可用。
个由逗号分隔的一列字段名供查询。这两者都是必须填写的筛选属性。只有必须填写的报价
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
80
EasyLanguage 对象自学课程(译)
plot1(QuotesProvider1.Quote["Ask"].doublevalue,"Ask");
报价字段价格通常被引用为 DoubleValue,
成交量、交易规模值通常作为 IntegerValue,
帮助主题列出可用的报价字段名以及和它们相关的数据值类型。报价字段的值类型也显示在
的值改变时收到通知。当你询问一个不在你的图表或网格中、但需要在分析技术或策略中使
用的代码的报价时,这个功能尤其有用。
决定 QuotesProvider 能不能找到报价。
◆课程例题 #13
目标:
(报价指标)
用 QuotesProvider 对象访问报价(快照)数据
使用一个“value”属性读取并绘制一个报价字段的适当的值类型
指标:“$13_Quotes”
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
81
EasyLanguage 对象自学课程(译)
工作区:$13_Quotes
建立雷达屏窗口:
创建:5 分钟区间
插入指标:$13_Quotes
组件和属性编辑器设置:
QP:
Name: QP (改变组件名)
Fields: “last,tradevolume,tradetime”
Updated: QP_Updated
指标练习 #13:“$13_Quotes”
创建一个新的指标并命名为"#13_Quotes"。
QuotesProvider1 将出现在代码编辑器窗口底部的组件盘内。现在,点击代码编辑器右
tradevolume, tradetime”,这个字符串用来指明从交易代码获取的报价字段(Quote
fields)。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
82
EasyLanguage 对象自学课程(译)
一 列 可 用 的 报 价 字 段 名 称 和 数 据 类 型 可 以 在 字 典 和 EasyLanguage 对 象 引 用 里
为对象使用,来访问图表或网格内当前交易代码的值。
名称与属性联系起来。
不应该被删除或改动。
句代替。
PlotValues();
end;
现在,在方法中添加下列语句,这些语句将绘制报价集合内指定的报价字段。要读取特定报
价值,你还需要为三个绘图中的每一个在 Quote["fieldname"]后添加合适的属性类型(即
段。
plot2(QP.Quote["TradeVolume"].integervalue,"Volume");
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
83
EasyLanguage 对象自学课程(译)
plot3(QP.Quote["TradeTime"].datevalue.tostring(),"Time");
end;
PlotValues();
验证指标。
在雷达屏中加载指标。
FundamentalQuotesProvider
FundamentalQuotesProvider 组件创建一个让你引用指定交易代码的基本面引用字段
值的对象。基本面引用字段值通常不会实时更新并且有的可以让你提到之前报告周期的值。
含一列逗号分隔的基本面字段名供查询。两者都是必填筛选属性。只有要求的字段(例如
多少个报告周期之前(用[0]表示最近的周期),例如:
plot1(FundamentalQuotesProvider1.Quote["SBBF"].doublevalue[0],
"EPS");
注意基本面字段的值类型后的方括号内多少周期前的序数是必需的,即使指定字段不报告历史值。
列出可用的基本面数据字段名以及他们相应的数据值类型。一个基本面字段的值类型也被展
示在 EL 字典描述窗格中。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
84
EasyLanguage 对象自学课程(译)
生改变时收到通知。在你请求的交易代码不在你的图表或网格中,但是你的分析技术或策略
需要了解时,这尤其重要。
与其他提供器(provider)一样,在试着从集合中访问一个标有序号的元素前,用 Count
◆课程例题 #14
使用工具箱组件来创建一个为指定交易代码显示基本面报价值的对象
用属性编辑器指定要查询的基本面字段。
指标:$14_FundQuotes
它还为每个代码计算并绘制实时市盈率。
工作区:$14_FundQuotes
建立雷达屏窗口:
创建:30 分钟周期
插入指标:$14_FundQuotes
组件和属性编辑器设置:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
85
EasyLanguage 对象自学课程(译)
FQP:
Fields: "sbbf,yield,price2bk,f_lstupdat ”
Updated: FQP_Updated
指标练习#14:$14_FundQuotes
创建一个新指标并命名为#14_FundQuotes
是属性编辑器顶部指定的组件。
用 基 本 面 字 段 名 和 数 据 类 型 可 以 在 字 典 里 的 FundamentalQuoteFields 类 下 和
码的值了。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
86
EasyLanguage 对象自学课程(译)
空白。双击事件名 Updated,在你的 EasyLanguage 文档中创建一个事件处理方法,并
将新方法名与属性相关联。
生成的,不应被移除或改动。
句。
tsdata.marketdata.FundamentalQuoteUpdatedEventArgs args )
begin
PlotValues();
end;
性内排列顺序相匹配的数字序数进行引用,“0”代表第一个元素等等。与之前例题一样,
你需要为五个绘图中的每个 Quote[n]添加合适的属性值类型。因为基本面引用可以包括之
前报告周期里的历史值,你还需要为每个值用表示“多少周期前”的方括号指明引用的是哪
个周期。要想了解字段名和数据类型,参考字典中的 FundamentalQuoteFields 类或
现运行错误。
begin
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
87
EasyLanguage 对象自学课程(译)
if FQP.HasQuoteData(0) then
Plot1(FQP.Quote[0].DoubleValue[0],"EPS");
接下来访问并绘制一个周期前的市盈率。
if FQP.HasQuoteData(0) then
Plot2(FQP.Quote[0].DoubleValue[1],"Prev EPS");
然后,我们绘制当前周期的剩余字段。
if FQP.HasQuoteData(1) then
Plot4(FQP.Quote[1].DoubleValue[0],"DivYield %");
if FQP.HasQuoteData(2) then
Plot5(FQP.Quote[2].DoubleValue[0],"Px/Bk");
if FQP.HasQuoteData(3) then
Plot6(FQP.Quote[3].DateValue[0].tostring(),"UpDate");
SetPlotColor(1, Cyan)
else
SetPlotColor(1, Magenta);
end;
end;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
88
EasyLanguage 对象自学课程(译)
PlotValues():
验证指标。
在雷达屏中插入指标。
Workbook(Excel)
Workbook 组件创建一个对象,该对象让你在分析技术和微软 Excel 电子表格内的外部工作
簿之间建立连接。
件的完整路径和文件名。其他筛选属性用来决定建立连接的额外设置,例如电子表格是否可
以在其他分析技术间共享或者完成后是否在电子表格上保存数据。
性从一个特定单元格的行和列来读取或写入。
二列第四行的单元格内写入数字 123.45:
Workbook1[“Prices”].Cells[2,4] = 123.45;
同样,下一个语句读取同一个“Prices”选项卡(表格)的第三列第四行内的数值并将它赋
值给 Value1:
Value1 = Workbook1[“Prices”].CellsAsDouble[3,4];
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
89
EasyLanguage 对象自学课程(译)
我们用 CellAsDouble 属性从单元格读取来确保单元格里的任何数值(或空白值)都会被读
取。但是,如果单元格内包含一条文本信息,语句将会产生错误,因为单元格的数据类型不
匹配。
属性引用的文件夹地址已经创建电子表格文件。
往 Excel 内写入值
wkbk[“AcctPL”].Cells[5,10] = 25.50;
从 Excel 内读取值
保存电子表格数据:
设置对象属性“SaveOnClose = TRUE”。
◆课程例题 #15
目标:(Excel 指标)
向 Excel 电子表格内写入更新后的值
从电子表格内读取计算后的值
指标:“$_Excel”
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
90
EasyLanguage 对象自学课程(译)
工作区:$15_Excel
建立图形:
创建:30 分钟周期
插入指标:$15_Excel
组件与属性编辑器设置:
WkBk:
AccP:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
91
EasyLanguage 对象自学课程(译)
Accounts: iAccount1
Updated: AccP_Updated
PosP:
Symbols: symbol
Updated: PosP_Updated
指标练习 #15:“$15_Excel”
创建新指标并将它命名为:“#15_Excel”。
点 击 代 码 编 辑 窗 口 左 侧 的 工 具 箱 选 项 卡 , 双 击 以 下 三 个 组 件 : Wrokbook ,
AccountsProvider,PositionsProvider1 将出现在代码编辑窗口底部的组键盘内。
现在,点击代码编辑窗口右侧的属性选项卡,打开属性面板并确保属性编辑器顶部的
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
92
EasyLanguage 对象自学课程(译)
法在每次你的一个仓位发生变化时被调用。
在文档顶部,创建两个变量。第一个指明电子表格中你引用的选项卡。第二个保存电子表格
在 AccP 事件处理方法内我们添加一系列语句,这些语句将提供器(provider)集合里第一
tsdata.trading.AccountUpdatedEventArgs args )
begin
begin
WkBk[WBTab].Cells[1, 6] = AccP[0].AccountID;
WkBk[WBTab].Cells[2, 6] =
AccP[0].RTDayTradingBuyingPower;
WkBk[WBTab].Cells[3, 6] = AccP[0].RTRealizedPL;
WkBk[WBTab].Cells[4, 6] = AccP[0].RTUnrealizedPL;
end;
end;
入提供器(provider)集合里每个仓位的数个属性。
tsdata.trading.PositionUpdatedEventArgs args )
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
93
EasyLanguage 对象自学课程(译)
var: int it;
begin
for it = 0 to PosP.Count - 1
begin
end;
这个例子假设我们的仓位不超过 10 个。写入已存在仓位数据后将添加一行空白单元格以确
保当一个仓位从集合中移除后之前的行不再显示。
WkBk[WBTab].Cells[1, 11 + it ] = "";
WkBk[WBTab].Cells[2, 11 + it ] = "";
WkBk[WBTab].Cells[3, 11 + it ] = "";
WkBk[WBTab].Cells[4, 11 + it ] = "";
第 21 行第 4 列的单元格包含一个将第 11 到第 20 行的第四列加总的公式。这个计算后的值
If LastBarOnChart then
plot1(TotalPL, "TotalP&L");
end;
最后,一条零线将被显示出来,作为划分损益正负的参照。
Plot2(0);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
94
EasyLanguage 对象自学课程(译)
plot1(TotalPL, "TotalP&L");
end;
验证指标。
向一个图表内插入指标。
创建非组件对象
不是所有的对象都是通过工具箱创建的。你可以通过声明对象变量并将对象的实例赋值给变
一个对象的新实例并赋值给对象变量的过程也被称为实例化 instantiation。
行时,创建新的对象实例很常见。
New
保留字 new 在赋值语句中被用于创建一个指定类(类型)对象的实例(或 copy)并调用该
建的对象被赋值给之前声明的相同类类型(class type)的对象变量。
类型的对象的新实例赋值给该变量:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
95
EasyLanguage 对象自学课程(译)
整的命名空间引用。
Create()
Create()方法也可以用于创建指定类(类型)的对象的实例并调用该类的构造器。Create()
一部分时经常被使用。
例 如 , 下 面 的 代 码 为 一 个 名 为 gdname 的 全 局 字 典 对 象 声 明 变 量 并 且 将 一 个 新 的
并且有一个独特的共享名。
gdname=elsystem.collections.GlobalDictionary.Create(true,"IDst
ring")
Vector 集合
Vector 被用于保存一系列值作为被命名集合的有序数的元素。这与 EasyLanguage array 类
似;但是,vector 有额外的能力,例如多种向集合中插入值的方法以及在集合内存储元素
(如对象)的能力。
大部分我们到目前使用过的对象都是通过在工具箱内双击组件创建的。要创建一个 vector,
或任何非组件对象,你首先需要声明一个合适类型的变量并将同样类型对象的新实例赋值给
变量。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
96
EasyLanguage 对象自学课程(译)
例 如 , 这 里 是 一 个 名 为 myValues 的 变 量 的 声 明 语 句 , 该 变 量 被 作 为
为 null。
但是通常在代码运行的开端处进行,如下所示:
begin
end;
一旦被创建后,Vector 的长度可以根据你在任何位置添加或删减数据而相应地增长或缩短。
第一个元素的序数为 0.
向 Vector 内添加数据元素:
vectorname.Insert(Index, 25.50);
向 Vector 内移除数据元素:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
97
EasyLanguage 对象自学课程(译)
Pop_Back – 将Vector集合最末端元素移除
vectorname.Pop_Back();
Erase – 移除指定位置元素并将其他元素向前移一位
vectorname.Erase(Index);
vectorname.Erase(iStart, iEnd);
从 Vector 访问数据元素:
Value1 = vectorname[index];
在函数内使用 Vectors:
◆课程例题 #16
目标:(Vector 指标)
向 vector 中添加值
访问 vector 中的值
指标:“$16_Vector”
上将低价平均值作为结果绘制在图表上。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
98
EasyLanguage 对象自学课程(译)
工作区:$16_Vector
建立图形分析窗口:
创建:30 分钟周期
插入指标:$16_Vector
组件和属性编辑器设置:
无组件
Analysis Technique:
Initialized: AnalysisTechnique_Initialized
指标属性:
刻度轴:与标的数据相同
图表类型:将第一个绘图设置为 Point 类型
指标练习 #16:“$16_Vector”
创建新指标并命名为“#16_Vector”.
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
99
EasyLanguage 对象自学课程(译)
到现在,我们在例题中用组件创建对象。这个例子我们将用非组件对象 Vector,它和
加数据并且更轻松地管理它的长度。
input: VectorMax(5);
第二个变量是一个用来辨认关键反转发生的真假值。
var: KR(False);
只执行一次的事件处理方法。
看看之前例子中包括了组件创建对象的设计器生成代码,你会看到用过的每个组件对象类似
的赋值语句。
sender,
elsystem.InitializedEventArgs args )
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
100
EasyLanguage 对象自学课程(译)
begin
end;
每当找到一个关键反转形态,即当前图条的最低价低于之前三根图条并且当前图条的收盘价
高于之前一根图条的收盘价,下面的语句将会把 KR 设为 True。如果形态没有找到,KR 被设
置为 False。
内的项目数超过指定的最大值,Pop_Back()方法被用于移除最后的项目这样集合内的项目
Point,这样在关键反转被找到处就会出现一个粗点。
if KR then begin
AvgLow.insert(0,Low);
end;
最后,
如果 vector 内存在任何项目,
我们将之前 vector 内的最低价的平均值绘制为一条线,
这条线代表根据当前关键反转所下委托的建议止损出逃价格。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
101
EasyLanguage 对象自学课程(译)
If AvgLow.Count = VectorMax then
plot2(Average(AvgLow,VectorMax),"KR Avg Low");
验证指标。
在图表内插入指标。
值或对象。
大多数我们到目前为止使用过的对象都是通过双击工具箱内组件创建。要创建一个非组件对
象,首先需要声明一个正确类型的变量,然后将相同类型的对象的新实例赋值给变量。
例 如 , 这 里 是 一 个 名 为 myGD 的 变 量 的 声 明 语 句 , 该 变 量 创 建 的 类 型 是
elsystem.collection.GlobalDictionary,初始值为 null。
myGD = elsystem.collections.GlobalDictionary.Create();
不加任何参数使用 Create()方法将创建一个相同窗口类型(图形分析、雷达屏等)内运行
的分析技术共享的默认(未命名)的 GlobalDictionary。每个向这个默认全局字典读取或
写入的分析技术需要一个对象变量,这个对象变量被同样的空白 Create()方法创建的
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
102
EasyLanguage 对象自学课程(译)
GlobalDictionary 实例赋值。
作为备选,两个参数的方法 Create(shareType,shareName)可以被用来创建一个在不同窗口
来避免使用默认字典可能发生的冲突。每个向这个命名的全局字典内读取或写入的分析技术
GlobalDictionary 的对象实例。下列语句创建一个在不同窗口类型间用一个共享名工作的
GlobalDictionary 实例。
myGD = elsystem.collections.GlobalDictionary.Create(TRUE,
“GD_sharedname");
读。注意当读取字典值的时候 Items[]值需要用正确的数据类型被赋值给一个变量。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
103
EasyLanguage 对象自学课程(译)
◆课程例题 #17
目标:(GDWrite)
给 GlobalDictionary 一个特定的共享名称
向全局字典中写入值
指标:“$17_GDWrite”
工作区:$17_GDWrite
建立图形窗口:
创建:日线图
插入指标:$17_GDWrite
组件和属性编辑器设置:
无组件
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
104
EasyLanguage 对象自学课程(译)
分析技术:
Initialized: AnalysisTechnique_Initialized
指标练习 #17:“$17_GDWrite”
创建一个新指标并命名:"#17_GDWrite"
对值,该值可以被其他从相同全局字典读取值的分析技术读取。
首先,声明一个输入值,规定回看时间长度,这个时间长度将在计算基准代码收盘价的百分
比变动时会遇到。
然后,声明一个用来引用全局字典实例的对象变量,以及另一个表示计算基准代码表现值的
变量。
double BenchPerf( 0 );
建一个只在分析技术第一次运行时执行一次的事件处理方法。
在 AnalysisTechnique_Initialized 方 法 内 , 添 加 一 个 语 句 , 它 包 括 一 个 双 参 数
sender,
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
105
EasyLanguage 对象自学课程(译)
elsystem.InitializedEventArgs args )
begin
GD=elsystem.collections.GlobalDictionary.Create(true,"myAll
");
接下来的一系列语句检查字典内是否已经包含项目名“TopSymbol”(如果另一个 GDWrite
指标在别处运行的话就有可能)。如果该项目不存在,将它和相关的“TopValue”项目添加
它们只在分析技术加载时执行。
GD.Add("TopValue",BenchPerf);
end;
end;
一旦图表被加载并到达最后一根图条,下面的语句被执行。它们根据回看时长内收盘价的百
GlobalDictionary 项目,并从字典中绘制刚刚保存的基准值。第二幅绘图显示一条参考零
线。因为该代码是指标主体的一部分,表现值在每笔交易都进行计算并写入全局字典。
GD.Items["TopValue"] = BenchPerf;
GD.Items["TopSymbol"] = symbol;
end;
Plot2(0);
验证指标。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
106
EasyLanguage 对象自学课程(译)
在 30 分钟图形分析上插入指标。
◆课程例题 #18
目标:(GDRead Indicator)
从另一个分析技术引用 GlobalDictionary 对象
从指定全局字典中读取更新过的值
指标:“$18_GDRead”
局字典内读取信息。?????
工作区:$18_GDRead
建立雷达屏窗口:
创建:每个交易代码周期均为一日
插入指标:$18_GDRead
组件和属性编辑器设置:
无组件
分析技术:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
107
EasyLanguage 对象自学课程(译)
Initialized: AnalysisTechnique_Initialized
指标练习 #18:“$18_GDRead”
创建一个新指标并命名“#18_GDRead”。
我们在基准表现值每次被其他分析技术改变时读取。
为了少打一些字,你可以从前一个例子中复制输入和变量声明,然后加上保存另外两个表现
值的变量声明以及字典内的基准交易代码名。
string BenchSymbol("");
只在分析技术初次运行时执行一次的事件处理方法。
数,然后创建一个引用“myAll”共享字典的方法赋值。接着,将全局字典的两个事件与一
个在全局字典项目被添加或值改变时被调用的处理方法相关联。
sender,
elsystem.InitializedEventArgs args )
begin
GD =
elsystem.collections.GlobalDictionary.Create(true,"myAll");
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
108
EasyLanguage 对象自学课程(译)
GD.ItemAdded += Global_ItemChanged;
GD.ItemChanged += Global_ItemChanged;
end;
下面的方法必须手动输入,因为创建非组件对象没有自动生成的办法。它将调用 PlotValue
方法,在全局字典项目改变时显示。
elsystem.collections.itemprocessedEventArgs args )
begin
PlotValues();
end;
在 PlotValue()方法中,添加语句来从字典中获取基准交易代码名和表现值,前提是它们存
begin
end;
下面的语句根据回看区间内的收盘价计算雷达屏当前行内交易代码表现。后面接着第二个语
句,这个语句计算当前交易代码与基准交易代码之间表现的差值。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
109
EasyLanguage 对象自学课程(译)
绘制基准交易代码名和相关表现值。
end;
由于表现值是基于全局字典基准值的改变或者来自当前行交易代码值的更新,在你的代码主
体内会有一个额外的 PlotValues()方法调用。
PlotValues();
验证指标。
在雷达屏中插入指标。向雷达屏中添加一组交易代码,把交易代码周期改为 30 分钟以匹配
图表中的基准周期。将图形分析窗口与雷达屏窗口联动,这样在雷达屏中点击一条交易代码
就可以改变图表中的基准交易代码。
Using-(保留字)
保留字 Using 允许你在 EasyLanguage 代码中引用对象类名而不必每次都输入完整的命
名空间部分。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
110
EasyLanguage 对象自学课程(译)
保留字“using”让你所指明对象类型的命名空间部分可以被假定,这样在每个声明中只有
对象类型自己需要被指定,如下所示:
using elsystem.windows.forms;
窗体控件(Form Controls)
EasyLanguage 的 Forms 类让你可以创建对象,该对象可以生成独立窗口作为分析技术或
策略的一部分。窗体(Form)对象由容器控制(例如窗体,组,面板)组成,他们用来分组
Form 窗口在分析技术或策略中创建并激活
每个容器的属性和控制对象可以通过 EasyLanguage 访问
多种外形控制的每一个都可以通过给大小、地址、标签以及特定功能设置对象属性在初始方
法中进行设置。
窗体 - 一个放置窗体相关的控制和容器的窗口
面板 - 一个窗体内区域,用于在外观上组织一系列控件
按钮 - 一个用于生成用户点击事件并调用处理方法的按钮
复选框 - 一个小方框,可以被用户勾选或取消勾选。单击时它们发送事件,调用
一个用于检查勾选或未勾选状态的方法。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
111
EasyLanguage 对象自学课程(译)
组合框 - 在下拉列表中向用户显示一个项目列表,用户作出选择时发送事件。
标签 - 在窗体上显示不可编辑的文本。它们可以用于提供说明或标识周围的控件。
ListView - 以多列格式显示文本项的集合。用户作出选择时,它们发送事件。
NumericUpDown - 显示数值,并且,通过使用上下箭头,用户可以以预定义的步骤
值对数值进行快速的递增或递减。
单选按钮 - 通常放在两个或更多组中,允许用户从一组互斥选项中进行选择。单
选按钮可以在单击时发送事件,也可以在运行时查询它们的状态。
文本框 - 显示一个可以由用户进行编辑的字符串。
◆课程例题 #19
目标:(Forms 指标)
创建一系列在弹窗中显示的窗体控件对象
将事件赋值给由你的代码处理的特定控件
指标:“$19_Simple_Form”
这个例子展示如何用按钮点击改变窗体内的文本
工作区:$19_Simple Form
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
112
EasyLanguage 对象自学课程(译)
建立图形分析窗口:
创建:30 分钟周期
插入指标:$19_Simple Form
组件和属性编辑器设置:
无组件
分析技术:
Initialized: AnalysisTechnique_Initialized
指标练习 #19:$19_SimpleForm
创建一个新指标并命名:#19_SimpleForm。
using elsystem.windows.forms;
接下来,声明三个对象变量,用来保存我们将会在这个例子中用到的三个窗体控件。这些控
件包括一个含有按钮控件和文本控件的窗体容器。
创建一个分析技术初始化方法,该方法包含只在分析技术第一次运行时执行的语句。用属性
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
113
EasyLanguage 对象自学课程(译)
sender,
elsystem.InitializedEventArgs args )
begin
在 begin 语句后,我们给每个控件创建一个实例并将它赋值给相应的对象变量。对大多数窗
体控件来说,create 方法用来指定控件显示的初始文本以及控件宽高的像素数。例如,form1
显示“Simple Form”。
在指定每个控件的尺寸和初始文本后,我们需要指定控件在窗体容器中的位置。这里,左上
像素并离窗体顶部 40 像素。
button1.Location( 30,10 );
textbox1.Location( 30, 40 );
许多控件支持特定事项发生时进行通知的事件,特定的事项包括但不限于点击控件或控件的
件回应。重要的是每次按钮被按,相关方法的代码将被执行。
button1.Click += OnButtonClick;
一旦控件被创建、指定位置、并设置好对事件进行回应,我们将它们添加进窗体容器中并展
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
114
EasyLanguage 对象自学课程(译)
示内含位于指定位置的控件的窗体窗口。
form1.AddControl(button1);
form1.AddControl(textbox1);
form1.Show();
end;
现在创建一个事件方法,每当窗体内按钮被点击时该事件方法被调用。该方法参数与其他任
何窗体控件事件处理器通常一样,你可以将它用作其他窗体控件事件处理器的模板。
elsystem.EventArgs args )
begin
接下来的语句会在按钮被按后改变按钮和文本框内的文本。注意我们是如何用按钮文本来判
断状态,并为下一个按钮点击事件设置新按钮文本的。
end;
end;
验证指标,并在图表内插入指标。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
115
EasyLanguage 对象自学课程(译)
◆课程例题 #20
目标:(Forms 指标)
创建一系列以弹窗显示的窗体控件对象
将时间赋值给操纵一对趋势线的特定控件
指标:“$20_TrendLine S&R”
该指标在自定义弹窗中用窗体控件改变图表中一对趋势线的位置和样式。
工作表:$20_TrendLine S&R
建立图形分析窗口:
创建:30 分钟周期
插入指标:$20_TrendLine S&R
组件和属性编辑器设置:
无组件
无属性设置
分析技术:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
116
EasyLanguage 对象自学课程(译)
Initialized: AnalysisTechnique_Initialized
创建一个新指标并命名:#20_TrendLineS&R。
这个例子比上一个简单的按钮和文本框练习要长很多并看起来更复杂,但是主要区别在于创
建的窗体控件的数量和多种对窗体控件事件反馈的事件处理方法。
不论有多少个控件,创建一个控件窗口(容器)并在其中使用控件(按钮、标签、组合框)
共有七个步骤。这些步骤包括:1)为每个控件声明对象变量,2)给每个控件(包括初始文
本和大小)创建新的实例,3)在窗体容器内设置控件位置,4)为控件设置其他参数,5)
将事件方法与控件相关联,6)向容器内添加控件,7)显示控件窗口。
象实例的时候将需要重复输入每个对象类型命名空间部分的工作减少到最小。
Using elsystem.windows.forms;
Using elsystem.drawing;
首先,我们声明一系列对象变量用于引用窗体控件对象和它们的属性。这是创建一个窗体的
七个基本步骤中的第一步。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
117
EasyLanguage 对象自学课程(译)
Label label4( Null ),
接下来,我们声明两个数字变量来跟踪我们将会添加到图表中的趋势线的高位和地位。
vars: TL_High(0.0),TL_Low(0.0);
一个分析技术初始化方法(initialized method)会被创建,它包含了只在分析技术第
一次运行时执行的语句。因为我们只需要执行一次窗体创建和初始化语句,使用初始化方法
创建一个方法。
sender,
elsystem.InitializedEventArgs args )
begin
在方法内的第一部分语句中,我们将创建每一个窗体控件对象的实例,包括任何初始文本和
控件的宽度高度,并将它们赋值给对应控件的对象变量。这是创建窗体七步骤的第二步。
panel1 = Panel.create(295,130);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
118
EasyLanguage 对象自学课程(译)
spinner1 = NumericUpDown.create(60,25);
label1 = Label.create(symbol,80,18);
label3 = Label.create("Thickness:",60,18);
label6 = Label.create("Brightness",60,18);
radio1 = RadioButton.create("Thin",45,25);
radio2 = RadioButton.create("Medium",65,25);
radio3 = RadioButton.create("Heavy",65,25);
combobox1 = ComboBox.create("",100,22);
建一个窗体七个步骤的第三步。
panel1.Location(10,25);
button1.Location(220,95);
spinner1.Location(90,10);
label1.Location(20,5);
label2.Location(20,15);
label3.Location(20,39);
label4.Location(160,15);
label5.Location(230,15);
label6.Location(20,100);
radio1.Location(90,35);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
119
EasyLanguage 对象自学课程(译)
radio2.Location(145,35);
radio3.Location(215,35);
checkbox1.Location(20,65);
checkbox2.Location(130,65);
combobox1.Location(90,98);
下面的语句为控件设置额外的属性,例如它们的初始显示值或外观。这是创建窗体七个步骤
题。
label4.ForeColor = Color.Red;
label5.ForeColor = Color.Blue;
panel1.BorderStyle = 1;
spinner1.DecimalPlaces = 2;
spinner1.TextAlign = 2;
spinner1.Increment = .05;
spinner1.Value = .05;
radio1.Checked = true;
checkbox1.Checked = false;
checkbox2.Checked = false;
combobox1.AddItem("Lighter");
combobox1.AddItem("Normal");
combobox1.AddItem("Darker");
combobox1.SelectedIndex = 1;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
120
EasyLanguage 对象自学课程(译)
接下来,我们将事件处理器与多个控件事件相关联,比如当它们被点击或一个控件值改变时。
这是创建窗体七个步骤的第五步。每个事件如何使用的更多信息将会在这个事件中我们检查
事件处理方法时提到。
button1.Click += OnButtonClick;
spinner1.ValueChanged += SpinnerClick;
radio1.Click += Resize_TrendLine;
radio2.Click += Resize_TrendLine;
radio3.Click += Resize_TrendLine;
CheckBox1.Click += Extend_TrendLine;
CheckBox2.Click += Extend_TrendLine;
ComboBox1.SelectedIndexChanged += ChangeColor;
一旦每个控件的属性(大小,位置,初始值,和事件)设定好后,它们就可以被添加进窗体
容器内了。在这个例子中,我们用一个调用面板的临时容器来聚合并持有大部分控件,然后
我们将面板加进下方的窗体窗口容器中。用一个二级容器(例如面板)聚合控件的优势在于,
我们可以轻松地在窗口内将整组控件作为一个整体进行移动,或者复制整个面板以及它其中
的控件并粘贴到另一个窗体中,而不必重新给每个控件排位置。一旦控件被添加到面板中,
一个单独的标签被添加到窗体的顶部,它后面跟着一整个面板容器。这是创建窗体七个步骤
中的第六步。
panel1.AddControl(button1);
panel1.AddControl(spinner1);
panel1.AddControl(label2);
panel1.AddControl(label3);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
121
EasyLanguage 对象自学课程(译)
panel1.AddControl(label4);
panel1.AddControl(label5);
panel1.AddControl(label6);
panel1.AddControl(radio1);
panel1.AddControl(radio2);
panel1.AddControl(radio3);
panel1.AddControl(checkbox1);
panel1.AddControl(checkbox2);
panel1.AddControl(combobox1);
form1.AddControl(label1);
form1.AddControl(panel1);
他窗口上方,而不用当窗体外一个区域被点击后跳到其他窗口后面。这完成了创建和显示一
个自定义窗体窗口的第七步。
form1.Location(100,200);
form1.TopMost = true;
form1.show();
最后,当图表开始计算,一对趋势线在图表左侧远端被创建,每根趋势线的 ID 也被保存。
上趋势线(阻力线)初始颜色被设为红色,下趋势线(支撑线)初始颜色被设为绿色。另外,
因为趋势线会被复位到图表最后一根图条,你会看见它们在这个初始位置。
TL_SetColor(TL_High,RGB(255,0,0));
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
122
EasyLanguage 对象自学课程(译)
TL_SetColor(TL_Low,RGB(0,0,255));
end;
接下来,我们开始创建处理每个窗体控件事件的方法。
第一个是回应点击标有“Reset All”的按钮的方法。这个方法中是一个语句,它发出一
个特殊类型的异常信息来使得图表重新加载、窗体控件被重置。
elsystem.EventArgs args )
begin
throw elsystem.RecalculateException.Create("");
end;
用 默 认 的 sender 和 args 参 数 , 为 窗 体 控 件 事 件 处 理 程 序 创 建 一 个 名 叫
Resize_Trendline 的 方 法 ( 与 前 一 个 方 法 一 样 ) 。 声 明 两 个 本 地 变 量 : 一 个 是
RadioButton 类型的对象变量,另一个是整数。
势线的样式。每个单选按钮控件决定趋势线的厚度样式,设置为“Thin”,“Medium”或
“Heavy”。
elsystem.EventArgs args )
begin
TLSize = 0;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
123
EasyLanguage 对象自学课程(译)
Switch (rButton.Text)
Begin
Case "Thin":
TLSize = 0;
Case "Medium":
TLSize = 2;
Case "Heavy":
TLSize = 4;
End;
TL_SetSize(TL_High,TLSize) ;
TL_SetSize(TL_Low,TLSize) ;
end;
中 的 ComboBox 项 目 的 序 数 值 并 将 上 、 下 趋 势 线 的 颜 色 设 定 为 合 适 的 RGB
(red-green-blue,红绿蓝)值。
elsystem.EventArgs args )
begin
Switch (combobox1.SelectedIndex)
Begin
Case 0:
TL_SetColor(TL_High,RGB(255,127,127));
TL_SetColor(TL_Low,RGB(127,127,255));
Case 1:
TL_SetColor(TL_High,RGB(255,0,0));
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
124
EasyLanguage 对象自学课程(译)
TL_SetColor(TL_Low,RGB(0,0,255));
Case 2:
TL_SetColor(TL_High,RGB(127,0,0));
TL_SetColor(TL_Low,RGB(0,0,127));
End;
end;
创建 Extend_Trendline 方法来处理复选框控件的选择并根据所选复选框所对应的状态
设置两条趋势线左右延伸值。
elsystem.EventArgs args )
begin
TL_SetExtLeft(TL_High,checkbox1.checked);
TL_SetExtLeft(TL_Low,checkbox1.checked);
TL_SetExtRight(TL_High,checkbox2.checked);
TL_SetExtRight(TL_Low,checkbox2.checked);
end;
创建 SpinnerClick 方法来处理数值增减(spinner1)控件的值的改变。这个数值通过
点击上/下微调箭头或在控件数字框内输入新值来改变。新值被传递到另一个更新趋势线的
方法。
elsystem.EventArgs args )
begin
Show_TrendLine(spinner1.value);
end;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
125
EasyLanguage 对象自学课程(译)
Show_TrendLine 方法用来在窗体上显示支撑位和阻力位,并根据 myNum 方法输入参数,
展的时候均为 10 根图条的宽度。
begin
end;
我们还想根据实时价格变化更新趋势线位置,所以我们添加一个语句在最后一根图条的每个
价格 tick 调用趋势线绘制方法。
验证指标。
在图表内插入指标。
附加练习部分
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
126
EasyLanguage 对象自学课程(译)
下面的部分包括附加例题。这些例题将早先介绍的组件和对象与你在继续探索
EasyLanguage 对象的潜能时会感到有用的项目进行了结合。
撤销委托
(收到)”委托单的集合。集合内第一个委托单是最近的未成交委托。在该委托的标识符后
加上 Cancel()方法将取消该委托。
OrdersProvider.Order[0].Cancel();
要取消同一交易代码的所有未成交委托,只要简单地循环交易代码的所有“received”委
托单并在每个委托标识符后使用 Cancel()方法。
要想撤掉-替换,你只需用上述方法撤销想撤的委托,然后在新价格发出另一个
OrderTicket。
限价单
属性编辑器来设置委托单参数,
将委托单的 Type 设为 Limit 以及一个特定的 LimitPrice。
OrderTicket1.Send();
OrderTicket1.Type= tsdata.trading.OrderType.Limit;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
127
EasyLanguage 对象自学课程(译)
OrderTicket1.Send();
◆附加例题 #21
创建一个简单的订单窗口,它可以提交并撤销一个限价单
撤销限价单
指标:“$21_LimitCancel”
许撤销待成交委托。
警告:这个指标将产生限价单,确保你没有登录实盘账户。本指标只应被应用于模拟账户。
工作区:$21_LimitCancel
建立图表窗口:
创建:5 分钟区间
插入指标:$21_LimitCancel
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
128
EasyLanguage 对象自学课程(译)
组件和属性编辑器设置:
OrderTicket1:
Action: buy
Type: limit
OrdersProvider:
Updated: OrdersProvider1_Updated
Analysis Technique:
Initialized: AnalysisTechnique_Initialized
指标练习#21: $21_LimitCancel
创建一个新指标,将它命名为“#21_LimitCancel”。
本例题结合之前用过的数个组件和对象。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
129
EasyLanguage 对象自学课程(译)
使用属性编辑器,按上述要求设置 OrderTicket1 的属性,包括输入初始委托数目 10000
和你的模拟账号。下面两行在你创建输入时被添加进代码中:
建之前访问窗体元素。
法。
为窗体和交易命名空间添加语句来减少必须打出空间全名的需要。
using elsystem.windows.forms;
using tsdata.trading;
为主窗体声明对象变量以及三个控件,包括一个文本框,一个标签,一个按钮。
在 AnalysisTechnique_Initialized 方法中,为一个窗体创建对象,窗体中包含设置
限价的控件和发单或撤单的按钮。一旦限价单被产生之后,“Send”(发单)按钮将被重
新标为“Cancel/Replace”(撤单/改单)。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
130
EasyLanguage 对象自学课程(译)
method void AnalysisTechnique_Initialized( elsystem.Object
sender,
elsystem.InitializedEventArgs args )
begin
form1.location(200,200);
form1.topmost = true;
OrderPx = TextBox.create("",50,20);
OrderPx.Location( 100,10 );
label1.Location(10,12);
button1.Location( 40,40 );
将按钮与事件处理方法相关联,给窗体添加控件,将初始文本框文本值设为当前 inside
bid,在窗体内显示图表。
button1.Click += OnButtonClick;
OrderPx.Text = NumtoStr(InsideBid,5);
form1.AddControl(OrderPx);
form1.AddControl(label1);
form1.AddControl(button1);
form1.show();
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
131
EasyLanguage 对象自学课程(译)
设为 true 后它就可以更新窗体。
OrdersProvider1.Load = true;
ReplotButton();
end;
添加 OrdersProvider1_Updated 方法。
tsdata.trading.OrderUpdatedEventArgs args )
begin
ReplotButton();
end;
一个委托单待成交,我们可以检查它是否被接收以及是否为限价委托。如果是,那么按钮文
(提交买入限价单)”。
begin
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
132
EasyLanguage 对象自学课程(译)
OrdersProvider1.Order[0].State = OrderState.received AND
OrdersProvider1.Order[0].Type = OrderType.limit
then begin
OrderPx.Text=
NumtoStr(OrdersProvider1.Order[0].LimitPrice,5);
end
else begin
end;
end;
委托单,并确保文本完全匹配。如果最近委托是活跃的限价单,一个按钮点击之后,撤单命
令被发送。如果没有活跃限价单,一个价格为在文本框内指定价格的买入限价单将被发送去
市场。
elsystem.EventArgs args )
begin
OrdersProvider1.Order[0].Type = OrderType.limit
then
OrdersProvider1.Order[0].Cancel();
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
133
EasyLanguage 对象自学课程(译)
orderticket1.SymbolType = Category;
orderticket1.LimitPrice = StrtoNum(OrderPx.Text);
orderticket1.Quantity = iQuantity1;
orderticket1.send();
end;
end;
end;
验证代码。
在图表内插入指标。
DateTime
一个 DateTime 对象代表时间上的一个瞬间,用一个日期和一天中的时间表示。值的范围
除了能够读取当前日期和时间,一系列属性和方法也被提供,这样你可以轻松地通过任何你
选择的方法设置并显示日期和时间。
// 根据字符串值设置日期和时间,用另一种格式显示
21:35
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
134
EasyLanguage 对象自学课程(译)
myDateTime = elsystem.datetime.Today // 获取当前日期,不带时间
TimeSpan
一个 TimeSpan 对象代表一个时间区间,这个时间区间用来测量日期/时间值之间的天数、
小时数、分钟数、秒数。你可以用一个时间段(time span)来保存两个日期和时间之间
的差值,或者你可以从一个已经存在的日期/时间加上(或减去)一段时间段来指定一个新
的日期/时间。
例如,
// 向当前日期加上5天
myTimeSpan.TotalDays = 5
// 计算当前时间和收盘前5分钟之间的时间差
myDateTime.Value = “3:55pm”
TokenList
TokenList 对象代表一个值的集合,
它可以通过一个包含逗号分隔的一列单词或数字创建,
性访问任何值。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
135
EasyLanguage 对象自学课程(译)
中加载值
◆附加例题 #22
目标:(AlarmClock)
根据用户提供的时间(或日期和时间)创建一对闹钟
指标:$22_AlarmClock
的时间差值。它设定一个在目标时间到后调用事件方法的倒数计时器。
工作区:$22_AlarmClock
建立窗口:
创建:图表或雷达屏
插入指标:$22_AlarmClock
组件和属性编辑器设置:
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
136
EasyLanguage 对象自学课程(译)
Timer1:
Elapsed: Timer1_Elapsed
Timer2:
Elapsed: Timer2_Elapsed
AnalysisTechnique:
Initialized: AnalysisTechnique_Initialized
创建一个新指标并命名为:#22_AlarmClock。
为两个目标时间创建输入。目标时间可以包括一个可选填的日期,例如“8/22/2012
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
137
EasyLanguage 对象自学课程(译)
。第一个目标应该是较早的时间(或日期)
9:25am” ,因为第二个目标时间只会在第一个目
标时间到期后被评估。默认情况下,目标时间被设在常规开盘和收盘时间前的五分钟。
声明对象变量来保存目标时间,到目标时间的初始时间差,以及闹钟时间的列表。尽管本例
题只用两个闹钟,你可以轻松地向列表对象中添加其他时间。
elsystem.TimeSpan myTimeSpan(null),
tsdata.common.TokenList myAlarmList(null),
为闹钟时间到后播放的声音文件名以及闹钟列表中活跃闹钟的序数声明两个额外变量。
string AlarmSound("alarmclockbeep.wav"),
标时间作为列表的初始值。使用加等运算符将第二个目标时间附加到闹钟列表中。注意:如
果你选择添加额外时间,就在此处进行添加。
begin
myAlarmList = tsdata.common.TokenList.create(TargetTime1);
myAlarmList += TargetTime2;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
138
EasyLanguage 对象自学课程(译)
myAlarmTime = GetAlarmTime(myAlarmList);
myTimeSpan = GetAlarmSpan(myAlarmTime);
SetAlarm(myTimeSpan);
end;
日志中打印出闹钟时间,播放输入中指定的声音文件,并设置下一个闹钟时间段。
elsystem.TimerElapsedEventArgs args )
begin
elsystem.datetime.currenttime.tostring());
condition1 = playsound(AlarmSound);
myAlarmTime = GetAlarmTime(myAlarmList);
myTimeSpan = GetAlarmSpan(myAlarmTime);
SetAlarm(myTimeSpan);
end;
Timer2_Elapsed 方法每一秒执行一次。它获取下一个闹钟目标的时间段并建立一个含有
剩余天数、小时数、分钟数、秒数的字符串,或一条表示所有闹钟均过期的信息。
elsystem.TimerElapsedEventArgs args)
begin
TS = GetAlarmSpan(myAlarmTime);
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
139
EasyLanguage 对象自学课程(译)
Else
第一幅绘图显示剩余时间。
plot1(TimeLeft,"Count Down");
第二幅绘图显示实际目标时间以及目标数 T。
If myAlarmTime.ELDateTimeEx>=1 then
+ myAlarmIndex.tostring()),"Target")
else
plot2(myAlarmTime.format("%H:%M T"
+ myAlarmIndex.tostring()),"Target");
end;
begin
Timer1.Interval = myTimeSpan.TotalMilliseconds;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
140
EasyLanguage 对象自学课程(译)
If Timer1.Interval < 1000 then
Timer1.Enable = false
Else
Timer1.Enable = true;
end;
GetAlarmTime 方法返回一个代表下一个闹钟目标时间的对象。第一个语句创建一个名为
myAlarmList)
begin
myAlarmTime = elsystem.DateTime.Create();
myAlarmTime =
elsystem.datetime.Parse(myAlarmList[myAlarmIndex]);
调用 GetAlarmSpan 会获取剩余时间并且如果时间段是一个正数将返回闹钟时间。如果找
不到正值时间段,返回一个空白闹钟时间。
myTimeSpan = GetAlarmSpan(myAlarmTime);
myAlarmIndex = myAlarmIndex + 1;
Return myAlarmTime;
end;
end;
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
141
EasyLanguage 对象自学课程(译)
return myAlarmTime;
end;
时间段将被用完整的日期和时间的方式计算。如果只有时间部分,时间段从当前时间开始计
算。
myAlarmTime)
begin
myTimeSpan = elsystem.TimeSpan.Create();
Return myTimeSpan;
end;
验证指标。
在图表或雷达屏中插入指标。使用输入值改变闹钟时间。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
142
EasyLanguage 对象自学课程(译)
分析技术 - Unitialized 事件
方法,该方法包含在分析技术计算结束前执行的代码。
AnalysisTechnique_Uninitialized 事件处理方法可以被用来在分析技术关闭前保
存数据,或执行任何可能被要求运行的清理代码。这在分析技术被更新后,被从分析窗口内
移除后,或在窗口、工作区、桌面被关闭后均可能发生。但是,如果出现异常错误,有时候
uninitialized 事件处理方法不会被调用。
Try-Catch
块中处理任何失败、错误或异常。
例如,当从一个组件中访问数据时你可能会想测试一个预料中的错误条件。如果特定条件发
try
Value1 = FQ1.Quote[FundamentalField].DoubleValue[0] ;
OkToCalculate = true ;
OkToCalculate = false ;
end ;
或者,你可能会想通过测试文件读取语句的成功与否并在文件不存在时创建一个来判断文件
是否存在。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
143
EasyLanguage 对象自学课程(译)
try
doc.Load(“c:filename”); // 尝试读取一个文件
catch(elsystem.io.filenotfoundexception ex)
doc.Save(“c:filename”); // 如果没找到,创建文件
end;
XML 对象
XML 的基本建立码块是元素,它由放置在一对标签中间的数据组成。开始标签由一对包含元
素名的尖括号组成,例如<symbol>,结束标签也一样,不过需要在元素名前加上额外的斜
杠,例如</symbol>。
一个 XML 数据结构有多个元素组成,每个元素都代表数据,这些数据可以是单个一条信息,
对象来创建元素,在数据结构中添加或删减元素,并且在元素内读取或写入数据。
的 symbol 元素的根(root)元素组成。
<root>
<symbol>
<name>MSFT</name>
<date>9/10/2011</date>
<price>34.56</price>
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
144
EasyLanguage 对象自学课程(译)
</symbol>
<root>
另外,一个开始标签可以包含位于尖括号内的额外信息,这被称为属性。例如,下面的代码
<root>
</root>
◆附加练习 #23
目标:(XMLPersist 指标)
指标:$23_XMLPersist
该指标在一个指标退出或刷新(uninitialized)并在指标重新开始(Initialized)
你留存那些当前指标中含有的并且下次运行时你希望能够记住的交易代码值。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
145
EasyLanguage 对象自学课程(译)
工作区:$23_XMLPersist
建立窗口:
创建:30 分钟区间
插入指标:$23_XMLPersist
组件和属性编辑器设置:
无组件
AnalysisTechnique
Initialized: AnalysisTechnique_Initialized
Uninitialized: AnalysisTechnique_UnInitialized
使用说明:
当你第一次将指标应用到一个新的图表或代码上时,指标的状态行将只会显示代码名,没有
显示在子图的状态行交易代码名后面了。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
146
EasyLanguage 对象自学课程(译)
指标练习#23:$23_XMLPersist
创建一个新指标并命名:#23_XMLPersist。
using elsystem.xml;
XmlElement root(null),
XmlElement eLevel1(null),
XmlElement eLevel2(null),
XmlNode nNode(null);
为 XML 文件名声明一个输入值。
析技术时被调用。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
147
EasyLanguage 对象自学课程(译)
sender,
elsystem.InitializedEventArgs args )
begin
filefound = true;
try
doc.Load(xmlFileName);
catch(elsystem.io.filenotfoundexception ex)
filefound = false;
end;
文件中。
Begin
root = doc.CreateElement("data");
doc.AppendChild(root);
doc.Save(xmlFileName);
End
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
148
EasyLanguage 对象自学课程(译)
Else
Begin
root = doc.DocumentElement;
end;
FindSymbol 方法返回包含当前交易代码数据的节点。如果交易代码之前没有被用过或者
文件刚刚被创建,数据为空。
nNode = FindSymbol();
end;
刷新时,AnalysisTechnique_UnInitialized 方法被执行。在这个方法中添加一个
SaveSymbol()的调用。
begin
SaveSymbol();
end;
中是当前的日期/时间以及收盘价。
begin
nNode.Item["date"].InnerText =
elsystem.datetime.now.Format("%m-%d-%Y %H:%M");
nNode.Item["price"].InnerText = Close.tostring();
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
149
EasyLanguage 对象自学课程(译)
doc.Save(xmlFileName);
end;
FindSymbol 方法被用于寻找保存代码的数据,或为新代码创建空白数据,并为要求的数
存包含方法返回的代码数据的节点。
begin
tList = root.GetElementsByTagName("symbol");
sNumb = -1;
If tList.ItemOf[iIndex].Item["name"].innertext=symbol then
sNumb = iIndex;
end;
如果交易代码没有在列表中找到,一个名字、日期和价格附加为二级子元素的新的 symbol
eLevel1 = doc.CreateElement("symbol");
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
150
EasyLanguage 对象自学课程(译)
eLevel2 = doc.CreateElement("name");
eLevel2.innertext = symbol;
eLevel1.AppendChild(eLevel2);
eLevel2 = doc.CreateElement("date");
eLevel1.AppendChild(eLevel2);
eLevel2 = doc.CreateElement("price");
eLevel1.AppendChild(eLevel2);
root.AppendChild(eLevel1);
doc.Save(xmlFileName);
新创建的代码元素结构被赋值给本地方法对象 tnode,或者如果代码之前就存在,tnode
被设置为标有序数的代码元素。方法的返回值被设给节点。
tNode = eLevel1;
end
Else begin
tNode = tList.ItemOf[sNumb];
End;
Return tNode;
end;
最后,创建一个绘制当前节点值的方法。对已经存在或已经刷新的交易代码来说,日期和价
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
151
EasyLanguage 对象自学课程(译)
的唯一语句。
begin
plot1(nNode.Item["name"].Innertext,”Symbol”);
plot2(nNode.Item["date"].InnerText,”Saved Date”);
plot3(nNode.Item["price"].InnerText,”Saved Price”);
end;
PlotValues();
验证指标。
国信证券交易服务团队翻译 联系邮箱:tradestation@guosen.com.cn
152