首页 Wealth-Lab中文快速教程

Wealth-Lab中文快速教程

举报
开通vip

Wealth-Lab中文快速教程本文转自他人博客文章。 网上有关Wealth-lab的资源好少,搜到一个台湾的网站有教程,可惜打不开链接。费了好大的劲终于搞到了,准备陆续贴出来学习,简单地将繁体字转换成了简体字,部分内容并没有调试过,以后有时间再试。 第一章 本来计划Wealth-Lab的介绍就跟介绍TradeStation 2000i一样,直接切入函式到交易系统写作说明便得。后来发现到这样子是有点对大家会过意不去,而且如果这样玩会把大家对Wealth-Lab的学习兴趣浇熄了;因为Wealth-Lab的WealthScript虽然与T.S的...

Wealth-Lab中文快速教程
本文转自他人博客文章。 网上有关Wealth-lab的资源好少,搜到一个台湾的网站有教程,可惜打不开链接。费了好大的劲终于搞到了,准备陆续贴出来学习,简单地将繁体字转换成了简体字,部分内容并没有调试过,以后有时间再试。 第一章 本来计划Wealth-Lab的介绍就跟介绍TradeStation 2000i一样,直接切入函式到交易系统写作说明便得。后来发现到这样子是有点对大家会过意不去,而且如果这样玩会把大家对Wealth-Lab的学习兴趣浇熄了;因为Wealth-Lab的WealthScript虽然与T.S的EasyLanguage乃系出同门皆源自Pascal程序语言的语法,但是WealthScript的语法严谨度实在比EasyLangage高太多了!这时不得不承认EasyLanguage实在无愧于EASY之称。所以思考再三决定还是要花些时间跟大家谈一些枯燥的基本程序设计概念,不然没有这些概念的朋友会鸭子听雷的搞不清楚往后东西,所以抱歉啦!我跟大家都没法偷懒乖乖一步一步来。 其二、数据库取得一向是许多人学习这类软件的障碍;我是自己长期定购路透社的DataLink,因为他是MetaStock的格式适用于世界上绝大多数的软件。所以最好你也想方设法的投资一个好的数据库;当然我知道大多数的人喜欢FREE这个字眼,我只能说天下没有白吃的午餐。不过我这次也想花些篇幅介绍这些免费自助餐,好人做到底了! 所以在介绍Wealth-Lab的程序设计前我们会先介绍上面说的东西,给大家先准备好材料再导入正题。先从解决历史资料部份开始吧! 「DataSources」是Wealth-Lab的分析数据来源设定。你可以在上方的目录选单(菜单)上找到,「DataSources > New DataSource」开启一个设计汇入新数据来源的功能,或「DataSources > DataSource Manager」进入数据库的整合管理功能;当然这里也可以点选右下方的「Create a New DataSource」来建立新数据源。建立新数据源你会看到这样的画面: 如果这个功能可以顺利使用,那对追踪多种商品或股票的朋友就方便多了。因为每天的数据可以让Wealth-Lab自己帮你去Yahoo网站更新。这些下载的档案被Wealth-Lab另存成属性为「WL」的二进制档案,它有点像我们台湾「齐柏林」使用的格式,前导4个实数字元记录数据笔数,之后是每一个记录文件(28位一个记录长度)6笔数据的随机文件格式。如果自己有能力写转文件程序的人,这个详细个格式你可以在公司网页找到,我们在此不再做深入介绍。 我就是直接选择第四项设定「MetaStock Files」便可!可是还是对Yahoo资料心有不甘,不然一堆人怎么玩呢?于是我脑筋就动到第三项的「ASCII Files」文字文件上头来! 首先、我们先到Yahoo上面找个数据范例来说明如何汇入。把你的IE打开连到 http://finance.yahoo.com/ ,在代码输入的格子里打入「^TWII」这是我们台湾加权指数的代号。然后按「Enter」或是点选那个「GET QUOTES」。 然后进入看到台湾加权指数报价页后点选左边选单的「Historical Prices」。 进入历史数据页面后 设定数据起始日期范围(SET DATE RANGE)页面如上,你可以调整起始日(Start Data)或直接接受Yahoo内定的日期,如果更改了这些格子里头的数据别忘了按下「Get Prices」更新。然后我们看到下方 点选「Download to Spreadsheet」我们选择另存档案为「twii.csv」 改个名称是为了方便我们未来多笔数据时好管理,不然阿猫阿狗都一律称它为「table.csv」吗?看到上图的存档类型说明吗?我们下载的是用「,」分隔可直接汇入OFFICE Excel的文字文件,内容看起来会是像这样的东西: 第一行一般就是给Excel读做标示项目用的,第2行之后就是每日的数据。这里的每一个项目区隔辨识就是使用逗号「,」。好!我们把数据顺利的抓下来了,下一章我们就接着谈如何用「ASCII Files」功能汇入到Wealth-Lab里显示图形 第二章 本来一直想要如何用不同的方式来介绍这一章,看来还是乖乖的按照HELP档案介绍的顺序来用。这里有许多你如果曾使用过EasyLanguage的人会觉得很熟悉,但是我在意的是跟那些不同的部份,因为Wealth-Lab的WealthScript是比EasyLanguage文法严谨许多,更趋近标准的Pascal语言与法。如果你要顺利的进入Wealth-Lab的世界遨游,请花点耐心枯燥也请坚持读完这篇WealthScript Language 文法介绍。 当你完成数据库建立之后并开启一个价格图形(ChartScripts)之后,你会看到在图形标签(Chart)之后有许多其它功能的标签。点选一下中间的编辑器标签(Editor)你会看到一些系统帮你设定好的样板,这个地方就是我们设计指针与交易系统的地方。 我尝试用口语来叙述这15行,当然你现在或许不懂但未来我们会搞懂一切的,所以不要紧张! var Bar: integer; 宣告使用变量Bar,变数Bar为整数 for Bar := 20 to BarCount – 1 do for循环范围为指定数据自第20笔到最后 begin 开始for循环 if not LastPositionActive then 如果没有未平仓的仓位则 { Entry Rules } 批注不执行:输入进场规则 Begin 开始if条件成立 End 结束if条件成立 Else 如果不符合if条件 { Exit Rules } 批注不执行:输入出场平仓的规则 Begin 开始else条件 end; 结束else条件 end; 结束for循环工作 【Comments】程序批注 这是为了增加我们程序的可读性,所以我们在重要的地方留下批注。这些提示的批注文字并不会在程序中被执行。在WealthScript中有两种方式来表现批注文字;一种为使用大括符{}包含的长文字方块(Blocks)。另一种使用双斜线//表示的单行文字(Single Line)批注。上面样板范例{Entry Rules}批注虽然使用大括符,但因为只使用一行所以也可以写成: // Entry Rules 【Statements and Delimiters】叙述的段落定义 每一个独立的程序叙述我们在叙述最终使用分号「;」来做结尾,区分不同的叙述。这些我们应该都已经蛮熟悉的不是吗? 【Variables and Data Types】变量与数据形态 这是我所谓伤脑筋要如何介绍好的部份啦!我们在设计的过程会设定许多变量来方便我们的运算或临时的数据存取。在EasyLanguage中我们只须在Vars宣告之后天马行空的命些怪名就算交代完毕了,更好的是宣告之后的变量简直就如多拉A梦的万能口袋啥东西都可以装下,可以是01的是非逻辑(Boolean)也可以是不带小数点的整数(Integer),也可以是有小数点的浮点数(Float),更鲜的是非数字的字符串(String)也可以吞得下!各位、使用Wealth-Lab就是告诉你好日子结束了!不过在标准的程序设计环境它就是这样的。 在计算机世界的数值运算比较像我们现在学校推广的「建构式数学」。正负号与浮点小数都在运算过程被先分离处理,所以早期如286的时代如果有科学运算的需求并希望运算效率得以提升;便需要再花个台币万把块加装一颗编号287的浮点运算处理器。你想56/7要分成8次减法运算跟287可以一次运算,就快了8个时间;而一个程序下来要来几万甚至几百万次这样的运算,时间差别有多大?另外、变量必须被指定还关系到内存长度的分配;像EasyLanguage多拉A梦式的分配记忆空间是非常浪费的,每使用一个变量都是开启一个「很大」的记忆空间,就好像不管你是团体还是单独背包客都配发给你一百坪大的客房。虽然我们现在内存动不动就几G起跳,但是这样的使用内存仍然对程序执行会产生严重的负担。 在正式的程序设计里我们必须在使用变量前经过宣告,宣告除告诉计算机我们要使用的变量名称外并告诉计算机我们的变量类别(Data Types)。未来我们使用该变量便要小心万不可逾越了我们宣告的类别范围。我们先来了解WealthScript Language给我们的变量分类。 Integer「整数」、基本上就是没有小数点的数字(当然含正负数)。它的范围可以落在-2,147,483,648 到 2,147,483,647内。WealthScript对类别制定也还未到真正程序语言的复杂与多数,所以你可以简单的记住:「只用到整数就宣告integer,会用到小数的场合就宣告float」。因为在一般程序语言里整数还可分成短与长的整数与字符,小数也可分单精度与双精度;这些WealthScript都减化了感谢它!样板第一行就是: var Bar : integer; 就是我们宣告一个整数的变量名称为「Bar」。这个变量未来是使用在for循环当中,它代表暂时存放我们数据的编号。这里我们应该很容易想到不会碰到有小数的场合,所以我们只要宣告成整数便可。 Float「浮点小数」、基本上就是含小数点的数字。它的范围落在1.5 x 10-45 到3.4 x 1038;一些我们的每日数据(开高低收)在Wealth-Lab里都是以float方式储存,因为股价或期货价格都有可能包含小数点的数据。 String「文字符串」、宣告变量将使用在文字使用上。WealthScript并没有限制你文字长度,文字变量内容也可以做运算,但是跟数字运算的意义是不同的。比如说宣告整数的两数相加会是: var A, B, C : integer; A := 1234; B := 5678; C := A + B; C等于A加B答案会是「6912」。但是如果是宣告成字符串会成、、 var A, B, C : strring A := ‘1234’; B := ’5678’; C := A + B; C等于A字符串加B字符串答案会成’12345678’的字符串,了解不同的地方啰? Boolean「布尔值逻辑运算」、宣告的变量只能放置或显示真(True)或伪(False);可以使用AND、OR、XOR与NOT的运算得到结果。样板里的if not LastPositionActive then 这行就是NOT运算,NOT是一种「否定」的运算。函式LastPositionActive的结果当有未平仓部位时为「真」True,但是我们要的是空手的状况,所以是在「非有未平仓」。 Variant「泛用特殊变量」、没错这就是多拉A梦的万能口袋,什么类别数据都可以装进去。你如果不确定或粉懒的那种人尽管使用吧!不过如果你的程序写的够大,那时执行速度变慢时你就知道付出的代价是什么了。 另外还有两种数据类别Record Types「记录类别」与Enumerated Types「列举类别」,是比较少用目前还是不要多增加你的大脑负担吧!如果未来有碰到运用上的程序代码再做介绍。 【Assignment Statements】数值设定叙述 第一在WealthScript中对变量的大小写是一视同仁的,就是说采不区分;所以abc变量与ABC对WealthScript是指同一个东西。我们设定变量后、一些场合我们须要自己先设定内容给变量,一般我们使用等号「=」来设定变量内容,在WealthScript文法使用Pascal用法,必须在等号前多加一个冒号「:=」来代表「取代、置入」的功能。等号功能在Pascal用法比较偏向「比较」的功能,如比较两变量内容是否相同时才会使用等号,如: if TodayHi = TodayLo then 。在程序置入变量内容时我们这样写: abc := 1234 或字符串变量 def := ‘Buy at Market’。 【Constants】常数设定与系统预设常数 变量的相反就是常数。变量在程序执行过程因结果将会经常改变其内容,但常数在宣告的那一刻起到程序中止,其内容都不会与不能被更动。比方说你的程序计算过程要常使用圆周率计算,为求高精度你可能引用3.141592653589793238462643383279来运算,天呀!引用个几次你不会有「花轰」的感觉吗?这时常数宣告就派上用场啦!你可以这么做: const PI = 3.141592653589793238462643383279 之后、你在程序的任何地方都可以使用「PI」来代表那串缠脚布般的数字。 WealthScript在系统也预设了许多常数来方便我们使用。这些系统预设常数通常都以井号「#」开头,之后接上可读性高的名称;介绍如下: Price Series constants「价格序列常数」 #Open, #High, #Low, #Close, #Volume, #OpenInterest, #Average, #AverageC。其中#Average是「(High + Low) / 2」,而#AverageC则是「(High + Low + Close) / 3」。 Color value constants「色彩代表数值常数」 #Black, #Maroon, #Green, #Olive, #Navy, #Purple, #Teal, #Gray, #Silver, #Red, #Lime, #Yellow, #Blue, #Fuchsia, #Aqua, #White。使用于背景的#RedBkg, #BlueBkg, #GreenBkg。这些都是使用来显示指针或交易讯号时的颜色。 Plot formatting constants「作图线条数值常数」 #Thin, #Dotted, #Thick, #Histogram, #ThickHist, #Dots。这些决定指标线条的表现方式,粗细或线条与柱状。还有价格图上的表现方式如K线或BarChart;#OHLC, #Candle, #Line。 Time Frame constants「数据显示时间常数」 #Daily, #Weekly, #Monthly。 Day of the Week constants「周交易日常数」 #Monday, #Tuesday, #Wednesday, #Thursday, #Friday。 以上仅列举常会遇到或使用的系统预设常数。今天先谈到这里吧! 第三章 我们上了一些基本课程后,来一趟探险之旅吧!我一直相信「玩」是最快的学习方法,不然你就算背了上一章你都不知道为什么背它;可是、当你再看完这一章后,我相信你不须要背就知道上一章谈的东西怎么运用了。 到今天未接续往下讨论之前,我们已经知道了两件事;一是如何利用Yahoo建立我们自己的金融商品数据库,二是我们已经可以在Wealth-Lab上头显示我们所须要的价格图,以K线或柱状图。现在我们来看看我们还能深入去做些什么?我们的图是否有点单调呢?对啦我们是应该显示个指针来玩玩。     首先我们点选左手边的分类功能选单,选取「Indicators」如图示A。我们会看到一个以字母顺序排列的指针列表,下拉到RSI的位置并点选如图标B。这时你有两个选择;一是点选上方的「Plot」图像如图标C,或者你用拉放的功能把RSI直接拉到你的图上。图标D是显示程序代码呆会我们会介绍。     我们会发现跳出了像上头的对话窗口。「Drawing Style」作图的风格;设定包括要用啥线条环肥燕瘦任君挑选,颜色及你要把RSI安置在那一个框框里(Pane);目前有三个可以让你选,你可以拉下选单看到Price Pane价格图框、Volume Pane成交量图框与新生成的RSIPane。 接下来「Parameters」指标参数设定。你一拉下选单就会发现上一章的「价格序列常数」几乎都在里头,如果没有特殊需求的话我们还是选择「#Close」收盘价来运算。最后一个设定天数,我习惯用9天然后没问题的话点「OK」吧!如果你的Wealth-Lab罢工不显示或跑出一些鸟意见的话,按一下键盘的「F5」或你代号旁边的绿色「GO」键,如下图示A。 看到我们要的RSI了吗?它跑到最上方显示,有些人比较习惯看它在下方对吧?怎么办呢?继续谈下去!我们点进去程序编辑器「Editor」,目前看到的仍是我们上一章所看到的那几行交易程序代码的样板。Wealth-Lab事实上是把这些程序代码隐藏起来的,为了阅读或设计时可以画面简洁点吧?我们可以使用第一张图标的D功能,点选它!   这个询问窗口会提示你将把指标程序代码弄到编辑器,之后你不能再以鼠标对此做控制,没问题就YES吧!随后你便可以在编辑器里看到RSI指针的程序代码显示出来了。   第16行到第20行便是我们显示RSI的部份,第一次我便逐行来讨论它。 var RSIPane: integer; 设定整数形态变量名为RSIPane。这是为了接收图框系统分配的控制代码所以它是整数。 RSIPane := CreatePane( 75, true, true ); 我们呼叫CreatPane函式(Function)这是由字面便知是建立图框的功能函式,查表我们得到: CreatePane( Height, AbovePrices, ShowGrid ): integer; 读成: 函式CreatePane代入参数(设定图高,位于价格图之上,显示价位标线)回传值整数。 这下子忽然间有好多东西可以玩了!我们先把这行的AbovePrices从true给它改成「false」如:RSIPane := CreatePane( 75, false, true ); 然后我们再按一次键盘「F5」或那颗绿色「GO」,现在再看一次「Chart」有啥不同?   呵呵!我们的RSI乖乖的滚到最下面来啰!RSI部份还有许多好玩的,不过其它的等我们介绍完其它行程序再来玩吧。 var RSI1: integer; 设定整数变量RSI1,用来接收以下函式的回传值。 RSI1 := RSISeries( #Close,9 ); 呼叫函式RSISeries来计算RSI。查表: RSISeries( Series: integer; Period: integer ): integer; 注意这个函式丢回来的是一个句柄不是我们想的RSI数据,所以接收的是整数变量(integer)而非浮点小数(float)。计算RSI数据Wealth-Lab提供的是函式RSI( Bar: integer; Series: integer; Period: integer ): float; 传回值便需要用float变量接收。在此RSISeries我们代入的就是我们先前设定的#Close收盘价与天数9。你也可以把这两数改变直接得到不同的RSI数据;改变后别忘了还是要按一下GO。 PlotSeriesLabel( RSI1, RSIPane, 009, #Thin, ‘RSI1=RSI(#Close,9)’ ); 最后这个函式是显示上图标示的所谓「标签」功能。查表: PlotSeriesLabel(Series: integer; Pane: integer; Color: integer; Style: integer; Label: string ); 虽然我们习惯通称为函式,其实这是一个「程序」而非「函式」。差别就在于它没有回传值。 这4行都没问题吧?我们再回头来玩我们的RSI,把它改良的更合乎我们的习惯用法。我们把程序改成了: RSIPane := CreatePane( 100, false, false ); 我们把框框设成100,然后图设定在价格图下并且不使用内设价格标示。 SetPaneMinMax( RSIPane, 0, 100 ); 设定框框上下限为0到100。 DrawHorzLine( 20, RSIPane, #Red, #Dotted ); 使用红色点状虚线在价位20画水平线。 DrawHorzLine( 80, RSIPane, #Red, #Dotted ); 使用红色点状虚线在价位80画水平线。 DrawHorzLine( 50, RSIPane, #Gray, #Dotted ); 使用灰色点状虚线在价位50画水平线。     点一下GO你应该会看到我们希望的RSI,今天就先玩到此吧!     第四章 字号:大 中 小 上回我们把RSI指标调整到我们希望的样子,那、、要是像KD指针要怎么显示呢?简单呀!找到KD把它拉过来便是啰。KD的正式名称叫「随机指标」Stochastic,可是并没有这项呀!我们只能看到「StocK」与「StocD」。看来在指标区里的东西比较像是乐高积木而不像完成品,我们只好堆积木啦。我们先把StocK(%K)抓过来:         没问题按OK,我们会先看到%K被显示出来了。 过来我们再拉放StocD(%D)过来。         没忘了把颜色设成不同,以免混淆。还有就是这个范例我要强调的部份;我们是要把它放在同一个图框位置(Pane)这样我们才可以一起显示KD两条线。         了解啦?这就是显示双线指针的方法。最后我们像RSI一样把KD加料一下,让它变得合乎我们的阅读习惯。         修改完按「GO」或「F5」我们的KD就算完成了。这样的加呀加进来的方式,同样的我们可以运用在DMI指标上头;把DIPlus(+DI)、DIMinus(-DI)与ADX三个指标加在一起便可以,自己试看看吧!接下来我们来玩一些不这么简单的东东如MACD、、 我们在指标区里可以找到两个跟MACD有关的指标,一个就称MACD另一个叫MACDex。如果你试了就知道它们的差别在一个没有参数可以设定(MACD),另一个是看得到两个可供参数设定的空格(MACDex)。没错!因为我们习惯在MACD上头使用12、26两个天数参数,所以WealthScript提供一组免设定的函式。如果你要使用其它天数参数建议使用MACDex函式。 开始来尝试显示MACD指针吧!在指标区拉放「MACD」,如果没问题我们会看到一条MACD被显示出来。过来我们要显示MACD信号线(MACD Signal)。可是问题又来!我们又找不到这个指标函式,怎么办?没怎么办,自己写呀! 请看第5行,这是我们计算MACD信号线的方式。WealthScript的MACDSeries函式只是计算到ema12 – ema26的地步。如果要信号线我们便要将MACD再使用EMA(平滑系数)计算9天均值。WealthScript提供EMASeries函式来方便我们计算。查表得知: EMASeries( Series: integer; Period: integer ): integer; 我们可以写成 MACDSignal := EMASeries(MACDSeries(#Close),9); 或 MACDSignal := EMASeries(MACD1,9); 都可以成立。 接下来重点来啦!我们要把这两条线的数据相减得到MACD里的那个柱状图(MACD – MACD Signal)。嗯那就是直接抓MACD1来减MACDSignal?错!!!在WealthScript系列性数据(Series)是不能让你这样玩的!它有专属的四则运算专用函式,查表分别是: AddSeries( Series1: integer; Series2: integer ): integer; 加法 SubtractSeries( Series1: integer; Series2: integer ): integer; 减法 MultiplySeries( Series1: integer; Series2: integer ): integer; 乘法 DivideSeries( Series1: integer; Series2: integer ): integer; 除法 注意这四个函式专用于系列变量对系列变量运算。比如你想把所有的收盘价都乘以10那就不能用这些函式,你可以查表找一些后面加上Value的函式如: MultiplySeriesValue( Series: integer; Value: float ): integer; 这个函式就是系列变量对一般数值的运算。所以我们的第6行呼叫了系列数减法函式来得到我们要的MACD – MACD Signal系列数值。其它几行各位应该不会再有问题吧?没问题就按「GO」验收成果啰! 最后、我们再来画蛇添足一下!如果我们的RSI想再上一条RSI的平均线呢?那简单看吧! 这里就只有第9行有点生吧?不过它其实我们在MACD有用过它的亲戚,就是EMA现在用的是简单算数的平均数SMA罢了。然后我们使用绿色的点状线来显示这条RSI平均线。         下回见! 第五章 几篇文章下来,我想大家已经对这个积木玩的不亦乐乎了。不过总觉得虽然吃了斯斯还是有些地方感觉痒痒的,因为这些积木都是Wealth-Lab提供的基本款,如果自己也能做些想要的积木形状岂不痛快哉?今天、我们就动手自己来做做看吧! 无论是使用T.S 2000i的EasyLanguage或是Wealth-Lab 的WealthScript,我们撰写指标都是从最基本的函式(Function)开始的;而每一个函式都只能回应(Return)单一数据结果。就如KD就要两个函式完成,一个完成%K的计算而另一个完成%D的计算;没有例外! 其次,Wealth-Lab开发环境提供许多精灵(Wizard)协助我们完成许多工作,其实这方面是比T.S 2000i的开发环境强很多的,如果你能细心去体会的话。这些精灵包括许多现成的样板支持减少程序书写的共享部份,与聪明的提供实时程序参考支持让你几乎可以不用伤脑筋翻书就可以完成程序开发。我想起前一阵子台湾引进在世界市场占有率很高的TomTom导航系统时,这个在世界享高知名度的软件被台湾使用者批评的一无是处;终其原因是因为台湾使用者长时间习惯了本地的PaPaGo系统「积习难改」罢了!对我而言;我是一个从SuperChart时代就玩起的人,到末代的T.S 2000i你说我们对Omega谁的感情深?我并不建议交易工作的工具选择上也跟追求新指标一样,终究滚动的石头不生青苔。但是如果你想选择Wealth-Lab使用的人或想了解的人,开阔的心胸是非常重要的。 今天我们又要向Wealth-Lab的核心向前挺进一步!我们要写自己的指标!目标就是把我们自己的指标完成并列在左边的指标选用区里头。我们就拿KD来做范例吧;因为我还是习惯用那个单一参数的KD指标。首先我们就是呼叫上头说的精灵来帮我们完成!     从主选单File>New Indicator Wizard 或按键盘「Ctrl+I」效果相同,我们就会把精灵唤醒听到他说「主人你要那一期的大乐透号码」?然后你会看到下面的对话框出现:     新建立指标对话框(New Indicator),空白部份填入我们的指标名称。我们这次要建立的是KD指标,所以一共有两条线必须被显示出来。先完成我们的%K或称快线的部份,命名为「StochFast」(StochK已经被Wealth-Lab用走啦),完毕按下「OK」!     再来、这是设定指标参数的对话框(Indicator Parameters)。我们在第一格里有两个选项「Series与Period」,比如我们今天设计的是RSI,就可能先要设定Series使用#Close。但是今天我们只要天数参数来计算,所以我们选择「Period」。在数据形态(DataType)上选择整数。没问题按下增加参数图示「+ Add Parameter」     你会发现刚才设定的参数跑到下方的框框去啰!代表这个参数已经被记录了。如果你需要一个以上的参数就重复上一个步骤,如果设定有错误的话简单,你就点选那个要除之而后快的参数再按一下「× Delete Parameter」。没问题一样按OK到下一步。     这就是精灵丢出来的样板!基本上来说如果你没需要做太复杂的计算,只要在绿色的{ Calculate your indicator value here }下方直接打入你要的表达式,然后改value := 计算结果;这样就可以完成一个指标了,够简单了吧?如果现在我说这节下课的话你有没有想要杀我的冲动? 当然你不会就这样放我走,我也不会让你这样轻松下课!还没让你头昏脑涨的话你别想溜!现在我们来解说这个样板吧!首先我们看到一个奇怪的东东,为什么精灵一次给我们两个函式呢? function StochFastSeries( Period: Integer ): integer; function StochFast( Bar: integer; Period: Integer ): float; 虽然我们是在建立一个新指标,但其实我们真正做的还是建立函式,所以我们看到了Function。跟EasyLanguage一样函式是系统之基础,建立函式而非直接建立提供显示的指针,方便我们在其它地方如交易系统上也可以顺利呼叫使用。在WealthScript中我们一次建立两个同性质的函式为了方便在不同场合或需求使用。这两个函式在名称的差别在一个多了系列(Series),这是包裹计算一次计算完我们的KD快线然后丢到另一个系列变量储存。而另外一个则是方便我们计算个别数据,你可以给它指定的那一天(Bar)与计算天数(Period)然后它会给你那天的KD快线数据(Return float)。大多数情况我们几乎不必理会下方的函式,很少有机会动到它,不过我们还是来了解它到底在干啥好事? function StochFast( Bar: integer; Period: Integer ): float; begin Result := GetSeriesValue( Bar, StochFastSeries( Period ) ); end; 其实整个函式就只有一条使用了GetSeriesValue函式。查表: GetSeriesValue( Bar: integer; Series: integer ): float; 它的功能就是从一个系列变量中取回指定位置的变量内容。所以我们可以用这个函式取得某一天的KD快线数据;在此我们取得的对像就是我们上头第一个函式StochFast的内容。GetSeriesValue的相对函式就是SetSeriesValue,把数据丢到系列变量的指定位置上,在上头的函式我们会利用到。 现在看到我们的函式主体,StochFastSeries部份。 function StochFastSeries( Period: Integer ): integer; Begin End; 这部份构成我们的主体,括符内的Period:Integer就是我们精灵一开头时我们设定的外部输入整数变量,这里代表设定KD的计算天数。所有的函式表达式将被MATCH_ word word文档格式规范word作业纸小票打印word模板word简历模板免费word简历 _1715014623300_1在Begin跟End的范围。3到5行是一连串的使用变量宣告,这些大家应该不会有问题吧? 第7行sName := ‘StochFast(’ + IntToStr( Period ) + ‘)’; 这是一个字符串的计算式,它的结果会是sName等于StochFast(9)。这里又碰到一个陌生的字符串处理函式「IntToStr」,望文生义它是一个「Integer to String」整数转换为字符串的函式。我们不能把不同性质的东西拿来相互计算,Period在这里是个数字我们必须先把它转换成字符串才能拿来跟其它字符串在一起。查表: IntToStr( Value: integer ): string; 当然也有把字符串变成整数的StrToInt;或者是FloatToStr把带小数点的数字转换为字符串的函式。 第8行Result := FindNamedSeries( sName ); 使用了FindNameSeries函式查表: FindNamedSeries( SeriesName: string ): integer; 这个函式将询问系统是否有StochFast(9)名称的系列变量已经被建立使用?如果有将响应0,没有为-1。 第9行与第10为if Result >= 0 then Exit; 如果FindNameSeries响应为0或大于0(非-1)代表这个名称已经被使用,Exit将直接中断函式执行,以下所有的表达式都不会再被执行,直接拍屁屁走人。 第11行Result := CreateNamedSeries( sName ); 排除掉可能的名称冲突之后可以顺利的宣告并建立我们的StochFast(9)系列变量。我们使用CreateNameSeries函式来建立查表: CreateNamedSeries( SeriesName: string ): integer; CreateNameSeries将会建立一个空白的系列变量供我们放置KD的快线数据使用。另外有一个CreatSeries函式也是可以建立系列变量,两者唯一差别就在是否有对该变量命名。 12行的for循环: for Bar := Period to BarCount() – 1 do Begin End; 这段for循环将会一天一天的带着我们计算KD快线。给for的变量为Bar范围落在参数天数开始到最后一天。这里有些要说明的是BarCount是一个函式,它会响应所有的数据天数;问题在它老兄为什么要减1呢?故事是这样的啦!我们在计算机的世界里第一笔不是我们习惯的1而是从0起算的,所以第一天或第一笔的数据是存在内存的第0笔,而最近或最后一笔就自然是BarCount -1啦。所以我们的Period如果下的是第9天,事实上我们是从第10天的数据开始计算的。 第14行{ Calculate your indicator value here } ,我们之前有提过这是精灵建议我们从这里开始写我们的表达式的批注。 第15行Value := 0; 这里的Value将是我们最终的运算结果,将它填入换掉0。这个Value就如我们在EasyLanguage写函式最终也要Return回一个数值一样,在EasyLanguage我们如果函式名称为Function ABC,最后我们一定会写上 ABC = XXX; 道理是一样的。这里我们使用Value这个变量先来暂放结果。 第16行 SetSeriesValue( Bar, Result, Value ); 呼叫SetSeriesValue函式把结果的Value变量丢入我们的指定位置(Bar)置放。查表: SetSeriesValue( Bar: integer; Series: integer; Value: float ); 我们之前有提过它的亲戚相对的GetSeriesValue函式。 好啦!今天假日兼手酸了!就先谈完精灵的样板部份休息啰~ 第六章 这几天大家应该把样板搞清楚了吧?如果还不是,请不要继续读下去;不然你会更痛苦。但是一旦你弄清楚了,那么我增加的程序代码你就不会觉得看起来很累了。我们StochFast函式部份完成后如下:     KD的计算 公式 小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载 请自己去查书,我已经写的会做恶梦了!饶了我吧!我在第5行多加了一些浮点变量,这都是以下计算会用到的。增加的程序代码我依精灵的建议全部写在它标示的绿色指示位置以下,也就是在主要的for循环里头。 第15行 if Bar = Period then TodayK := 50; 利用 if then 判断式,我们给第一天的%K数据设定为50。由于 if 判断后我们只要执行一件工作,所以不必使用 begin ~ end; 来包含,但是16行的 if 之后必须做一堆计算,所以必须使用 begin ~ end; 来标示范围。 第16行 if Bar > Period then 当进行到大于设定天数以后的日子那时我们便要进行18行到22行间的算式,以求得%K。 第18行 HighP := Highest(Bar, #High, Period); 我们呼叫WealthScript内部函式Highest来求得设定天数内价格范围的最高价;查表: Highest( Bar: integer; Series: integer; Period: integer ): float; Highest函式回传一个浮点数值,代入的参数为以Bar为准往前Period天或个数的Series系列数的最高数据。所以你如果给它#Close,它回的是几天内最高的收盘价。在此我们要的是指定天数内最高的每日高价 Highest #High。 第19行 LowP := Lowest(Bar, #Low, Period); 我们使用Highest的相对函式Lowest来求得最低的低价。Lowest 使用方式与参数设定同于Highest。 第20行 CloseP := GetSeriesValue(Bar, #Close); 得到今日的收盘。 第21行 Stoch := (CloseP – LowP) / (HighP – LowP) * 100; 这是计算不成熟随机值(RSV)。 第22行 TodayK := (Stoch / 3) + (LastK *2 / 3); 钝化RSV后我们便可求得今天的%K。至此、我们已经完成主要的运算得到本日的%K。 第24行 LastK := TodayK; 我们将今天的%K复制一份到LastK变量位置,这个LastK是记录前一天的%D。当我们程序进入到下一个 for 循环时,它就变成前一天的%K了。 第25行 Value := TodayK; 把样板的 Value := 0; 改成我们要回传的数据。当然你要是把这行去掉,直接把第26行改成SetSeriesValue( Bar, Result, TodayK );结果是相同的。到这里计算%K的函式就完成啰!没问题的话就把它存档:     这些ChartScript会存放到那里去呢?在左边的主功能选单我们点选「ChartScript」的图示:     WealthScript所有的程序代码都放到这个地方管理。你会看到很多分类如不同形态的交易方式的交易程序;其中Indicators目录就是存放指针函式的地方。未来你如果有需要的时候,找到你要修改的指标然后按右键,选择选单里的「Open」就可以再把它叫出来编辑了。     除此之外,我们也可以发现在左边主选单的「Indicators」里发现惊喜,我们刚完成的指标StochFast已经被排入并可以方便的从这里使用它了!     再来看下一个%D的部份:     基本上这个StochSlow的%D是直接在StochFast加上几行程序代码完成的,因为%D就是再钝化一次的%K值。本来这个%D应该可以用精简一点的算法完成的,就是直接呼叫StochFast 得到我们的%K。         图打出来后应该会像这样子!这样的KD我看起来比较顺眼。函式与指标的设计就到此,下次我们要往前推进到程序交易的设计部份。 第七章 为什么节日除了吃以外就不知道要干什么了?我在圣诞夜写这些东西是想从手上消耗多少卡路里?谁叫欧元成交量今天瞬间消失无踪,不过那万多口代表还是有许多苦命人与无聊人留连在市场。 不是我又偷懒迟不上续集,实在是伤脑筋在想如何安排这几章;因为交易系统的设计应该是大家使用Wealth-Lab最期待与最兴奋的部份吧?这也是WL最精华的部份,希望大家都能一次了解并容易上手。最后决定还是在第一篇里来个勤前教育,解释一下WL在交易系统中一些常用的交易指令使用。然后我将介绍实际的两个交易系统例子,最后介绍交易系统设计精灵与交易规则产生器。 这次把进度先说出来是希望大家多点耐心慢慢看下去,不要冲动一直想一天搞懂!如果你是没办法按住性子的人;那也请你有问题自己尝试解决,不要把问题直接丢到Blog上来,我看了实在很头大!我借用这里再重说一件事;我不是免费Mr. Q&A,不要一遇问题就丢上来,我会一直把它晾在那里!对不起我没有义务为你的天马行空解决问题。我说过我很懒,打字对我是宝贵的时间,让我多写一些对大家有意义的东西。但是我欢迎你针对说过的课程有不解的提出问题,或者你发现我陈述错误或有待加强的地方,我真心的期望你提供给我意见。 我们设计一个交易系统大概有几个步骤;第一计算使用的技术指标、第二设定进出场的交易条件与规则、第三就是由系统发出适当的交易指令进场交易。这章我们要来专谈第三项的交易指令部份!以往、我们总使用单纯的几个Buy、Sell指令走江湖,我要说那个时代已经结束了!不要以为又是WL在整人,T.S 2000i以后的交易指令也做了许多修正,所以我们要好好的来做一次澈底的认识与了解。 做多进场 Entering Long BuyAtClose 收盘价买进 BuyAtLimit 限价买进 BuyAtMarket 市价买进 BuyAtStop 触价转市价买进 进场做空 Entering Short ShortAtClose 收盘价卖出 ShortAtLimit 限价卖出 ShortAtMarket 市价卖出 ShortAtStop 触价转市价卖出 做多平仓 Exiting Long Positions SellAtClose 收盘价卖出平仓 SellAtLimit 限价卖出平仓 SellAtMarket 市价卖出平仓 SellAtStop 触价转市价卖出平仓 做空平仓 Exiting Short Positions CoverAtClose 收盘价买进平仓 CoverAtLimit 限价买进平仓 CoverAtMarket 市价买进平仓 CoverAtStop 触价转市价买进平仓 以上就是我们可以利用的交易指令。现在看到了Buy、Sell的意义完全不同对不对?Buy与 Sell被使用在多仓上面,一为多头进场(Buy)、一为多头平仓(Sell)。而做空进场则使用Short,空仓平仓则称Cover。这四个主要分类可是界线分明的,不要再以为Buy了就Sell;到时就会自己平仓又建立新仓。 个别说明如下: BuyAtClose( Bar: integer; SignalName: string ): boolean; ShortAtClose( Bar: integer; SignalName: string ): boolean; 指令(讯号产生的数据位置;自行对讯号命名):回应布尔值; 一个从T.S 2000i或其它交易系统设计以来的问题,这个指令应该是唯一最接近讯号产生当下的了。不要再希望「提早一天」出讯号,硬是要其它指令也可以当天发出。一般说来收盘价交易可使用Bar(当天),其它则是Bar+1天的指令执行。其中SignaName的自行对讯号命名部份,别忘了字符串必须使用’’标示起来。 SellAtClose(Bar: integer; Position: integer; SignalName: string ); CoverAtClose( Bar: integer; Position: integer; SignalName: string ); 指令(讯号产生的数据位置;部位句柄;自行对讯号命名); 这里比较不同要说明的是Position部位句柄;这是可以达到「指定平仓」的功能。也就是说你可能在不同讯号下建立许多空单,而每一次进场WL都会给一个部位句柄(从0到PositionCount – 1),所以你可以使用部位句柄来达成特定的仓位先行平仓,而不必遵守先进先出的一些原则。对于多重仓位如果想一次全部平仓的话,使用#ALL常数代入即可。如果你不是上列说的多重仓位而是单一仓位,使用LastPosition(最近交易部位部位句柄等于PositionCount-1)函式便可。基本上WL也没有严格到壁垒分明的程度,这两个指令都可以对多或空进行平仓动作,最主要还是取决Position参数的运用。 BuyAtLimit(Bar: integer; LimitPrice: float; SignalName: string ): boolean; ShortAtLimit(Bar: integer; LimitPrice: float; SignalName: string ): boolean; 指令(讯号产生的数据位置;设定进场价;自行对讯号命名):回应布尔值; 这里不同的是多了一个LimitPrice的设价参数。WL内定为点价或穿价成交。 SellAtLimit(Bar: integer; LimitPrice: float; Position: integer; SignalName: string ): boolean; CoverAtLimit( Bar: integer; LimitPrice: float; Position: integer; SignalName: string ): boolean; 指令(讯号产生的数据位置;设定进场价;部位句柄;自行对讯号命名):回应布尔值; 平仓指令多的就是部位句柄。同样的这两组指令也都可以对任何方向部位进行平仓,取决于Position参数。但是我建议养成好习惯对自己以后维护程序时会比较好一些,不然到时自己看到错乱也只能怪怪自己啰! BuyAtMarket( Bar: integer; SignalName: string ): boolean; ShortAtMarket( Bar: integer; SignalName: string ): boolean; 指令(讯号产生的数据位置;自行对讯号命名):回应布尔值; 理论上这是一定成交不可取消的指令,那什么时候会响应无法成交呢?呵呵~当然就是你子弹用罄没钱的时候啦! SellAtMarket(Bar: integer; Position: integer; SignalName: string ); CoverAtMarket(Bar: integer; Position: integer; SignalName: string ); 指令(讯号产生的数据位置;部位句柄;自行对讯号命名); 同样的多一个Position参数而已,平仓的东西就不会有不成交的可能发生啦!同样多空仓位两相宜。 BuyAtStop(Bar: integer; StopPrice: float; SignalName: string ): boolean; ShortAtStop(Bar: integer; StopPrice: float; SignalName: string ): boolean; 指令(讯号产生的数据位置;设定触发价;自行对讯号命名):回应布尔值; StopPrice设定触发转市价交易的价格 SellAtStop(Bar: integer; StopPri
本文档为【Wealth-Lab中文快速教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_548461
暂无简介~
格式:doc
大小:3MB
软件:Word
页数:57
分类:金融/投资/证券
上传时间:2013-07-30
浏览量:150