转载:Wealth-Lab Pro 【特区】

Discussion in 'Wealth-Lab Developer' started by YAHN, Dec 15, 2008.

  1. 来源网址:
    http://blog.xuite.net/parkson/trader?st=c&w=867499

    欢迎进入 Wealth-Lab Pro 特区

    我可从来不喜欢动不动就追逐新的工具,我喜欢多花点时间去深入了解一个工具来让它更顺手。但是,这世间总是偶尔会发生形势比人强的事。

    在计算机日新月异的发展上头,我们从来就没办法希望它停一停脚步;但是它不止不停的向前迈步,也不让你有缅怀过去的可能。曾几何时、风光面市的TS2000i,已然成为OMEGA公司的过气商品。特别是在该公司从NASDAQ改变营运形态成为在线券商之后,虽然TS仍然持续发展到第八版,但却着重对开户顾客的功能服务,零售软件不再当成主力推动。公司也肯定的告诉TS2000i的使用者,服务照常但他们不再对该程序更新。对使用者而言更大的杀伤力来自另一个说法;TS2000i对新一代操作系统微软Vista有兼容上的问题!这件事至写文时我自己没有真正证实,不过我想可能性是蛮高的;因为我自己的图形分析软件在移植.NET时就遇到许多兼容性问题。

    不管你喜不喜欢接不接受,你还是必须面对它!但扫瞄一下目前的市场有谁可以取代我们用惯的TS2000i老友呢?呵!不查还好、一查才发现同质软件现在还真可以用百家争鸣来形容。许多分析软件这几年把TS2000i当成假想敌,使用一些IF来IF去的条件式系统设计方式,早已不能满足想自主性越来越高,高到想飞的使用者。

    大堆头的软件比如找来Larry Williams推荐的Genesis Trade Navigator;全功能白金版约在美金2500元,跟TS有拼喔!他们甚至宣称跟他们的开发语法相比,TS的EasyLanguage根本可以更名为Hard Language;当然我没用过不知是否如此,但可以知道Easy Language也蛮叫外国人头大的。

    另一个在这几年在交易系统设计市场也蛮受欢迎便宜又好的AmiBroker;最高级的专业版本售价只要美金229元,几乎是TS十分之一的价格。那我们为什么不采用这套来使用与介绍呢?因为我希望介绍一套无痛转换的软件,不要再从头来过!我受不了不停的浪费生命在适应新的计算机事物,真的是在浪费生命。TS的EasyLanguage使用的是以Pascal语法为主设计出的;而这套AmiBroker语法的基础却是来自C语言,这下有要鸡飞狗跳的从头介绍起,你不烦我是非常烦的。

    找来找去我决定来介绍这套Wealth-Lab;这是由富达基金所发行的,除供该公司客户交易协助外也对外销售,美加以外区域客户售价为美金650元为Wealth-Lab 4.0 Pro。Wealth_Lab的语法基础同TS是源自非常口语化的Pascal,所以如果你是TS使用者的话几乎不需再投资时间学习,很快即可上手。

    Wealth-Lab有完善的与其他用户沟通的社群功能,在程序代码发表与使用问题心得交流上非常方便。社群另一个对懒惰的家伙如我者提供贴心的新程序代码下载功能,省了你Key-In的时间。不过我仍循TS2000i的介绍方式,不打算从头一步步介绍起,这些事情软件的Help文件已经把工作都做得很好了!节省我些时间搞不好我会跟着介绍AmiBroker也说不定喔(知道说不定的意思喔)?

    准备开动Wealth-Lab的引擎吧!让我们进入Wealth-Lab特区冒险去!
     
    Last edited by a moderator: Dec 16, 2008
  2. Wealth-Lab 特区【1】

    Wealth-Lab 特区【1】 

    本来计划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」来建立新数据源。建立新数据源你会看到这样的画面:

    这里头有许多的选项;其中第一个是网络免费数据源的设定,也就是上Yahoo与MSN取得需要的历史数据。这个「表面」看起来的好东西,真叫我屡试「不爽」,我想Wealth-Lab里头对一些Yahoo数据库下载设定出了点问题,而这问题可能是因为Yahoo的取得方式或格式在最近做了变动。我这么想啦!Yahoo可能对太多软件对他们的数据库「用免惊」的又没广告效益有意见。但这纯粹是我猜的,如果你可以在这功能正常的下载数据请告诉我吧!

    如果这个功能可以顺利使用,那对追踪多种商品或股票的朋友就方便多了。因为每天的数据可以让Wealth-Lab自己帮你去Yahoo网站更新。这些下载的档案被Wealth-Lab另存成属性为「WL」的二进制文件,它有点像我们台湾「齐柏林」使用的格式,前导4个实数字元记录数据笔数,之后是每一个记录文件(28位一个记录长度)6笔数据的随机文件格式。如果自己有能力写转文件程序的人,这个详细个格式你可以在公司网页找到,我们在此不再做深入介绍。

    我就是直接选择第四项设定「MetaStock Files」便可!可是还是对Yahoo资料心有不甘,不然一堆人怎么玩呢?于是我脑筋就动到第三项的「ASCII Files」文本文件上头来!
     
  3. Wealth-Lab 特区【4】

    Wealth-Lab 特区【4】 WealthScript Language


    本来一直想要如何用不同的方式来介绍这一章,看来还是乖乖的按照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 10^38;一些我们的每日数据(开高低收)在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。

    以上仅列举常会遇到或使用的系统默认常数。今天先谈到这里吧!
     
  4. Wealth-Lab 特区【5】

    Wealth-Lab 特区【5】

    我们上了一些基本课程后,来一趟探险之旅吧!我一直相信「玩」是最快的学习方法,不然你就算背了上一章你都不知道为什么背它;可是、当你再看完这一章后,我相信你不须要背就知道上一章谈的东西怎么运用了。

    到今天未接续往下讨论之前,我们已经知道了两件事;一是如何利用Yahoo建立我们自己的金融商品数据库,二是我们已经可以在Wealth-Lab上头显示我们所须要的价格图,以K线或柱状图。现在我们来看看我们还能深入去做些什么?我们的图是否有点单调呢?对啦我们是应该显示个指针来玩玩。
     
  5. 首先我们点选左手边的分类功能选单,选取「Indicators」如图示A。我们会看到一个以字母顺序排列的指针列表,下拉到RSI的位置并点选如图标B。这时你有两个选择;一是点选上方的「Plot」图像如图标C,或者你用拉放的功能把RSI直接拉到你的图上。图标D是显示程序代码呆会我们会介绍。
     
  6. 我们会发现跳出了像上头的对话窗口。「Drawing Style」作图的风格;设定包括要用啥线条环肥燕瘦任君挑选,颜色及你要把RSI安置在那一个框框里(Pane);目前有三个可以让你选,你可以拉下选单看到Price Pane价格图框、Volume Pane成交量图框与新生成的RSIPane。

    接下来「Parameters」指标参数设定。你一拉下选单就会发现上一章的「价格序列常数」几乎都在里头,如果没有特殊需求的话我们还是选择「#Close」收盘价来运算。最后一个设定天数,我习惯用9天然后没问题的话点「OK」吧!如果你的Wealth-Lab罢工不显示或跑出一些鸟意见的话,单击键盘的「F5」或你代号旁边的绿色「GO」键,如下图示A。
     
  7. 看到我们要的RSI了吗?它跑到最上方显示,有些人比较习惯看它在下方对吧?怎么办呢?继续谈下去!我们点进去程序编辑器「Editor」,目前看到的仍是我们上一章所看到的那几行交易程序代码的样板。Wealth-Lab事实上是把这些程序代码隐藏起来的,为了阅读或设计时可以画面简洁点吧?我们可以使用第一张图标的D功能,点选它!

    这个询问窗口会提示你将把指标程序代码弄到编辑器,之后你不能再以鼠标对此做控制,没问题就YES吧!随后你便可以在编辑器里看到RSI指针的程序代码显示出来了。
     
  8. 第16行到第20行便是我们显示RSI的部份,第一次我便逐行来讨论它。

    var RSIPane: integer; 设定整数形态变量名为RSIPane。这是为了接收图框系统分配的句柄所以它是整数。

    RSIPane := CreatePane( 75, true, true ); 我们呼叫CreatPane函式(Function)这是由字面便知是建立图框的功能函式,查表我们得到:

    CreatePane( Height, AbovePrices, ShowGrid ): integer; 读成:

    函式CreatePane代入参数(设定图高,位于价格图之上,显示价位标线)回传值整数。
     
  9. 这下子忽然间有好多东西可以玩了!我们先把这行的AbovePrices从true给它改成「false」如:RSIPane := CreatePane( 75, false, true ); 然后我们再按一次键盘「F5」或那颗绿色「GO」,现在再看一次「Chart」有啥不同?

    呵呵!我们的RSI乖乖的滚到最下面来啰!RSI部份还有许多好玩的,不过其他的等我们介绍完其他行程序再来玩吧。
     
  10. 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。
     
  11. PlotSeriesLabel( RSI1, RSIPane, 009, #Thin, 'RSI1=RSI(#Close,9)' ); 最后这个函式是显示上图标示的所谓「标签」功能。查表:

    PlotSeriesLabel(Series: integer; Pane: integer; Color: integer; Style: integer; Label: string ); 虽然我们习惯通称为函式,其实这是一个「程序」而非「函式」。差别就在于它没有回传值。

    这4行都没问题吧?我们再回头来玩我们的RSI,把它改良的更合乎我们的习惯用法。我们把程序改成了:
     
  12. 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,今天就先玩到此吧!
     
  13. Wealth-Lab 特区【6】



    上回我们把RSI指标调整到我们希望的样子,那、、要是像KD指针要怎么显示呢?简单呀!找到KD把它拉过来便是啰。KD的正式名称叫「随机指标」Stochastic,可是并没有这项呀!我们只能看到「StocK」与「StocD」。看来在指标区里的东西比较像是乐高积木而不像完成品,我们只好堆积木啦。我们先把StocK(%K)抓过来:
     
  14. 没问题按OK,我们会先看到%K被显示出来了。
     
  15. 过来我们再拉放StocD(%D)过来。
     
  16. 没忘了把颜色设成不同,以免混淆。还有就是这个范例我要强调的部份;我们是要把它放在同一个图框位置(Pane)这样我们才可以一起显示KD两条线。
     
  17. 了解啦?这就是显示双线指针的方法。最后我们像RSI一样把KD加料一下,让它变得合乎我们的阅读习惯。
     
  18. 111111111111111
     
  19. 非常好的学习资料,可惜网址打不开
     
  20. 修改完按「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)。可是问题又来!我们又找不到这个指标函式,怎么办?没怎么办,自己写呀!